摘要
余弦相似度是判断两个向量相似度常用的算法,我在做行人重识别的时候,用到了余弦相似度的算法,记录一下。
基本概念
余弦相似度算法:一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近1,夹角趋于0,表明两个向量越相似,余弦值接近于0,夹角趋于90度,表明两个向量越不相似。
总之,相似度越小,距离越大。相似度越大,距离越小。
数学原理
所以余弦的计算公式如下:
cos
θ
=
a
2
+
b
2
−
c
2
2
a
b
\cos \theta=\frac{a^{2}+b^{2}-c^{2}}{2 a b}
cosθ=2aba2+b2−c2
a,b,c 是三个边的长度。
在直角坐标系中,向量表示的三角形的余弦函数是怎么样的呢?下图中向量a用坐标(x1,y1)表示,向量b用坐标(x2,y2)表示。
向量
a
\mathrm{a}
a 和向量
b
\mathrm{b}
b 在直角坐标中的长度为
c
=
x
1
2
+
y
1
2
{ c}=\sqrt{x_{1}^{2}+y_{1}^{2}}
c=x12+y12,
b
=
x
2
2
+
y
2
2
b=\sqrt{x_{2}^{2}+y_{2}^{2}}
b=x22+y22 , 向量
a
\mathrm{a}
a 和向量
b
\mathrm{b}
b 之间的距离我们用向量
c
\mathrm{c}
c 表示,就是上图中的黄色直线,那么向 量 c 在直角坐标系中的长度为
c
=
(
x
2
−
x
1
)
2
+
(
y
2
−
y
1
)
2
\mathrm{c}=\sqrt{\left(x_{2}-x_{1}\right)^{2}+\left(y_{2}-y_{1}\right)^{2}}
c=(x2−x1)2+(y2−y1)2 , 将 a , b , c 带入三角函数的公式中得到如下的公式:
cos
(
θ
)
=
a
2
+
b
2
−
c
2
2
a
b
=
x
1
2
+
y
1
2
+
x
2
2
+
y
2
2
−
(
x
2
−
x
1
)
2
−
(
y
2
−
y
1
)
2
2
x
1
2
+
y
1
2
∗
x
2
2
+
y
2
2
=
x
1
∗
x
2
+
y
1
∗
y
2
x
1
2
+
y
1
2
∗
x
2
2
+
y
2
2
\begin{array}{l} \cos (\theta)=\frac{a^{2}+b^{2}-c^{2}}{2 a b}=\frac{x_{1}^{2}+y_{1}^{2}+x_{2}^{2}+y_{2}^{2}-\left(x_{2}-x_{1}\right)^{2}-\left(y_{2}-y_{1}\right)^{2}}{2 \sqrt{x_{1}^{2}+y_{1}^{2}} * \sqrt{x_{2}^{2}+y_{2}^{2}}} \\ =\frac{x_{1} * x_{2}+y_{1} * y_{2}}{\sqrt{x_{1}^{2}+y_{1}^{2}} * \sqrt{x_{2}^{2}+y_{2}^{2}}} \end{array}
cos(θ)=2aba2+b2−c2=2x12+y12∗x22+y22x12+y12+x22+y22−(x2−x1)2−(y2−y1)2=x12+y12∗x22+y22x1∗x2+y1∗y2
cos θ = ∑ i = 1 n ( A i × B i ) ∑ i = 1 n ( A i ) 2 × ∑ i = 1 n ( B i ) 2 = A ⋅ B ∣ A ∣ × ∣ B ∣ \begin{aligned} \cos \theta & =\frac{\sum_{i=1}^{n}\left(A_{i} \times B_{i}\right)}{\sqrt{\sum_{i=1}^{n}\left(A_{i}\right)^{2}} \times \sqrt{\sum_{i=1}^{n}\left(B_{i}\right)^{2}}} \\ & =\frac{A \cdot B}{|A| \times|B|} \end{aligned} cosθ=∑i=1n(Ai)2×∑i=1n(Bi)2∑i=1n(Ai×Bi)=∣A∣×∣B∣A⋅B
实现代码
import numpy as np
def cos_sim(a, b):
a_norm = np.linalg.norm(a)
b_norm = np.linalg.norm(b)
cos = np.dot(a,b)/(a_norm * b_norm)
return cos
loadData_1 = np.squeeze(np.load('0022_c6s1_002976_011.npy'))
loadData_2 = np.squeeze(np.load('0022_c6s1_002976_012.npy'))
print(cos_sim(loadData_1,loadData_2))
运行结果:0.99
欧式距离与余弦距离的差异
1.欧式距离的数值受到维度的影响,余弦相似度在高维的情况下也依然保持低维完全相同时相似度为1等性质。文章来源:https://www.toymoban.com/news/detail-438984.html
2.欧式距离体现的是距离上的绝对差异,余弦距离体现的是方向上的相对差异。文章来源地址https://www.toymoban.com/news/detail-438984.html
到了这里,关于计算两个向量的余弦相似度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!