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

参考笔记:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产编辑器EverEdit - 宏功能介绍

1 宏 1.1 应用场景 宏是一种重复执行简单工作的利器,可以让用户愉快的从繁琐的工作中解放出来,其本质是对键盘和菜单的操作序列的录制,并不会识别文件的内容,属于无差别无脑执行。 特别是对一些有规律的重复按键动作,…

vue安装stylelint

执行 npm install -D stylelint postcss-html stylelint-config-recommended-vue stylelint-config-standard stylelint-order stylelint-prettier postcss-less stylelint-config-property-sort-order-smacss 安装依赖,这里是less,sass换成postcss-scss…

(最新教程)Cursor Pro订阅升级开通教程,使用支付宝订阅Cursor Pro Plus

一、如何使用Cursor ? 目前要使用Cursor - The AI Code Editor,直接去下载安装就可以了,不过基础版只能用两周,如果需要继续使用,就要订阅pro plus或者企业版了。 二、如何订阅Cursor Pro Plus ? 因为基础…

Cursor 使用经验,一个需求开发全流程

软件开发中 Cursor 的使用经验成为关注焦点,尤其是处理大型数据集的需求。用户提到“Cursor 使用经验,一个需求开发全流程”,但“Cursor”可能指数据库游标,涉及逐行处理数据。本文将详细探讨开发一个需求的完整流程,包…

vue2实现组件库的自动按需引入,unplugin-auto-import,unplugin-vue-components

1.使用ant-design-vue或者element-ui时,如何每个组件都去import导入组件,大大降低了开发效率,如果全局一次性注册会增加项目体积,那么如何实现既不局部引入,也不全局注册? 2.在element-plus官网看到有说明…

蓝桥杯备赛:一道数学题(练思维(同余的应用))

题目:请问由1-8组成的8位数中有多少个数字可以被1111整除? 首先这道题目看着很难,如果我们直接用代码做的话,也要跑很久,那能不呢想想有什么样的思路可以巧妙一点解开这道题目呢? 有的兄弟有的 这道题目的…

[Lc7_分治-快排] 快速选择排序 | 数组中的第K个最大元素 | 库存管理 III

目录 1. 数组中的第K个最大元素 题解 代码 2.库存管理 III 代码 1. 数组中的第K个最大元素 题目链接:215. 数组中的第K个最大元素 题目分析: 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要…

Unity引擎使用HybridCLR(华佗)热更新

大家好,我是阿赵。   阿赵我做手机游戏已经有十几年时间了。记得刚开始从做页游的公司转到去做手游的公司,在面试的时候很重要的一个点,就是会不会用Lua。使用Lua的原因很简单,就是为了热更新。   热更新游戏内容很重要。如果…

【神经网络】python实现神经网络(一)——数据集获取

一.概述 在文章【机器学习】一个例子带你了解神经网络是什么中,我们大致了解神经网络的正向信息传导、反向传导以及学习过程的大致流程,现在我们正式开始进行代码的实现,首先我们来实现第一步的运算过程模拟讲解:正向传导。本次代…

【Linux】冯诺依曼体系与操作系统理解

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、冯诺依曼体系结构 二、操作系统 1. 操作系统的概念 2. 操作系统存在的意义 3. 操作系统的管理方式 4. 补充:理解系统调用…

HTML-网页介绍

一、网页 1.什么是网页: 网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”,通常是 HTML 格式的文件,它要通过浏览器来阅读。 网页是构成网站的基本元素&#xf…

STM32——GPIO介绍

GPIO(General-Purpose IO ports,通用输入/输出接口)模块是STM32的外设接口的核心部分,用于感知外界信号(输入模式)和控制外部设备(输出模式),支持多种工作模式和配置选项。 1、GPIO 基本结构 STM32F407 的每个 GPIO 引脚均可独立配置,主要特性包括: 9 组 GPIO 端口…

字节码是由什么组成的?

Java字节码是Java程序编译后的中间产物,它是一种二进制格式的代码,可以在Java虚拟机(JVM)上运行。理解字节码的组成有助于我们更好地理解Java程序的运行机制。 1. Java字节码是什么? 定义 Java字节码是Java源代码经过…

链表算法题目

1.两数相加 两个非空链表,分别表示两个整数,只不过是反着存储的,即先存储低位在存储高位。要求计算这两个链表所表示数的和,然后再以相同的表示方式将结果表示出来。如示例一:两个数分别是342和465,和为807…

blender学习25.3.8

【04-进阶篇】Blender材质及灯光Cycle渲染&后期_哔哩哔哩_bilibili 注意的问题 这一节有一个大重点就是你得打开显卡的渲染,否则cpu直接跑满然后渲染的还十分慢 在这里你要打开GPU计算,但是这还不够 左上角编辑,偏好设置,系…

【godot4.4】布局函数库Layouts

概述 为了方便编写一些自定义容器和控件、节点时方便元素布局,所以编写了一套布局的求取函数,统一放置在一个名为Layouts的静态函数库中。 本文介绍我自定义的一些布局计算和实现以及函数编写的思路,并提供完整的函数库代码(持续…

Windows下配置Conda环境路径

问题描述: 安装好Conda之后,创建好自己的虚拟环境,同时下载并安装了Pycharm,但在Pycharm中找不到自己使用Conda创建好的虚拟环境。显示“Conda executable is not found” 解决办法(依次尝试以下) 起初怀…

OpenHarmony子系统开发编译构建指导

OpenHarmony子系统开发编译构建指导 概述 OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统,该系统提供以下基本功能: 以部件为最小粒度拼装产品和独…

leetcode日记(80)复原IP地址

只能说之前动态规划做多了,看到就想到动态规划,然后想想其实完全不需要,回溯法就行了。 一开始用了很多莫名其妙的代码,写的很复杂……(主要因为最后不能加‘.’)其实想想只要最后加入vector时去掉最后一个…

LINUX网络基础 [五] - HTTP协议

目录 HTTP协议 预备知识 认识 URL 认识 urlencode 和 urldecode HTTP协议格式 HTTP请求协议格式 HTTP响应协议格式 HTTP的方法 HTTP的状态码 ​编辑HTTP常见Header HTTP实现代码 HttpServer.hpp HttpServer.cpp Socket.hpp log.hpp Makefile Web根目录 H…