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

news2025/1/8 4:24:41

两个向量的余弦相似度是通过测量两个向量在方向上的相似性来计算的。它是向量空间中两个向量夹角的余弦值。如果两个向量的方向相同,它们的余弦相似度接近1;如果两个向量的方向完全相反,它们的余弦相似度接近-1;如果两个向量正交,则它们的余弦相似度为0。
给定两个向量 A 和 B,它们的余弦相似度可以通过以下公式计算:
\[ \text{余弦相似度}(A, B) = \frac{A \cdot B}{\|A\| \|B\|} \]
其中:
- \( A \cdot B \) 表示向量 A 和向量 B 的点积(内积)。
- \( \|A\| \) 表示向量 A 的欧几里得范数(即长度)。
- \( \|B\| \) 表示向量 B 的欧几里得范数。
点积 \( A \cdot B \) 可以这样计算:
\[ A \cdot B = \sum_{i=1}^{n} A_i B_i \]
向量的欧几里得范数是这样计算的:
\[ \|A\| = \sqrt{\sum_{i=1}^{n} A_i^2} \]
\[ \|B\| = \sqrt{\sum_{i=1}^{n} B_i^2} \]
因此,计算两个向量 A 和 B 的余弦相似度的步骤如下:
1. 计算向量 A 和 B 的点积。
2. 分别计算向量 A 和 B 的欧几里得范数。
3. 将点积除以两个向量范数的乘积。
以下是具体的计算步骤:
假设向量 A 和 B 如下:
\[ A = [A_1, A_2, ..., A_n] \]
\[ B = [B_1, B_2, ..., B_n] \]
步骤 1: 计算点积
\[ A \cdot B = A_1B_1 + A_2B_2 + ... + A_nB_n \]
步骤 2: 计算范数
\[ \|A\| = \sqrt{A_1^2 + A_2^2 + ... + A_n^2} \]
\[ \|B\| = \sqrt{B_1^2 + B_2^2 + ... + B_n^2} \]
步骤 3: 计算余弦相似度
\[ \text{余弦相似度}(A, B) = \frac{A \cdot B}{\|A\| \|B\|} \]
注意,在计算过程中,如果分母为零(即其中一个向量为零向量),则余弦相似度没有定义。在实际应用中,通常需要处理这种情况,以避免除以零的错误。


例子:向量[2,3,4]与向量[5,5,6]和[2,3,4]与向量[7,7,8],哪个余弦相似度更接近?

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 定义向量
A = np.array([2, 3, 4])
B1 = np.array([5, 5, 6])
B2 = np.array([7, 7, 8])
# 创建三维坐标图
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
# 绘制向量
ax.quiver(0, 0, 0, A[0], A[1], A[2], color='red', arrow_length_ratio=0.1, label='向量 A [2,3,4]')
ax.quiver(0, 0, 0, B1[0], B1[1], B1[2], color='blue', arrow_length_ratio=0.1, label='向量 B1 [5,5,6]')
ax.quiver(0, 0, 0, B2[0], B2[1], B2[2], color='green', arrow_length_ratio=0.1, label='向量 B2 [7,7,8]')
# 设置坐标轴标签和标题
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
ax.set_title('三维坐标系中的向量')
# 显示图例
ax.legend()
# 显示图形
plt.show()


这是三维坐标系中向量 [2,3,4](红色),向量 [5,5,6](蓝色)和向量 [7,7,8](绿色)的示意图。每个向量的起点都在原点 (0,0,0),箭头指向了向量的终点。通过这个图,你可以直观地看到这三个向量在三维空间中的方向和相对位置。

当然可以。以下是计算向量 [2,3,4] 与向量 [5,5,6] 和 [7,7,8] 的余弦相似度的详细步骤。
### 向量 [2,3,4] 与向量 [5,5,6]
#### 步骤 1: 计算点积
\[ A \cdot B1 = 2 \times 5 + 3 \times 5 + 4 \times 6 = 10 + 15 + 24 = 49 \]
#### 步骤 2: 计算范数
\[ \|A\| = \sqrt{2^2 + 3^2 + 4^2} = \sqrt{4 + 9 + 16} = \sqrt{29} \]
\[ \|B1\| = \sqrt{5^2 + 5^2 + 6^2} = \sqrt{25 + 25 + 36} = \sqrt{86} \]
#### 步骤 3: 计算余弦相似度
\[ \text{余弦相似度}(A, B1) = \frac{49}{\sqrt{29} \times \sqrt{86}} \approx 0.981 \]
### 向量 [2,3,4] 与向量 [7,7,8]
#### 步骤 1: 计算点积
\[ A \cdot B2 = 2 \times 7 + 3 \times 7 + 4 \times 8 = 14 + 21 + 32 = 67 \]
#### 步骤 2: 计算范数
(范数与之前相同)
\[ \|A\| = \sqrt{29} \]
\[ \|B2\| = \sqrt{7^2 + 7^2 + 8^2} = \sqrt{49 + 49 + 64} = \sqrt{162} \]
#### 步骤 3: 计算余弦相似度
\[ \text{余弦相似度}(A, B2) = \frac{67}{\sqrt{29} \times \sqrt{162}} \approx 0.978 \]
这样,我们得到了两个余弦相似度的值,分别为约 0.981 和 0.978。
 

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

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

相关文章

求职Leetcode题目(5)

1.分割回文串 每一个结点表示剩余没有扫描到的字符串,产生分支是截取了剩余字符串的前缀;产生前缀字符串的时候,判断前缀字符串是否是回文。如果前缀字符串是回文,则可以产生分支和结点;如果前缀字符串不是回文&#…

[ERR] 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘(已解决)

今天在使用navicate Premium运行sql文件时出现如下错误: 错误:1273 - Unknown collation: utf8mb4_0900_ai_ci 报错原因: 生成转储文件(也就是sql文件)的数据库版本为8.0,而要运行sql文件的数据库版本为5.6,因为是高版…

Redis 实现消息队列

Redis 实现消息队列 文章目录 Redis 实现消息队列导引1. 基于List结构的消息队列2. 基于PubSub的消息队列3. 基于Stream的消息队列(推荐)3.1 XADD3.2 XREAD3.3 XGROUP 导引 消息队列(Message Queue),从概念上来理解就是用来存放消息的队列,最简单的消息…

芯片外置电阻RC如何实现振荡器功能?

大家好,这里是大话硬件。 这篇文章来实现DC-DC控制器内部的振荡器模块功能。 在调试DC-DC控制器时,如果要改变其开关频率,通常是修改芯片外围的RC参数, 如下图所示。 结合常用芯片UC3842系列的内部框图,实现方式如下: 实现方案如下: 根据上述的原理,实现的思路:…

springboot整合mybatis-plus和pagehelper插件报错,

在springboot和myabtisplus版本没有冲突的情况下,MybatisPlusAutoConfiguration配置类没有生效,查看该类发现存在生效条件,即: 1.必须存在数据源的Bean对象 2.必须存在SqlSessionFactory和SqlSessionFactoryBean类(这…

【QT常用技术讲解】tableWidget右键菜单及多进程编程

前言 本文在QT项目的开发框架的基础上(源代码)增加tableWidget的右键菜单功能,并使用进程实现ping计算机的功能来讲解,本文不对进程间通信进行讲解。 概述 一个项目在开发过程中,通常面临着引入“第三方应用”&#x…

二叉树:镜像树,子结构,二叉树转链表,二叉树的倒数K个数,对称,Z型打印

1.把一棵二叉树转换为它的镜像树。 void mirror_tree(TreeNode *root) {if(rootNULL) return ;TreeNode *temproot->right;root->rightroot->left;root->lefttemp;mirror_tree(root->right);mirror_tree(root->left);}2、输入两棵二叉树A,B&…

Day 21

Java Script 1.什么是JavaScript 概述 JavaScript是一门世界上最流行的脚本语言 Java、JavaScript 一个合格的后端人员,必须要精通JavaScript 历史 JavaScript 的历史_javascript历史-CSDN博客 ECMAScript它可以理解为是JavaScript的一个标准 2.基本使用及…

AI智能名片微信小程序在社群运营中的价值与应用研究

摘要:在数字化转型的浪潮中,社群运营已成为企业营销策略的重要组成部分,它不仅促进了品牌与消费者之间的深度互动,还为企业带来了持续的用户增长和价值转化。本文深入探讨了AI智能名片微信小程序在社群运营中的创新应用&#xff0…

常用数据库详解:从关系型到非关系型的探索

常用数据库详解:深入探索关系型与非关系型数据库 在数据驱动的世界中,数据库系统是存储、管理、检索和更新数据的核心技术。从历史悠久的关系型数据库到新兴的非关系型数据库,每种数据库都有其独特的设计哲学、优势和适用场景。本文将深入探…

不同环境下RabbitMQ的安装-2 ARM架构、X86架构、Window系统环境下安装RabbitMQ

ARM架构、X86架构、Window系统环境下RabbitMQ的安装 RabbitMQ安装1 Erlang语言介绍2 安装Erlang2.1 ARM架构的CentOS虚拟机中安装Erlang2.2 X86架构的CentOS虚拟机中安装Erlang2.3 Windows系统安装Erlang2.3.1 下载Erlang2.3.2 安装Erlang2.3.3 配置Erlang2.3.4 检测Erlang 3.安…

资质延期成本预测:河南建筑装饰企业预算制定策略

资质延期成本预测对于河南建筑装饰企业来说是确保企业资质顺利延续的重要环节。以下是企业预算制定策略的一些关键点: 一、了解政策与要求 首先,河南建筑装饰企业需要详细了解河南省住房和城乡建设厅及相关部门关于资质延期的具体政策和要求。这包括延…

Linux Vim实用教程:从新手到专家的完全指南

Linux Vim最全面的教程涵盖了从Vim的安装、基本操作、高级功能到个性化配置等各个方面,旨在帮助用户全面掌握这款强大的文本编辑器。下面将详细介绍Linux Vim的功能: 安装过程 在Debian/Ubuntu系统上安装Vim:需要执行sudo apt-get update和su…

目标检测综述文章解读——Object Detection in 20 Years: A Survey

论文:Object Detection in 20 Years: A Survey 作者:Zhengxia Zou, Keyan Chen, Zhenwei Shi, Yuhong Guo, Jieping Ye 链接:https://arxiv.org/abs/1905.05055 这是一篇关于目标检测综述性文章,自2019年5月第一次提交后&#xff…

前端(react)框架nextjs

文章目录 一、什么是next.js1. 路由2. 打包 next build3. 部署 二、 next.js 和react区别三、webstorm使用nextjs四、开发常用总结如何修nextjs 启动监听的端口号?NGINX 反向代理 Next.js 项目配置 参考 一、什么是next.js 官网: https://www.nextjs.cn…

使用C#(winform)调用STK并展示其3D/2D控件

最近有个需求要求对STK做二次开发,要用自己写的界面但又要嵌入STK的3D/2D控件展示,后台调用STK引擎做计算。官方文档语焉不详,网上的资料要么太多重复(到处抄来抄去),要么有诸多错漏之处,找了很…

GB/T 28181-2022 公共安全视频监控联网系统:信息传输、交换、控制技术要求pdf协议文档下载,同时附GBT-28181-2016.pdf

国标GB28181 2016标准已经执行很多年了,可以说效果非常好,去年最新的GB28181-2022标准细节也出来了,本来是一个国家级的标准,现在想要下载这个协议标准,一堆网址要会员,要积分,我整理了一下&…

LabVIEW压电陶瓷阻抗测试系统

开发了一种基于LabVIEW软件与PXI模块化仪器的压电陶瓷阻抗测试系统。该系统能在高电压工作条件下测量压电陶瓷的阻抗特性,包括阻抗模值与阻抗角的频率特性,为压电陶瓷的进一步分析与应用提供了重要参考。 项目背景 现有的阻抗测试仪大多只能在低电压条件…

OpenCV图像滤波(5)二维卷积滤波函数filter2D()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::filter2D() 函数用于对图像应用二维卷积滤波器。这个函数可以用来实现多种图像处理操作,如模糊、锐化、边缘检测等。它通过将一个…

什么是Docke,部署dockers,和基本操作命令

Docker简介 什么是容器 容器是用来装东西的,Linux 里面的容器是用来装应用的; 容器就是将软件打包成标准化单元,以用于开发、交付和部署; 容器技术已经成为应用程序封装和交付的核心技术; 容器原理:容器…