当前位置: 首页 > news >正文

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

参考笔记:

https://zhuanlan.zhihu.com/p/677639498

日常学习之:如何计算两个向量或者矩阵的余弦相似度-CSDN博客

1.余弦相似度定理

百度的解释:余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间

我们都学过向量的内积公式:

a\bullet b=|a|\times|b|\times cos(\Theta) 

a:向量,可以是高维向量,例如 a = [a_1,a_2,...,a_n]

b:向量,可以是高维向量,例如 b = [b_1,b_2,...,b_n]

|a|:\sqrt{\sum_{i=1}^{n}a_i^2}

|b|:\sqrt{\sum_{i=1}^{n}b_i^2}

\Theta:a 向量与 b 向量的夹角

因此,两向量的余弦值为:

简单理解

所谓的相似是什么,假设有两个向量 AB

  • 如果 A 可以通过乘以常数来代表 B ,那么我们可以说 A,B 是高度相似,如果忽略长度,相关系数就是 1
  • 如果向量 A 只能代表向量 B 上的一部分,也就是 AB 上有投影,那么 A,B 有一定的相关性
  • 两个向量正交,意味着它们在空间中是垂直的,AB 上没有投影,两个向量没有相关性
  • 两个向量方向完全相反,即它们在空间中的方向是完全不同的,相关系数是 -1

而余弦值恰恰可以表示这种关系

  • 当两个向量在同一方向上时,夹角为 0 度,余弦值为 1 ,称为相似向量(Similar vectors).如下图中的(a)
  • (b)中 y 向量可以代表 x 向量上的一部分,所以 x,y 有一定的相似性
  • 当两个向量正交时,夹角为 90 度,余弦值为 0 ,表示两个向量在空间中垂直,没有相关性,称为正交向量(Orthogonal Vectors). 如下图中的(c)
  • 当两个向量在完全相反的方向上时,夹角为 180 度,余弦值为 -1,表示负相关,称为相反向量(Opposite Vectors). 如下图中的(d)

2.误区解读

余弦相似度衡量的是两个向量在方向上的相似性,而非长度或绝对位置。其取值范围是【-1,1】,其具体含义需要结合方向性应用场景来理解

可能存在的一个误区是,很多人认为相似性必须是非负的,但实际上余弦相似度的负值同样包含信息。例如,在推荐系统中,负相似度可能表示用户喜好的对立面(后面会举例子),这对推荐也是有意义的

2.1 通常情况下的理解

  • 当 \color{red}cos(\Theta) 介于 [0, 1]:表示两向量方向相近(夹角在 0 到 90 之间)。例如:

    • 0.8:高度相似(方向接近一致)

    • 0.3:低度相似(方向部分相关)

  • 当 \color{red}cos(\Theta) 介于 [-1, 0]:表示两向量方向相反(夹角在 90 到 180 之间)。例如:

    • -0.5:方向相反,但有一定程度的反向相关性

    • -0.9:高度反向相关(接近完全相反方向)

负值是否表示“相似”?
取决于具体场景!在多数应用中(如文本相似性、推荐系统),相似性更关注方向是否一致(正值),负值可能表示“对立”或“不相关”

2.2 实际应用中的处理

(1)推荐系统

  • 负值的意义:用户 A 喜欢的商品与用户 B 讨厌的商品可能有负相似度,可用于避免推荐

  • 示例

    • 用户 A 的向量:[1, 0.5, 0.3](喜欢科技产品)

    • 用户 B 的向量:[-1, -0.5, -0.3](讨厌科技产品)

    • 计算可得两个向量的余弦相似度为 -1,表示完全相反的兴趣

(2)文本/图像相似性

  • 仅关注正值:通常认为余弦相似度 > 0.5 表示显著相似,接近 1 为高度相似。

  • 负值的处理:可能直接忽略(或视为无关),例如在搜索引擎中,负相似度的文档不会被返回

(3)情感分析

  • 正向评论向量:[1, 0.8, 0.6]

  • 负向评论向量:[-1, -0.7, -0.5]

  • 计算可得两个向量的余弦相似度为 -0.95,表明两者情感强烈对立,但“相似”在反映情感极性的强度上

3.总结

4.代码实现

import numpy as np

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# 示例1:方向相同
A = np.array([1, 2, 3])
B = np.array([2, 4, 6])
print(cosine_similarity(A, B))  # 输出:1.0

# 示例2:方向相反
C = np.array([-1, -2, -3])
print(cosine_similarity(A, C))  # 输出:-1.0

# 示例3:部分相似
D = np.array([1, 1, 1])
E = np.array([2, 2, 3])
print(cosine_similarity(D, E))  # 输出约0.98

# 示例4:弱相关性
F = np.array([1, 0, 0])
G = np.array([0, 0.5, 0.5])
print(cosine_similarity(F, G))  # 输出:0.0

补充:还有很多两个向量的相似度度量方法,比如欧式距离,曼哈顿距离,切比雪夫距离等,等后面有时间再补充了

相关文章:

  • Linux 内核自定义协议族开发:从 “No buffer space available“ 错误到解决方案
  • Java基础回顾 Day4
  • Sentinel 笔记
  • 【JAVA架构师成长之路】【Redis】第13集:Redis缓存击穿原理、规避、解决方案
  • Hadoop命令行语句
  • Jackson 详解
  • 三、OpenGL中三角形的绘制
  • Web前端开发——HTML基础下
  • µCOS-III从入门到精通 第十章(µC/OS-III消息队列)
  • “国产AI之光”Manus,会成为下一个DeepSeek吗?
  • RHCE9.0版本笔记5:防火墙的本地/远程登录方式
  • linux查看python版本
  • conda 配置新环境时package will be install 和 package will be download 的区别
  • [Lc7_分治-快排] 快速选择排序 | 数组中的第K个最大元素 | 库存管理 III
  • p5.js:模拟 n个彩色小球在一个3D大球体内部弹跳
  • MySQL如何给其他账号分配权限?
  • Java基础系列:深入理解八大基本数据类型及避坑指南
  • python 程序一次启动有两个进程的问题(flask)
  • Jetpack Compose — 入门实践
  • 完全日期(日期枚举问题)--- 数学性质题型
  • 通讯录管理网站建设/香飘飘奶茶
  • 建设内部网站目的/2023年适合小学生的新闻
  • 网站建设犭金手指a排名12/网站优化排名易下拉霸屏
  • 网站开发的公司/网络推广怎么做?
  • e4a做网站软件/上海seo顾问推推蛙
  • 课程资源网站的建设/2023第二波疫情已经到来了