这一段时间再做一个相关的东西,说一下我的理解。
假设二维空间两个点, A(x1,y1),B(x2,y2)A(x_1, y_1),B(x_2,y_2)
然后归一化为单位向量, A(x1x12+y12,y1x12+y12),B(x2x22+y22,y2x22+y22)A(\frac{x_1}{\sqrt{x_1^2+y_1^2}},\frac{y_1}{\sqrt{x_1^2+y_1^2}}),B(\frac{x_2}{\sqrt{x_2^2+y_2^2}},\frac{y_2}{\sqrt{x_2^2+y_2^2}})
那么余弦相似度就是: cos=x1x12+y12×x2x22+y22+y1x12+y12×y2x22+y22cos=\frac{x_1}{\sqrt{x_1^2+y_1^2}}\times\frac{x_2}{\sqrt{x_2^2+y_2^2}}+\frac{y_1}{\sqrt{x_1^2+y_1^2}}\times\frac{y_2}{\sqrt{x_2^2+y_2^2}} (分母是1,省略了)
欧式距离就是: euc=(x1x12+y12−x2x22+y22)2+(y1x12+y12−y2x22+y22)2euc=\sqrt{(\frac{x_1}{\sqrt{x_1^2+y_1^2}}-\frac{x_2}{\sqrt{x_2^2+y_2^2}})^2+(\frac{y_1}{\sqrt{x_1^2+y_1^2}}-\frac{y_2}{\sqrt{x_2^2+y_2^2}})^2}
化简后就是: euc=2−2×coseuc=\sqrt{2-2\times cos}
很明显,是一个单调函数(图像类似于单位元的第一象限部分),也就意味着,两者在归一化为单位向量的时候计算相似度结果完全一样。只不过余弦相似度是值越大月相似,欧式距离是值越小越相似。
二维空间上如此,高维空间上呢?答案是类似的。不写过程了,我举个做过的项目的例子。
我用doc2vec 的方式生成文档的向量,向量归一化后,分别用余弦相似度和欧式距离计算内容相似文章topk,结果完全相同(数量大概在10万篇),所以我的看法是,这两个东西完全等价(前提是归一化)。
但是话说回来,为什么把余弦相似度转换为求欧式距离,这么转换有什么好处呢?
根据上述例子,如果我根据余弦相似度计算相似doc时,需要两两比较,也就是 O(n2)O(n^2) 的操作。通常这种比较不能全量比较,可以借助于simhash 的思想,减少搜索空间。但是缺点是存在误差。
但是转为求欧式距离呢,就可以上一个非常屌的数据结构,叫KDTree,至于复杂度降低多少,自己感受。
另外多说一句,KDTree查询过程中涉及回溯操作,所以对高维度向量并不友好,通常word2vec生成200维向量,用kdtree的效率不会高,这时候应该用BallTree。
实践过程中的一点小经验,有错误请指正。
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。
发表评论