> 文档中心 > 计算两个向量的余弦相似度

计算两个向量的余弦相似度

文章目录

  • 摘要
  • 基本概念
  • 数学原理
  • 实现代码
  • 欧式距离余弦距离的差异

摘要

余弦相似度是判断两个向量相似度常用的算法,我在做行人重识别的时候,用到了余弦相似度的算法,记录一下。

基本概念

余弦相似度算法:一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近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+b2c2
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=(x2x1)2+(y2y1)2 , 将 a , b , c 带入三角函数的公式中得到如下的公式:
cos ⁡ ( θ ) = a 2 + b 2 − c 22 a b = x 1 2 + y 1 2 + x 2 2 + y 2 2 − ( x 2 − x 1 ) 2 − ( y 2 − y 1 ) 22 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+b2c2=2x12+y12x22+y22x12+y12+x22+y22(x2x1)2(y2y1)2=x12+y12x22+y22x1x2+y1y2

计算两个向量的余弦相似度 在多维向量中,余弦的这种计算方法也成立。假定 A 和 B 是两个 n 维向量, A 是 $[A 1 , A 2 , \ldots, A n]$ , B 是 $[B 1 , B 2 ,.., B n]$ , 则 A 与的夹角 \theta 的余弦等于:

cos ⁡ θ = ∑i=1 n (Ai ×Bi ) ∑ i = 1n ( A i )2× ∑ i = 1n ( 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×BAB

实现代码

import numpy as npdef 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 cosloadData_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.欧式距离体现的是距离上的绝对差异,余弦距离体现的是方向上的相对差异。