赞
踩
余弦相似度是判断两个向量相似度常用的算法,我在做行人重识别的时候,用到了余弦相似度的算法,记录一下。
余弦相似度算法:一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近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
cos
θ
=
∑
i
=
1
n
(
A
i
×
B
i
)
∑
i
=
1
n
(
A
i
)
2
×
∑
i
=
1
n
(
B
i
)
2
=
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等性质。
2.欧式距离体现的是距离上的绝对差异,余弦距离体现的是方向上的相对差异。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。