当前位置: 首页 > 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,则说明文本之间没有明显的联系。
  • 在推荐系统中,用户的行为向量与商品的描述向量的余弦相似度可以帮助计算推荐结果。
  • 在图像处理领域,计算图像特征向量之间的余弦相似度也可以用于检索相似图像。
  • 余弦相似度也可以用于信号分析,表示两个信号的波形相似性。例如,某些电子设备的状态诊断可能基于当前信号与历史信号的余弦相似度。

相关文章:

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

本文详细介绍了如何使用 NumPy 实现两个向量之间的余弦相似度计算,帮助理解向量相似度在推荐系统、文本处理等领域的应用。 1. 余弦相似度定义 余弦相似度是衡量两个向量在高维空间中夹角大小的指标,其公式为: c o s ( θ ) A ⋅ B ∥ A ∥…...

nginx中的root和alias的区别

alias 在E:\\test\\目录下创建一个index.html文件 在nginx.conf文件配置alias,路径填写为绝对路径,但是要注意,这里结尾是文件夹的名字 然后下面的/aa/ 是随便起的名字,也不是文件夹的名字,在浏览器访问的使用的 在浏览器使用 …...

探索Telnet:实现Windows远程登录Ubuntu的实践指南

前言 在互联网技术日新月异的今天,远程登录已经成为许多开发者和系统管理员日常工作中不可或缺的一部分。虽然SSH已经成为远程登录的首选协议,但了解并掌握Telnet这一经典协议仍然具有重要意义。本文将带您一起探索如何使用Telnet实现Windows远程登录Ub…...

在 Vue 2 中隐藏页面元素的方法

目录 在 Vue 2 中隐藏页面元素的方法 引言 1. 使用 v-if 指令 2. 使用 v-show 指令 3. 使用自定义类名与 v-bind:class 4. 使用内联样式与 v-bind:style 5. 使用组件的 keep-alive 和条件渲染 在 Vue 2 中隐藏页面元素的方法 引言 在开发 Web 应用时,我们经…...

【Java】Java8的4个函数式接口简单教程

什么是函数是接口? 函数式接口是一个包含 单个抽象方法 的接口,且可以有任意多个默认方法或静态方法。为了增强可读性,Java 8 引入了 FunctionalInterface 注解,用于标识该接口是一个函数式接口,编译器会帮助我们检查…...

计算机组成原理与系统结构——微程序控制

笔记内容及图片整理自XJTUSE “计算机组成原理与系统结构” 课程ppt,仅供学习交流使用,谢谢。 基本概念 微指令 将控制单元实现为基本逻辑单元之间的互连并非易事,且设计相对呆板,难以灵活地改变,因此实现微程序控制…...

【Swift】集合类型 - 数组、集合、字典

文章目录 集合的可变性数组数组类型简写语法创建空数组使用默认值创建数组通过合并两个数组创建一个新数组使用数组字面量创建数组访问和修改数组 Swift 提供了三种主要的 集合类型,分别是数组、集合和字典,用于存储值集合。数组是有序的值集合。集合是无…...

3D 视觉定位技术:汽车零部件制造的智能变革引擎

在汽车零部件制造领域,传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求,促使企业寻求突破之道。而 3D 视觉定位技术,为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…...

操作系统的基本认识

操作系统的感性认识 操作系统这个词可能或多或少听说过,比如windows, linux, macOS。这些其实都是工程师们经过实践后的具象化产物。而操作系统原理这六个字就是操作系统的抽象化,更准确的说,操作系统原理是很理论化的东西。举一个不是很恰当…...

使用pycharm连接远程服务器

使用pycharm连接远程服务器 1.在你的项目里配置 SSH ,放到服务器上去跑 主机为服务器的IP地址,输入用户名和密码 配置项目位置、选择编译器 2.设置本地更改代码保存后即上传到服务器 在本地使用 pycharm 调试代码,pycharm 上面的代码更改…...

【Linux SH脚本】LinuxCheck 应急检查信息脚本

LinuxCheck 1.下载地址 【Linux SH脚本】LinuxCheck 应急检查信息脚本 2.简介 LinuxCheck 是一个开源的自动化检查脚本,旨在快速检测 Linux 系统的安全配置和潜在问题。它支持多种发行版,能够扫描并生成详细的报告,涵盖用户管理、权限配置…...

apifox创建一个mock接口

1、新建接口 2、选择mock,开启云端mock; 3、新建期望; 4、编辑响应体; 5、快速请求,测试; (主要可能是网络问题,也可以自己python mock一个;apifox简单快速&#xf…...

设计一个基础JWT的多开发语言分布式电商系统

在设计一个分布式电商系统时,保证系统的可扩展性、性能以及跨语言的兼容性是至关重要的。随着微服务架构的流行,越来越多的电商系统需要在多个服务间共享信息,并且保证服务的安全性。在这样的场景下,JSON Web Token(JW…...

委托(Delegate)与事件(Event)-(上篇)

C#中的委托(Delegate)是一种类型安全的函数指针,它允许将方法作为参数传递给其他方法,并且可以用来实现回调机制。委托是C#中实现事件处理、异步编程以及面向对象设计模式的重要工具之一。在C#中,委托被定义为引用类型…...

Scala根据身份证前两位数判断地区

方法一 val id "339005200101010928"// 取出id前两位 val province id.substring(0, 2) /*//println(province)if (province "42") {println("湖北")}else if (province "11") {println("北京")}else if (province &qu…...

freeswitch(开启支持视频H264通话)

亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景介绍: 内部默认是不支持的,视频通话,需要开启模块使用方法: 第一步:进入vars.xml 下面找到global_codec_prefs和outbound_codec_pr…...

启发式搜索算法和优化算法的区别

启发式搜索算法和优化算法在计算机科学中都有广泛的应用,但它们之间存在一些明显的区别。 一、定义与核心思想 启发式搜索算法 定义:启发式搜索算法是一类基于经验和直觉的问题求解方法,通过观察问题的特点,并根据某种指…...

数据结构初阶---二叉树---堆

一、树 1.树的概念 树是一种非线性的数据结构,由n(n≥0)个有限结点组成的一个有层次关系的集合。形状类似一棵倒挂的树,根朝上,分支向下。 根结点没有前驱结点,可以有n(n≥0)个后继结点。 其余结点被分为M个互不相交的集合&am…...

微信小程序中 crypto-js 加解密全攻略

一、引言 在微信小程序开发中,数据的安全至关重要。加解密技术在保护用户数据和应用程序的安全性方面起着关键作用。小程序在与服务器进行数据交互时,面临着数据泄露、篡改等安全风险。为了确保用户信息的安全,选择合适的加解密算法变得尤为…...

单片机的软件开发环境

单片机(Microcontroller Unit, MCU)是一种将计算机系统中的中央处理器(CPU)、存储器(Memory)、输入输出接口(I/O)等集成在一块芯片上的微型计算机。单片机因其体积小、成本低、功能强…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Robots.txt 文件

什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

RLHF vs RLVR:对齐学习中的两种强化方式详解

在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...

使用 uv 工具快速部署并管理 vLLM 推理环境

uv:现代 Python 项目管理的高效助手 uv:Rust 驱动的 Python 包管理新时代 在部署大语言模型(LLM)推理服务时,vLLM 是一个备受关注的方案,具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...

timestamp时间戳转换工具

作为一名程序员,一款高效的 在线转换工具 (在线时间戳转换 计算器 字节单位转换 json格式化)必不可少!https://jsons.top 排查问题时非常痛的点: 经常在秒级、毫秒级、字符串格式的时间单位来回转换,于是决定手撸一个…...