摘要
余弦相似度是判斷兩個向量相似度常用的算法,我在做行人重識別的時候,用到了余弦相似度的算法,記錄一下。
基本概念
余弦相似度算法:一個向量空間中兩個向量夾角間的余弦值作為衡量兩個個體之間差異的大小,余弦值接近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 在直角坐標中的長度為
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 之間的距離我們用向量
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?+y22??x12?+y12?+x22?+y22??(x2??x1?)2?(y2??y1?)2?=x12?+y12???x22?+y22??x1??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等性質。文章來源:http://www.zghlxwxcb.cn/news/detail-438984.html
2.歐式距離體現的是距離上的絕對差異,余弦距離體現的是方向上的相對差異。文章來源地址http://www.zghlxwxcb.cn/news/detail-438984.html
到了這里,關于計算兩個向量的余弦相似度的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!