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

余弦相似度介绍

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

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

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

余弦相似度的计算公式

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

a,b为两个向量,余弦距离计算公式为:
cos ⁡ θ = a ⃗ ⋅ b ⃗ ∣ a ⃗ ∣ ⋅ ∣ b ⃗ ∣ \cos \theta = \frac{\vec{a} \cdot \vec{b} }{\left | \vec{a} \right | \cdot \left | \vec{b} \right |} cosθ=∣a ∣⋅∣ ∣b ∣ ∣a ⋅b

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

x ⃗ = ( x 1 , x 2 , . . . x n ) \vec{x}=(x_1,x_2,...x_n) x =(x1,x2,...xn)
∣ x ⃗ ∣ = x 1 2 + x 2 2 + . . . + x n 2 \left | \vec{x} \right |=\sqrt{x_1^2+x_2^2+...+x_n^2} ∣x ∣=x12+x22+...+xn2

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

n n n维空间中,对于向量 A = ( a 1 , a 2 , . . . , a n ) A=(a_1,a_2,...,a_n) A=(a1,a2,...,an), B = ( b 1 , b 2 , . . . , b n ) B=(b_1,b_2,...,b_n) B=(b1,b2,...,bn),计算其余弦值的公式为:
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}} 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,则它们在内容上是不相似的。

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

相关推荐
骄马之死20 小时前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
Frostnova丶20 小时前
【算法笔记】数学知识
笔记·算法
吴可可12320 小时前
AutoCAD 2016与2014二次开发关键差异
算法
GoGeekBaird21 小时前
Anthropic技能"(Skills)的经验分享
后端
王码码203521 小时前
多台服务器怎么统一看状态?Beszel 轻量监控,搭起来不费事
运维·服务器·后端·安全·阿里云·接口·web
郑洁文21 小时前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
雨白21 小时前
哈希:以时间换空间的算法实战
算法
指令集梦境1 天前
Cursor + Spring Boot实战:从零写一个RESTful API
spring boot·后端·restful
San813_LDD1 天前
[数据结构]LeetCode学习
数据结构·算法·图论