前言
最近在做人脸识别,有的方法使用的是L2距离,有的是使用的cos相似度,并且看到有的论文说,欧式距离和余弦距离是等价的。到底是怎么等价的呢。这里我就来和小伙伴们一探究竟。
推倒
首先给出结论,归一化后的向量的余弦距离和欧氏距离是等价的。
公式敲起来很麻烦,这里我就不敲了,引用一位知乎答友的图。链接在这了欧氏距离和余弦相似度的区别是什么?
上面的公式可以再推一步:
e
u
c
=
2
(
1
−
c
o
s
(
A
,
B
)
)
euc=\sqrt{2(1-cos(A,B))}
euc=2(1−cos(A,B))
我们将
c
o
s
(
A
,
B
)
cos(A,B)
cos(A,B)称为余弦相似度,
1
−
c
o
s
(
A
,
B
)
1-cos(A,B)
1−cos(A,B)称为余弦距离,可以看到余弦距离和cos距离是等价的。推广到高纬空间可以得到一样的结论。
现在的人脸识别方法中,会对特征做归一化,归一化后特征的余弦距离和cos距离是等价的,所以使用哪个距离都是OK的。
为什么将余弦距离转换为欧式距离
下面的内容还是转自知乎答友,但是我不是很理解,先做一下记录,以后再去理解。毕竟不是一个方向的,我在人脸识别领域只是将欧式距离转换为余弦距离,并没有将余弦距离转换为欧式距离。
但是话说回来,为什么把余弦相似度转换为求欧式距离,这么转换有什么好处呢?根据上述例子,如果我根据余弦相似度计算相似doc时,需要两两比较,也就是 的操作。通常这种比较不能全量比较,可以借助于simhash 的思想,减少搜索空间。但是缺点是存在误差。但是转为求欧式距离呢,就可以上一个非常屌的数据结构,叫KDTree,至于复杂度降低多少,自己感受。另外多说一句,KDTree查询过程中涉及回溯操作,所以对高维度向量并不友好,通常word2vec生成200维向量,用kdtree的效率不会高,这时候应该用BallTree。
上面提到的KDTree和BallTree我都没有听说过,还得进行补充。
原文链接:欧氏距离和余弦相似度的区别是什么?