PyTorch 中的距离函数深度解析:掌握向量间的距离和相似度计算

目录

Pytorch中Distance functions详解

pairwise_distance

用途

用法

参数

数学理论公式

示例代码

cosine_similarity

用途

用法

参数

数学理论

示例代码 

输出结果

pdist

用途

用法

参数

数学理论

示例代码

总结 


Pytorch中Distance functions详解

pairwise_distance

torch.nn.functional.pairwise_distance 是 PyTorch 中的一个函数,用于计算两组向量之间的成对距离。这个函数广泛应用于机器学习和深度学习中,尤其是在处理距离相关的任务,如聚类、相似度计算等。

用途

  • 计算两组向量间的成对距离,常用于度量向量间的相似性或差异性。
  • 用于机器学习中的距离度量,如k-最近邻 (k-NN)、聚类等。

用法

torch.nn.functional.pairwise_distance(x1, x2, p=2.0, eps=1e-6, keepdim=False)

 

  • x1, x2: 输入的两组向量,必须有相同的维度。
  • p: 距离计算的幂指数,默认为2,即欧几里得距离。
  • eps: 一个小的数值,用于保证数值稳定性。
  • keepdim: 是否保持输出的维度。

参数

  • x1: 第一组向量的张量。
  • x2: 第二组向量的张量。
  • p: 距离度量的幂指数,默认为2(欧几里得距离)。
  • eps: 避免除零错误的小数,默认为1e-6。
  • keepdim: 在输出中保持原始输入的维度结构。

数学理论公式

对于向量 x1_{i}​ 和 x2_{i}pairwise_distance 计算的是 p 范数下的距离:

d(x1_{i},x2_{i})=(\sum_{j}|x1_{ij}-x2_{ij}|^{p}+eps)^{\frac{1}{p}}

 其中,x1_{ij} 和 x2_{ij} 分别是x1_{i}x1_{i}x2_{i} ,的第j个元素。

示例代码

import torch
import torch.nn.functional as F

# 定义两个向量组
x1 = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32)
x2 = torch.tensor([[1, 3, 5], [2, 4, 6]], dtype=torch.float32)

# 计算成对距离
dist = F.pairwise_distance(x1, x2, p=2)

# 输出结果  tensor([2.2361, 2.4495]) 这里,输出的是每一对向量之间的欧几里得距离。

print(dist)

cosine_similarity

torch.nn.functional.cosine_similarity 是 PyTorch 中的一个函数,用于计算两个张量之间的余弦相似度。这个函数在机器学习和深度学习领域中非常有用,尤其是在处理文本、图像或任何类型的特征向量时,用于度量它们之间的相似性。

用途

  • 计算两个向量或向量组之间的余弦相似度。
  • 广泛应用于自然语言处理、计算机视觉、推荐系统等领域。

用法

torch.nn.functional.cosine_similarity(x1, x2, dim=1, eps=1e-8)
  • x1, x2: 输入的两个张量,必须能够广播到相同的形状。
  • dim: 计算相似度的维度。
  • eps: 避免除零错误的小数值。

参数

  • x1 (Tensor): 第一个输入张量。
  • x2 (Tensor): 第二个输入张量。
  • dim (int, 可选): 计算相似度的维度,默认为1。
  • eps (float, 可选): 用于避免除零的小数值,默认为1e-8。

数学理论

余弦相似度的计算公式为:

similarity = \frac{x1}{max(||x1||_{2},\varepsilon )\times max(||x2||_{2},\varepsilon )}

 

  • x1⋅x2 表示两个张量的点积。
  • ||x1||_{2} 和 ||x2||_{2}​ 分别是 x1 和 x2 的2范数。
  • ε 是一个小的数值,用来保证除数不为零。

示例代码 

import torch
import torch.nn.functional as F

# 随机生成两个张量
input1 = torch.randn(100, 128)
input2 = torch.randn(100, 128)

# 计算余弦相似度
output = F.cosine_similarity(input1, input2)

# 打印结果
print(output)

输出结果

此代码将计算 input1input2 每行之间的余弦相似度,并输出一个长度为100的张量,每个元素对应于两个输入张量相应行的余弦相似度值。由于输入是随机生成的,输出也会随机变化。

pdist

torch.nn.functional.pdist 是 PyTorch 中的一个函数,它用于计算输入张量中每对行向量之间的 p 范数距离。此函数在统计分析、机器学习和数据科学中非常有用,尤其是在涉及距离度量和空间关系的场景中。

用途

  • 计算给定张量中每对行向量之间的距离。
  • 应用于聚类分析、多维缩放和其他需要距离度量的算法。

用法

torch.nn.functional.pdist(input, p=2)
  • input: 输入张量,其形状为 N×M,其中 N 是行数,M 是列数(特征数)。
  • p: 用于计算的 p 范数,默认为 2,即欧几里得距离。

参数

  • input (Tensor): 形状为 N×M 的输入张量。
  • p (float): p 范数的值,用于计算向量对之间的距离。可取值为 0 到 ∞ 之间的任何实数。

数学理论

对于输入张量的每一对行向量 x_{i}x_{j}pdist 计算它们之间的 p 范数距离:​d(x_{i},x_{j})=(\sum_{k}|x_{ik}-x_{jk}|^{p})^{\frac{1}{p}} 其中,x_{ik}​ 和 x_{jk} 分别是 x_{i} 和x_{j}的第 k 个元素。

示例代码

import torch
import torch.nn.functional as F

# 定义输入张量
input_tensor = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=torch.float32)

# 计算 p 范数距离
distances = F.pdist(input_tensor, p=2)

# 输出结果 tensor([5.1962, 10.3923, 5.1962]) 这里,输出的是输入张量中每一对行向量之间的欧几里得距离。

print(distances)

总结 

本文解析了 PyTorch 中三个关键的距离函数:pairwise_distancecosine_similaritypdist。这些函数在深度学习和机器学习中非常重要,用于计算向量之间的距离和相似度,从而支持各种算法如聚类、k-最近邻、特征相似度度量等。每个函数都有其特定的应用场景和数学原理。pairwise_distance 计算两组向量间的成对欧几里得距离,cosine_similarity 计算两个张量间的余弦相似度,而 pdist 则计算一个张量内各行向量间的 p 范数距离。通过这些函数,我们能有效地分析和处理数据,特别是在高维空间中。

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

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

相关文章

到店商详架构变迁

一、项目背景 到店商详是平台为京东到店业务提供的专属商详页面,将传统电商购物路径打造成以LBS门店属性的本地生活服务交易链路。 二、架构变迁 1、 主站商详扩展点 **优点:**到店侧仅关注业务,无需过度关注服务部署、性能优化等。 **缺…

【EI会议征稿通知】2024年通信技术与软件工程国际学术会议 (CTSE 2024)

2024年通信技术与软件工程国际学术会议 (CTSE 2024) 2024 International Conference on Communication Technology and Software Engineering (CTSE 2024) 2024年通信技术与软件工程国际学术会议 (CTSE 2024)将于2024年03月15-17日在中国长沙举行。会议专注于通信技术与软件工…

【C++初阶】第二站:类与对象(上) -- 上部分

前言: C学习的第二站:类和对象(上)文章的上半部分,知识点:面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装、类的作用域、类的实例化. 目录 面向过程和面向对象初步认识 类的引入 类的定义 类的访问限定符及封装 访问限定符 封装 类的…

Git提交 ssh: connect to host github.com port 22: Connection timed out解决方案

你们好,我是金金金。 场景 之前都是好好的,不知道今天为什么提交代码就这样了 排查 根据英文可以看出,ssh端口号被拒绝了,22号端口不行,那就换一个端口 造成error的原因 ssh端口被拒绝 解决 找到.ssh文件&#xff…

AI新势力|将创业当作修行的BookGPT

近期,科技慢半拍联合AIGC开放社区采访了AI创业产品BootGPT的创始人陆再谋。陆总分享了他的创业之旅,从贵州到北京,再回到贵州的整段创业经历,从最初的困难到逐渐取得的成果,打造出了BookGPT这款创业产品。 在本次访谈中…

RT-Thread Studio学习(十五)PWM测量

RT-Thread Studio学习(十五)PWM测量 一、简介二、新建RT-Thread项目并使用外部时钟三、启用PWM输入捕获功能四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下使用定时器的PWM输入模式进行脉宽和周期测量。硬件及开发…

轻量化/高效扩散模型文献综述

🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活&…

算法刷题——拿出最少数目的魔法豆(力扣)

文章目录 题目描述我的解法思路结果分析 官方题解分析 查漏补缺更新日期参考来源 题目描述 传送门 拿出最少数目的魔法豆:给定一个正整数 数组beans ,其中每个整数表示一个袋子里装的魔法豆的数目。请你从每个袋子中拿出 一些豆子(也可以 拿…

TypeScript实现一个贪吃蛇小游戏

游戏效果 文件目录 准备1&#xff1a;新建index.html&#xff0c;编写游戏静态页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-…

基于Java图书商城系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

Windows连接Ubuntu桌面

平时Windows连接Ubuntu服务器都是使用Xshell、FinalShell等工具&#xff0c;但这些连接之后只能通过终端进行操作&#xff0c;无法用桌面方式与服务器交互。 本文介绍如何通过工具&#xff0c;实现Window连接远程Ubuntu服务器&#xff0c;并使用桌面方式交互。 系统版本&#x…

【leetcode】消失的数字

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1.暴力求解法2.采用异或的方法&#xff08;同单身狗问题&#xff09;3.先求和再减去数组元素 点击查看…

基于ssm+vue的宠物医院系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

后面的输入框与前面的联动,输入框只能输入正数

概要 提示&#xff1a;这里可以描述概要 前面的输入框是发票金额&#xff0c;后面的输入框是累计发票金额&#xff08;含本次&#xff09;--含本次就代表后倾请求的接口的数据&#xff08;不是保存后返显的-因为保存后返显的是含本次&#xff09;是不含本次的所以在输入发票金…

四款免费、易用的Docker漏洞扫描工具

本文向您介绍四种既可以扫描Docker镜像中的漏洞&#xff0c;又能够被轻松地集成到CI/CD中的四种免费实用工具。 基本原理 所有这些工具的工作原理都比较类似。它们使用的是如下两步流程&#xff1a; 生成软件物料清单(Software Bill of Materials&#xff0c;SBOM)。将SBOM与…

虚拟线程探索与实践(JDK19)

优质博文&#xff1a;IT-BLOG-CN 一、简介 虚拟线程是轻量级线程&#xff0c;极大地减少了编写、维护和观察高吞吐量并发应用的工作量。虚拟线程是由JEP 425提出的预览功能&#xff0c;并在JDK 19中发布&#xff0c;JDK 21中最终确定虚拟线程&#xff0c;以下是根据开发者反馈…

解锁文字魔法:探索自然语言处理的秘密——从技术揭秘到应用实战!

目录 前言 关键技术——揭密自然语言处理的秘密武器&#xff01; 领域应用——自然语言处理技术在不同领域的奇妙表演&#xff01; 超越极限——自然语言处理技术面临的顽强挑战揭秘&#xff01; 科技VS伦理——自然语言处理技术的发展与伦理社会的纠结较量&#xff01; 开…

LINUX基础培训十一之日志管理

前言、本章学习目标 了解LINUX中日志文件及其功能掌握rsyslog服务及启动方法熟悉日志文件格式的分析 一、Linux日志常见文件及其功能 日志文件是重要的系统信息文件&#xff0c;其中记录了许多重要的系统事件&#xff0c;包括用户的登录信息、系统的启动信息、系统的安全信…

最长上升子序列模型(LIS)

最长上升子序列模型就像它的名字一样&#xff0c;用来从区间中找出最长上升的子序列。它主要用来处理区间中的挑选问题&#xff0c;可以处理上升序列也可以处理下降序列&#xff0c;原序列本身的顺序并不重要。 模型 895. 最长上升子序列&#xff08;活动 - AcWing&#xff0…

分享一个基于easyui前端框架开发的后台管理系统模板

这是博主自己在使用的一套easyui前端框架的后台管理系统模版&#xff0c;包含了后端的Java代码&#xff0c;已经实现了菜单控制、权限控制功能&#xff0c;可以直接拿来使用。 springboot mybatis mybatis-plus实现的增删查改完整项目&#xff0c;前端使用了easyui前端框架。…