推导余弦距离和欧式距离的关系
最近看到公式就头疼,深深感受到数学不好就意味着被降维打击。。
在Deep Learning里,因为操作的对象是高维向量,所以很多paper里的公式都喜欢用矩阵乘来表达公式,这样的优点是公式表达更简洁(一个矩阵乘同时包含了乘法和加法),缺点就是菜的人可能一时半会反应不过来,比如说我!
假设有两个 n n n 维向量 x , y x,y x,y , x = ( x 1 , x 2 , . . . , x n ) , y = ( y 1 , y 2 , . . . , y n ) x=(x_1, x_2, ..., x _n), y=(y_1, y_2, ..., y _n) x=(x1,x2,...,xn),y=(y1,y2,...,yn)
欧式距离
欧式距离就是所谓的向量的二范式,论文里通常是这么写的 ℓ 2 ( x , y ) = ∥ x − y ∥ 2 ell_{2}(mathbf{x}, mathbf{y})=|mathbf{x}-mathbf{y}|_{2} ℓ2(x,y)=∥x−y∥2,相比欧式距离,我感觉人们更喜欢用范式来表达(可能是因为范式更抽象?)
对范式不太清楚的同学可以看这篇文章
欧式距离计算公式为: d = ∑ i = 1 N ( x i − y i ) 2 d=sqrt{sum_{i=1}^{N}left(x_{i}-y_{i} ight)^{2}} d=i=1∑N(xi−yi)2
因为这个公式太常用了,论文里一般不会写,可能就直接写 ℓ 2 ell_{2} ℓ2
余弦距离
余弦相似度经常被用来衡量两个向量的相似度,计算公式为: cos ( x , y ) = x ⋅ y ∥ x ∥ 2 ∥ y ∥ 2 cos (x, y)=frac{x cdot y}{|x|_{2} |y|_{2}} cos(x,y)=∥x∥2∥y∥2x⋅y我们把 1 − cos ( x , y ) 1- cos (x, y) 1−cos(x,y)称为余弦距离,取值范围[0,2]
另外,对于一些运算: 向量点积: x ⋅ y = x T y x cdot y = x^T y x⋅y=xTy 向量距离平方: ℓ 2 = ∥ x ∥ 2 2 = x T x ell^{2}=|x|_2^2=x^Tx ℓ2=∥x∥22=xTx
关系
欧氏距离是计算空间中两个点的直线距离,所以它受不同维度上数值尺度的影响比较大,而余弦距离则是计算两者在空间中方向上的差异,它包含的信息更多,而且更稳定,用哪一个看具体场景,不过我感觉用余弦的更多一些。
有时候,为了消除不同维度数值尺度差异的影响或者让收敛更加的平滑,我们会对向量进行单位化(长度归一化),也就是: x = x ∣ ∣ x ∣ ∣ 2 x=frac {x}{||x||_2} x=∣∣x∣∣2x 在这种情况下,欧式距离和余弦距离本质上是等价的,他们的单调性相同,证明如下
经过长度归一化后,有: ∥ x ∥ 2 = ∥ y ∥ 2 = 1 |mathbf{x}|_{2}=|mathbf{y}|_{2}=1 ∥x∥2=∥y∥2=1于是: d 2 = ∥ x − y ∥ 2 2 = ( x − y ) ⊤ ( x − y ) = x ⊤ x − 2 x ⊤ y + y ⊤ y = 2 − 2 x ⊤ y = 2 − 2 cos ( x , y ) = 2 ( 1 − cos ( x , y ) ) egin{aligned} d^2=|mathbf{x}-mathbf{y}|_{2}^{2} &=(mathbf{x}-mathbf{y})^{ op}(mathbf{x}-mathbf{y}) \ &=mathbf{x}^{ op} mathbf{x}-2 mathbf{x}^{ op} mathbf{y}+mathbf{y}^{ op} mathbf{y} \ &=2-2 mathbf{x}^{ op} mathbf{y} \ &=2-2 cos(mathbf{x}, mathbf{y}) \ &=2(1- cos(mathbf{x}, mathbf{y})) end{aligned} d2=∥x−y∥22=(x−y)⊤(x−y)=x⊤x−2x⊤y+y⊤y=2−2x⊤y=2−2cos(x,y)=2(1−cos(x,y)) 可以看到,欧氏距离和余弦距离的单调性相同,这意味着在归一化的情况下,优化两者的效果是一样的,即等价。