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

【Python】使用Numpy实现余弦相似度计算

本文详细介绍了如何使用 NumPy 实现两个向量之间的余弦相似度计算,帮助理解向量相似度在推荐系统、文本处理等领域的应用。

1. 余弦相似度定义

余弦相似度是衡量两个向量在高维空间中夹角大小的指标,其公式为:

c o s ( θ ) = A ⋅ B ∥ A ∥ ∥ B ∥ {cos(\theta)} = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} cos(θ)=A∥∥BAB
其中:

  • A ⋅ B A⋅B AB 表示向量的点积,即 A 1 B 1 + A 2 B 2 + . . . + A n B n A_1B_1+A_2B_2+...+A_nB_n A1B1+A2B2+...+AnBn
  • ∥ A ∥ ∥A∥ A ∥ B ∥ ∥B∥ B 是向量的 L2 范数(即欧几里得长度)

如果 A = [ 1 , 2 , 3 ] A=[1,2,3] A=[1,2,3] B = [ 2 , 3 , 4 ] B=[2,3,4] B=[2,3,4] 则有:

  • A ⋅ B = 1 ∗ 2 + 2 ∗ 3 + 3 ∗ 4 = 20 A⋅B =1*2+2*3+3*4=20 AB=12+23+34=20
  • ∥ A ∥ = 1 2 + 2 2 + 3 2 ∥A∥=\sqrt{1^2+2^2+3^2} A=12+22+32
  • ∥ B ∥ = 2 2 + 3 2 + 4 2 ∥B∥ = \sqrt{2^2+3^2+4^2} B=22+32+42

余弦相似度的取值范围为 [-1, 1]:

  • 1 表示两个向量方向完全相同。
  • 0 表示两个向量正交(没有相关性)。
  • −1 表示两个向量方向完全相反。

2. Python Numpy实现

代码实现:

import numpy as np
def cosine_similarity(vec1, vec2):# 计算点积dot_product = np.dot(vec1, vec2)norm_a = np.linalg.norm(vec1)norm_b = np.linalg.norm(vec2)# 防止分母为0if norm_a == 0 or norm_b == 0:return 0.0# 余弦相似度return dot_product/(norm_a * norm_b)

3. 扩展:矩阵形式计算余弦相似度

代码实现:

def batch_cosine_similarity(matrix_a, matrix_b):"""计算两个矩阵中对应向量之间的余弦相似度:param matrix_a: 矩阵 A (m x d):param matrix_b: 矩阵 B (n x d):return: 相似度矩阵 (m x n)"""norm_a = np.linalg.norm(matrix_a, axis=1, keepdims=True)norm_b = np.linalg.norm(matrix_b, axis=1, keepdims=True)similarity_matrix = np.dot(matrix_a, matrix_b.T) / (norm_a * norm_b.T)return similarity_matrix

实际应用:

  • 在文本分析中,如果两个文本的余弦相似度接近 1,说明这两篇文本内容相似;而如果相似度接近 0,则说明文本之间没有明显的联系。
  • 在推荐系统中,用户的行为向量与商品的描述向量的余弦相似度可以帮助计算推荐结果。
  • 在图像处理领域,计算图像特征向量之间的余弦相似度也可以用于检索相似图像。
  • 余弦相似度也可以用于信号分析,表示两个信号的波形相似性。例如,某些电子设备的状态诊断可能基于当前信号与历史信号的余弦相似度。
http://www.lryc.cn/news/503853.html

相关文章:

  • nginx中的root和alias的区别
  • 探索Telnet:实现Windows远程登录Ubuntu的实践指南
  • 在 Vue 2 中隐藏页面元素的方法
  • 【Java】Java8的4个函数式接口简单教程
  • 计算机组成原理与系统结构——微程序控制
  • 【Swift】集合类型 - 数组、集合、字典
  • 3D 视觉定位技术:汽车零部件制造的智能变革引擎
  • 操作系统的基本认识
  • 使用pycharm连接远程服务器
  • 【Linux SH脚本】LinuxCheck 应急检查信息脚本
  • apifox创建一个mock接口
  • 设计一个基础JWT的多开发语言分布式电商系统
  • 委托(Delegate)与事件(Event)-(上篇)
  • Scala根据身份证前两位数判断地区
  • freeswitch(开启支持视频H264通话)
  • 启发式搜索算法和优化算法的区别
  • 数据结构初阶---二叉树---堆
  • 微信小程序中 crypto-js 加解密全攻略
  • 单片机的软件开发环境
  • 【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)
  • Python 实现对人的行为预测
  • 使用枚举实现单例模式,不会反序列化破坏攻击,不会被反射破坏攻击。(附带枚举单例的简单实现)
  • scala隐式转换
  • Spring Boot 应用 “Connection is closed” 及 MySQL 空闲超时断开连接解决方案
  • SLF4J框架原理及其实现方案
  • 代码随想录-算法训练营-番外(图论01:图论理论基础,所有可到达的路径)
  • 【JAVA】Java项目实战—Java EE项目:企业资源规划(ERP)系统
  • springboot配置过滤器解决html资源路径和接口路径冲突问题
  • 在IDE中使用Git
  • 【AIGC进阶-ChatGPT提示词副业解析】反向心理学在沟通中的运用:激将法的艺术