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

news2025/3/9 7:43:36

参考笔记:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OkHttp:工作原理 拦截器链深度解析

目录 一、OKHttp 的基本使用 1. 添加依赖 2. 发起 HTTP 请求 3. 拦截器(Interceptor) 4. 高级配置 二、OKHttp 核心原理 1. 责任链模式(Interceptor Chain) 2. 连接池(ConnectionPool) 3. 请求调度…

python: DDD+ORM using oracle 21c

sql script: create table GEOVINDU.School --創建表 ( SchoolId char(5) NOT NULL, -- SchoolName nvarchar2(500) NOT NULL, SchoolTelNo varchar(8) NULL, PRIMARY KEY (SchoolId) --#主鍵 );create table GEOVINDU.Teacher ( TeacherId char(5) NOT NULL , TeacherFirstNa…

基于 LeNet 网络的 MNIST 数据集图像分类

1.LeNet的原始实验数据集MNIST 名称:MNIST手写数字数据集 数据类型:灰度图 (一通道) 图像大小:28*28 类别数:10类(数字0-9) 1.通过torchvision.datasets.MNIST下载并保存到本地…

Day4 C语言与画面显示练习

文章目录 1. harib01a例程2. harib01b例程3. harib01e例程4. harib01f例程5. harib01h例程 1. harib01a例程 上一章主要是将画面搞成黑屏,如果期望做点什么图案,只需要再VRAM里写点什么就好了,使用nask汇编语言实现一个函数write_mem8&#…

一周热点-OpenAI 推出了 GPT-4.5,这可能是其最后一个非推理模型

在人工智能领域,大型语言模型一直是研究的热点。OpenAI 的 GPT 系列模型在自然语言处理方面取得了显著成就。GPT-4.5 是 OpenAI 在这一领域的又一力作,它在多个方面进行了升级和优化。 1 新模型的出现 GPT-4.5 目前作为研究预览版发布。与 OpenAI 最近的 o1 和 o3 模型不同,…

《UE5_C++多人TPS完整教程》学习笔记34 ——《P35 网络角色(Network Role)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P35 网络角色(Network Role)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author) Stephe…

手写简易Tomcat核心实现:深入理解Servlet容器原理

目录 一、Tomcat概况 1. tomcat全局图 2.项目结构概览 二、实现步骤详解 2.1 基础工具包(com.qcby.util) 2.1.1 ResponseUtil:HTTP响应生成工具 2.1.2 SearchClassUtil:类扫描工具 2.1.3 WebServlet:自定义注解…

mac本地安装运行Redis-单机

记录一下我以前用的连接服务器的跨平台SSH客户端。 因为还要准备毕设...... 服务器又过期了,只能把redis安装下载到本地了。 目录 1.github下载Redis 2.安装homebrew 3.更新GCC 4.自行安装Redis 5.通过 Homebrew 安装 Redis 安装地址:https://git…

【ThreeJS Basics 09】Debug

文章目录 简介从 dat.GUI 到 lil-gui例子安装 lil-gui 并实例化不同类型的调整改变位置针对非属性的调整复选框颜色 功能/按钮调整几何形状文件夹调整 GUI宽度标题关闭文件夹隐藏按键切换 结论 简介 每一个创意项目的一个基本方面是能够轻松调整。开发人员和参与项目的其他参与…

【笔记】STM32L4系列使用RT-Thread Studio电源管理组件(PM框架)实现低功耗

硬件平台:STM32L431RCT6 RT-Thread版本:4.1.0 目录 一.新建工程 二.配置工程 ​编辑 三.移植pm驱动 四.配置cubeMX 五.修改驱动文件,干掉报错 六.增加用户低功耗逻辑 1.设置唤醒方式 2.设置睡眠时以及唤醒后动作 ​编辑 3.增加测试命…

类和对象:

1. 类的定义: 1. 类定义格式: 对于我们的类的话,我们是把类看成一个整体,我们的函数里面没有找到我们的成员变量,我们就在我们的类里面找。 我们看我们的第二点: 我们的类里面,我们通常会对…

【十三】Golang 通道

💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 通道通道声明初始化缓冲机制无缓冲通道代码示例 带…

软考中级_【软件设计师】知识点之【面向对象】

简介: 软件设计师考试中,面向对象模块为核心考点,涵盖类与对象、继承、封装、多态等基础概念,重点考查UML建模(类图/时序图/用例图)、设计模式(如工厂、单例模式)及SOLID设计原则。要…

分布式锁—7.Curator的分布式锁一

大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphore源码 1.Curator的可重入锁的源码 (1)InterProcessMutex获取分布式锁 (2)InterProcessMutex的初始化 (3)InterProcessMutex.…

《UE5_C++多人TPS完整教程》学习笔记35 ——《P36 武器类(Weapon Class)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P36 武器类(Weapon Class)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author) Stephen …

[密码学实战]Java实现国密TLSv1.3单向认证

一、代码运行结果 1.1 运行环境 1.2 运行结果 1.3 项目架构 二、TLS 协议基础与国密背景 2.1 TLS 协议的核心作用 TLS(Transport Layer Security) 是保障网络通信安全的加密协议,位于 TCP/IP 协议栈的应用层和传输层之间,提供: • 数据机密性:通过对称加密算法(如 AE…

最小栈 _ _

一:题目 二:思路 解释:一个栈名为st,其用来正常的出入栈,一个栈名为minst,其的栈顶元素一定是最小的元素 入栈:第一个元素,两个栈一起入,后面再入栈,只有入栈…

HTTPS加密原理详解

目录 HTTPS是什么 加密是什么 HTTPS的工作流程 1.使用对称加密 2.引入非对称加密 3.引入证书机制 客户端验证证书真伪的过程 签名的加密流程 整体工作流程 总结 HTTPS是什么 HTTPS协议也是一个应用程协议,是在HTTP的基础上加入了一个加密层,由…

黑金风格人像静物户外旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 针对人像、静物以及户外旅拍照片,运用 Lightroom 软件进行风格化调色工作。旨在通过软件中的多种工具,如基本参数调整、HSL(色相、饱和度、明亮度)调整、曲线工具等改变照片原本的色彩、明度、对比度等属性,将…

安装pyqt6出现的问题

安装PyQt6报错: PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: C:\\Users\\xyj19\\AppData\\Local\\Temp\\tmp3xfmekh7 [end of output] note: This error originates from a subprocess, and is likely not a pr…