首页 > 编程语言 >Python小练习:向量之间的距离度量

Python小练习:向量之间的距离度量

时间:2023-03-25 09:44:42浏览次数:48  
标签:loss similarity Python torch 距离 度量 e1 向量 e2

Python小练习:向量之间的距离度量

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

本文主要用Python实现三种常见的向量之间的距离度量方式:

1)曼哈顿距离(Manhattan distance, L1范数):$d(x,y) = \sum\limits_{i = 1}^n {\left| {{x_i} - {y_i}} \right|} $

2)欧氏距离(Euclidean distance,L2范数):$d(x,y) = \sqrt {\sum\limits_{i = 1}^n {{{({x_i} - {y_i})}^2}} } $

3)余弦相似度(Cosine similarity):$d(x,y) = \frac{{x{y^T}}}{{\left\| x \right\|\left\| y \right\|}}$

其中,$x,y \in \mathbb{R}{^{1 \times n}}$

1. loss_test.py

 1 # -*- coding: utf-8 -*-
 2 # Author:凯鲁嘎吉 Coral Gajic
 3 # https://www.cnblogs.com/kailugaji/
 4 # Python小练习:向量之间的距离度量
 5 # Python实现两向量之间的:
 6 # 1)曼哈顿距离(Manhattan distance, L1范数)
 7 # 2)欧氏距离(Euclidean distance,L2范数)
 8 # 3)余弦相似度(Cosine similarity)
 9 import torch
10 import torch.nn.functional as F
11 # 自己写的距离度量函数
12 def compute_l1_similarity(e1, e2): # L1距离
13     return torch.abs(e1 - e2).sum(-1)
14 def compute_l2_similarity(e1, e2): # L2距离
15     return ((e1 - e2)**2).sum(-1).sqrt()
16     # 注意:这里开根号了,没平方
17 def compute_cosine_similarity(e1, e2): # cosine距离
18     e1 = e1 / torch.norm(e1, dim=-1, p=2, keepdim=True)
19     e2 = e2 / torch.norm(e2, dim=-1, p=2, keepdim=True)
20     similarity = torch.mul(e1, e2).sum(1) # mul: 点乘
21     return similarity
22     # 后两行也可替换为:
23     # similarity = torch.mm(e1, torch.t(e2)) # mm: 相乘,torch.t: 转置
24     # return torch.diag(similarity) # 只取对角线元素
25 
26 torch.manual_seed(1)
27 n = 3 # 样本个数
28 m = 5 # 样本维度
29 # 仅考虑e1的第i个样本和e2的第i个样本之间计算距离
30 # 不考虑e1的i个样本和e2的第j个样本之间的距离(i≠j)
31 e1 = torch.rand(n, m)
32 e2 = torch.rand(n, m)
33 print('原始数据为:\n', e1, '\n', e2)
34 loss_l1_1 = torch.zeros(n)
35 loss_l2_1 = torch.zeros(n)
36 # 自己写的距离度量函数
37 loss_l1 = compute_l1_similarity(e1, e2)
38 loss_l2 = compute_l2_similarity(e1, e2)
39 loss_cosine = compute_cosine_similarity(e1, e2)
40 # pytorch库里自带的距离度量函数
41 for i in range(n):
42     loss_l1_1[i] = torch.dist(e1[i], e2[i], p=1)
43     loss_l2_1[i] = torch.dist(e1[i], e2[i], p=2)
44 loss_cosine_1 = F.cosine_similarity(e1, e2)
45 # 第一个结果是自己写的函数
46 # 第二个结果是pytorch库里自带的函数
47 # n是多少,就出来多少个值
48 print('两者的曼哈顿距离为:\n', loss_l1, '\n', loss_l1_1)
49 print('两者的欧式距离为:\n', loss_l2, '\n', loss_l2_1)
50 print('两者的余弦相似度为:\n', loss_cosine, '\n', loss_cosine_1)

2. 结果

D:\ProgramData\Anaconda3\python.exe "D:/Python code/2023.3 exercise/loss/loss_test.py"
原始数据为:
 tensor([[0.7576, 0.2793, 0.4031, 0.7347, 0.0293],
        [0.7999, 0.3971, 0.7544, 0.5695, 0.4388],
        [0.6387, 0.5247, 0.6826, 0.3051, 0.4635]]) 
 tensor([[0.4550, 0.5725, 0.4980, 0.9371, 0.6556],
        [0.3138, 0.1980, 0.4162, 0.2843, 0.3398],
        [0.5239, 0.7981, 0.7718, 0.0112, 0.8100]])
两者的曼哈顿距离为:
 tensor([1.5195, 1.4075, 1.1176]) 
 tensor([1.5195, 1.4075, 1.1176])
两者的欧式距离为:
 tensor([0.7873, 0.6938, 0.5498]) 
 tensor([0.7873, 0.6938, 0.5498])
两者的余弦相似度为:
 tensor([0.8395, 0.9767, 0.9345]) 
 tensor([0.8395, 0.9767, 0.9345])

Process finished with exit code 0

注意:这里只是求向量之间的距离度量,并不是矩阵范数。上下两个结果分别为自己根据距离定义写的函数、pytorch自带的函数,可以看到得到的结果是一致的。

3. 参考文献

[1] 相似性度量 – 凯鲁嘎吉 – 博客园

[2] 向量范数与矩阵范数 – 凯鲁嘎吉 – 博客园

标签:loss,similarity,Python,torch,距离,度量,e1,向量,e2
From: https://www.cnblogs.com/kailugaji/p/17254145.html

相关文章

  • python基础篇:什么是装饰器?装饰器有什么用?
    上一篇介绍了python的函数,本文将介绍Python的装饰器,装饰器应用非常广泛,一定要好好掌握啊什么是装饰器装饰器是一种Python语言的特性,它允许在不修改已有函数的情况下,向......
  • Python推导式、迭代器与生成器
    列表推导式[表达式for局部变量名in可迭代对象][表达式for局部变量名in可迭代对象if条件]如:print([i**2foriinrange(1,10)])#[1,4,9,16,25,36,......
  • 用python中的列表构建一个pandas
    importpandasaspd#创建一个包含学生信息的列表students=[['Alice',20,80],['Bob',21,75],['Charlie',19,90],['Dave',18,65]]#将列表转换为Data......
  • 机器学习算法(四): 基于支持向量机的分类预测(SVM)
    机器学习算法(四):基于支持向量机的分类预测本项目链接:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc1.相关流程支持向量机(SupportVectorMachine,SVM......
  • bing写的一段python程序
      让ai写一个和chatgpt交互的程序。用户在控制台输入内容来交互。程序不一定能正常运行,但是可以参考如果prompt参数长度过长,可以将其分成多个部分,然后将每个部分......
  • [oeasy]python0115_西里尔字符集_Cyrillic_俄文字符编码_KOI_8859系列
    各语言字符编码回忆上次内容上次回顾了非ascii的拉丁字符编码的进化过程0-127是ascii的领域西欧、北欧语言大多使用拉丁字符由iso组织制定iso-8859-1北欧原来不是......
  • 商城网站毕业设计( Python +Vue)
    网站介绍基于python开发的电子商城网站,平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。这是给师弟开发的毕业设计。整个平台包......
  • Python爬虫实战:从零开始制作一个网络爬虫
    网络爬虫,又称网页蜘蛛、网页抓取器等,是一种从互联网上自动抓取网页数据的程序。Python是编写网络爬虫的最佳语言,因为它具有简洁的语法、丰富的库和强大的社区支持。本文将......
  • Python3之sqlalchemy
    1.SQLAlchemy介绍SQLAlchemy是Python中一款非常优秀的ORM框架,它可以与任意的第三方web框架相结合,如flask、tornado、django、fastapi等。SQLALchemy相较于Django......
  • python pandas timestamp
    #1.构造Timestamp#ts_input参数支持4种格式,datetime-like,str,int,float#1.1datetime-likeimportdatetimeimportpandasaspdtime_str="2020-08-0110:2......