在pytorch中,可以使用torch.cosine_similarity函数对两个向量或者张量计算余弦相似度。先看一下pytorch源码对该函数的定义:

class CosineSimilarity(Module):r"""Returns cosine similarity between :math:`x_1` and :math:`x_2`, computed along dim... math ::\text{similarity} = \dfrac{x_1 \cdot x_2}{\max(\Vert x_1 \Vert _2 \cdot \Vert x_2 \Vert _2, \epsilon)}.Args:dim (int, optional): Dimension where cosine similarity is computed. Default: 1eps (float, optional): Small value to avoid division by zero.Default: 1e-8Shape:- Input1: :math:`(\ast_1, D, \ast_2)` where D is at position `dim`- Input2: :math:`(\ast_1, D, \ast_2)`, same shape as the Input1- Output: :math:`(\ast_1, \ast_2)`Examples::>>> input1 = torch.randn(100, 128)>>> input2 = torch.randn(100, 128)>>> cos = nn.CosineSimilarity(dim=1, eps=1e-6)>>> output = cos(input1, input2)"""__constants__ = ['dim', 'eps']def __init__(self, dim=1, eps=1e-8):super(CosineSimilarity, self).__init__()self.dim = dimself.eps = epsdef forward(self, x1, x2):return F.cosine_similarity(x1, x2, self.dim, self.eps)

可以看到该函数一共有四个参数:

  • x1和x2为待计算余弦相似度的张量;
  • dim为在哪个维度上计算余弦相似度;
  • eps是为了避免被零除而设置的一个小数值。

看一下例子:

import torchx = torch.FloatTensor(torch.rand([10]))
print('x', x)
y = torch.FloatTensor(torch.rand([10]))
print('y', y)similarity = torch.cosine_similarity(x, y, dim=0)
print('similarity', similarity)
x tensor([0.2817, 0.6858, 0.1820, 0.7357, 0.7625, 0.3569, 0.4781, 0.8485, 0.1385,0.5654])
y tensor([0.3366, 0.8959, 0.7776, 0.2475, 0.9202, 0.2845, 0.7284, 0.8150, 0.2577,0.0085])
similarity tensor(0.8502)

再看一个例子,给定一个张量,计算多个张量与它的余弦相似度,并将计算得到的余弦相似度标准化。

import torchdef get_att_dis(target, behaviored):attention_distribution = []for i in range(behaviored.size(0)):attention_score = torch.cosine_similarity(target, behaviored[i].view(1, -1))  # 计算每一个元素与给定元素的余弦相似度attention_distribution.append(attention_score)attention_distribution = torch.Tensor(attention_distribution)return attention_distribution / torch.sum(attention_distribution, 0)       # 标准化a = torch.FloatTensor(torch.rand(1, 10))
print('a', a)
b = torch.FloatTensor(torch.rand(3, 10))
print('b', b)similarity = get_att_dis(target=a, behaviored=b)
print('similarity', similarity)
a tensor([[0.9255, 0.2194, 0.8370, 0.5346, 0.5152, 0.4645, 0.4926, 0.9882, 0.2783,0.9258]])
b tensor([[0.6874, 0.4054, 0.5739, 0.8017, 0.9861, 0.0154, 0.8513, 0.8427, 0.6669,0.0694],[0.1720, 0.6793, 0.7764, 0.4583, 0.8167, 0.2718, 0.9686, 0.9301, 0.2421,0.0811],[0.2336, 0.4783, 0.5576, 0.6518, 0.9943, 0.6766, 0.0044, 0.7935, 0.2098,0.0719]])
similarity tensor([0.3448, 0.3318, 0.3234])

未完待续...

pytorch计算余弦相似度相关推荐

  1. NLP-文本匹配-2016:MaLSTM(ManhaĴan LSTM,孪生神经网络模型)【语句相似度计算:用于文本对比,内容推荐,重复内容判断】【将原本的计算余弦相似度改为一个线性层来计算相似度】

    <MaLSTM原始论文:Siamese Recurrent Architectures for Learning Sentence Similarity> MaLSTM模型(ManhaĴa ...

  2. php数据分析引擎,PHP数据分析引擎计算余弦相似度算法示例

    php 的 PHP数据分析引擎计算余弦相似度算法示例 本文实例讲述了PHP数据分析引擎计算余弦相似度算法.分享给大家供大家参考,具体如下: 关于余弦相似度的相关介绍可参考百度百科: /** * 数据分 ...

  3. 相似度算法 php,PHP计算余弦相似度算法

    这篇文章主要介绍了PHP数据分析引擎计算余弦相似度算法,结合具体实例形式分析了php计算余弦相似度的操作步骤与相关实现技巧,需要的朋友可以参考下 本文实例讲述了PHP数据分析引擎计算余弦相似度算法.分 ...

  4. java计算余弦相似度

    您可以使用以下java代码来计算余弦相似度 import java.util.List;public class CosineSimilarity {public static double cosi ...

  5. 使用Keras计算余弦相似度(Cosine Similarity)

    因为Merge函数在Keras新版本中已经不再使用了,在计算批次余弦相似度时,需要自定义函数.余弦相似度定义如下: 要计算两个向量相似度有如下步骤: 分别计算两个向量l2范式,计算两个向量的点乘 点乘 ...

  6. 从利用gensim 训练好的word2vec模型中取出向量并计算余弦相似度,Levenshtein distance 计算

    1.Levenshtein distance 表示两个字符串之间,由一个转成另一个所需的最少编辑次数,允许的操作有:替换.插入和删除 导入包: import Levenshtein #Levensht ...

  7. ES dense_vector 计算余弦相似度

    先上查询语句 {"from": 0,"size": 100,"query": {"function_score": {& ...

  8. python用角度计算余弦值_Python 使用sklearn计算余弦相似度

    背景 在计算相似度时,常常用到余弦夹角来判断相似度,Cosine(余弦相似度)取值范围[-1,1],当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1,两个方向正交 ...

  9. mysql计算余弦相似度_余弦相似度公式及推导案例

    定义 余弦相似度通过测量两个向量的夹角的余弦值来度量它们之间的相似性.0度角的余弦值是1,而其他任何角度的余弦值都不大于1:并且其最小值是-1.从而两个向量之间的角度的余弦值确定两个向量是否大致指向相 ...

最新文章

  1. 2021年中国GDP突破110万亿元 同比增长8.1%
  2. 横空出世,席卷Csdn [评微软等公司数据结构+算法面试100题]
  3. 2022年全球及中国豪华商业墙纸行业运营规模状况与投资产值预测报告
  4. mysql换成oracle_mysql数据库迁移至Oracle数据库
  5. p沟道mos管导通条件_通俗易懂:MOS管基本知识(快速入门)
  6. POJ1523:SPF(无向连通图求割点)
  7. Python/word.so: undefined symbol: _ZNK4Word7reverseEv
  8. java datarow 使用_DataRow中的链接(数据表)
  9. server sql 去 反斜杠_%00截断配合反序列化的奇妙利用
  10. 【codevs1582】【BZOJ1228】E和D,博弈
  11. 今天可免费用VR观看第51届超级碗大赛直播
  12. n1怎么进入线刷模式_诺讯N1线刷救砖教程 刷机包下载
  13. netbeans11安装教程_Netbeans使用教程
  14. Hive报错Error during job, obtaining debugging information...
  15. everedit选择_Jass编辑器推荐 Everedit
  16. ERNIE(二妮儿)模型初探
  17. nltk,wordnet安装时出现问题关于omw-1.4
  18. B站UP主发起停更潮
  19. 粗糙集约简 程序 matlab,粗糙集属性约简matlab程序
  20. PTA——互评成绩(c语言)

热门文章

  1. SharePoint客户端对象模型—任务日历生成
  2. Dubbo-admin管理平台的下载以及启动
  3. thinkpaidE450 win10 进入bios
  4. 【数据结构】带头+双向+循环链表的 增,删,查,改 的实现
  5. matlab最简矩阵,Matlab将一般矩阵变换为行最简矩阵
  6. Windows上搭建rtsp-simple-server流媒体服务器实现rtsp、rtmp等推流以及转流、前端html与Vue中播放hls(m3u8)视频流
  7. android 判断手机计步_一种在Android手机上实现计步器的方法
  8. 流动性视角中 CeFi 的功与过
  9. 如何借助 AI ,生成专属图标? #iconify AI
  10. 小鼠脑立体定位图谱_探索从未止步!瑞沃德首款国产电动脑立体定位仪发布