相似度计算——余弦相似度

余弦相似度介绍

余弦相似度是利用两个向量之间的夹角的余弦值来衡量两个向量之间的相似度,这个值的范围在-1到1之间。

余弦相似度越接近1,表示两个向量之间的夹角越小,即越相似;而越接近-1,表示两个向量之间的夹角越大,即越不相似。

两个向量的夹角示例图如下:

余弦相似度的计算公式

向量的余弦相似度计算公式

a,b为两个向量,余弦距离计算公式为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> cos ⁡ θ = a ⃗ ⋅ b ⃗ ∣ a ⃗ ∣ ⋅ ∣ b ⃗ ∣ \cos \theta = \frac{\vec{a} \cdot \vec{b} }{\left | \vec{a} \right | \cdot \left | \vec{b} \right |} </math>cosθ=∣a ∣⋅∣ ∣b ∣ ∣a ⋅b

  • 分子为向量a与向量b的内积,分母为向量a的模乘以向量b的模。
  • 向量模(即向量的长度)计算方法如下:

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x ⃗ = ( x 1 , x 2 , . . . x n ) \vec{x}=(x_1,x_2,...x_n) </math>x =(x1,x2,...xn)
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ∣ x ⃗ ∣ = x 1 2 + x 2 2 + . . . + x n 2 \left | \vec{x} \right |=\sqrt{x_1^2+x_2^2+...+x_n^2} </math>∣x ∣=x12+x22+...+xn2

n维向量的余弦相似度计算

在 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n维空间中,对于向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> A = ( a 1 , a 2 , . . . , a n ) A=(a_1,a_2,...,a_n) </math>A=(a1,a2,...,an), <math xmlns="http://www.w3.org/1998/Math/MathML"> B = ( b 1 , b 2 , . . . , b n ) B=(b_1,b_2,...,b_n) </math>B=(b1,b2,...,bn),计算其余弦值的公式为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> cos ⁡ θ = ∑ 1 n ( a i ⋅ b i ) ∑ 1 n a i 2 ⋅ ∑ 1 n b i 2 \cos \theta = \frac{\sum_{1}^{n}(a_i\cdot b_i) }{\sqrt{\sum_{1}^{n}a_i^2}\cdot \sqrt{\sum_{1}^{n}b_i^2}} </math>cosθ=∑1nai2 ⋅∑1nbi2 ∑1n(ai⋅bi)

余弦相似度的取值范围为[-1,1],越接近于1表示相似度越高。

余弦相似度计算的示例代码

用Python实现余弦相似度计算时,我们可以使用NumPy库来计算余弦相似度,示例代码如下:

python 复制代码
import numpy as np

def cosine_similarity(A, B):
    dot_product = np.dot(A, B)
    norm_A = np.linalg.norm(A)
    norm_B = np.linalg.norm(B)
    cosine_sim = dot_product / (norm_A * norm_B)
    return cosine_sim

vector1 = np.array([1, 2, 3])
vector2 = np.array([4, 5, 6])
similarity = cosine_similarity(vector1, vector2)
print("余弦相似度:", similarity)
  • 补充解释:linalg.norm()是NumPy库中用于计算向量或矩阵的范数(或长度)的函数。在计算欧式距离时,可以用来计算向量之间的差异。如下实例代码计算单个向量的范数:
python 复制代码
import numpy as np

# 计算向量的范数
x = np.array([1, 2, 3])
norm_x = np.linalg.norm(x)
print(norm_x)

余弦相似度的应用

余弦相似度在相似度计算中被广泛应用在文本相似度、推荐系统、图像处理等领域。

  • 如在文本相似度计算中,可以使用余弦相似度来比较两个文档的向量表示,从而判断它们的相似程度。
  • 又如在推荐系统中,可以利用余弦相似度来计算用户对不同商品的喜好程度,进而进行商品推荐。
  • 在图像处理中,可以将图像表示为特征向量,并利用计算余弦相似度来比较图像之间的相似程度。

应用实例说明

假设我们有两篇文章A和文章B,单看整篇文章我们感觉无从下手。

那么我们从拆分的思路去想,就可以将文章拆分成词组,用这些词组组成词频向量,如此我们就可以利用余弦相似度来计算词频向量之间的相似度。

  • 如果两篇文章的余弦相似度接近1,那么它们在内容上是相似的;
  • 如果余弦相似度接近0,则它们在内容上是不相似的。

这样的相似度计算方法可以在信息检索、自然语言处理等领域得到广泛应用。

相关推荐
向前看-1 小时前
验证码机制
前端·后端
XH华2 小时前
初识C语言之二维数组(下)
c语言·算法
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_3 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子3 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
菜鸡中的奋斗鸡→挣扎鸡3 小时前
滑动窗口 + 算法复习
数据结构·算法
Lenyiin3 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码3 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
scan7244 小时前
LILAC采样算法
人工智能·算法·机器学习