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

举报
AI浩 发表于 2023/01/30 06:46:07 2023/01/30
【摘要】 @[toc] 摘要余弦相似度是判断两个向量相似度常用的算法,我在做行人重识别的时候,用到了余弦相似度的算法,记录一下。 基本概念余弦相似度算法:一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近1,夹角趋于0,表明两个向量越相似,余弦值接近于0,夹角趋于90度,表明两个向量越不相似。总之,相似度越小,距离越大。相似度越大,距离越小。 数学原理所以余弦的计算公式如下...

@[toc]

摘要

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

基本概念

余弦相似度算法:一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近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}

a,b,c 是三个边的长度。

在直角坐标系中,向量表示的三角形的余弦函数是怎么样的呢?下图中向量a用坐标(x1,y1)表示,向量b用坐标(x2,y2)表示。

向量 a \mathrm{a} 和向量 b \mathrm{b} 在直角坐标中的长度为 c = x 1 2 + y 1 2 { c}=\sqrt{x_{1}^{2}+y_{1}^{2}} , b = x 2 2 + y 2 2 b=\sqrt{x_{2}^{2}+y_{2}^{2}} , 向量 a \mathrm{a} 和向量 b \mathrm{b} 之间的距离我们用向量 c \mathrm{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}} , 将 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}

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

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}

实现代码

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。