【问题标题】:Soft cosine distance between two vectors (Python)两个向量之间的软余弦距离(Python)
【发布时间】:2021-07-15 18:47:51
【问题描述】:

我想知道是否有计算两个数字向量之间的 soft 余弦距离的好方法。到目前为止,我已经看到了句子的解决方案,但是不幸的是,这对我没有帮助。

假设我有两个这样的向量:

a = [0,.25,.25,0,.5]
b = [.5,.0,.0,0.25,.25]

现在,我知道向量中的特征在它们之间表现出某种程度的相似性。这是通过以下方式描述的:

s = [[0,.67,.25,0.78,.53]
     [.53,0,.33,0.25,.25]
     [.45,.33,0,0.25,.25]
     [.85,.04,.11,0,0.25]
     [.95,.33,.44,0.25,0]]

所以ab1x5 向量,s5x5 矩阵,描述了ab 中的特征有多相似。

现在,我想计算 ab 之间的软余弦距离,但要考虑特征之间的相似性。我找到了这个公式,它应该计算出我需要的东西: soft cosine formula

我已经尝试使用 numpy 实现它:

import numpy as np

soft_cosine = 1 - (np.dot(a,np.dot(s,b)) / (np.sqrt(np.dot(a,np.dot(s,b))) * np.sqrt(np.dot(a,np.dot(s,b)))))

应该产生一个介于 0 和 1 之间的数字,数字越大表示 a 和 b 之间的距离越大。但是,我在具有多个向量 a 和 b 的较大数据帧上运行它,并且对于某些它会产生负值。很明显,我做错了什么。

非常感谢任何帮助,我很高兴澄清需要澄清的内容!

最好, 约翰内斯

【问题讨论】:

  • 我找到了“解决方案”。该公式已正确执行。事实证明,允许不对称相似性的相似性矩阵(i 和 j 可能比 j 与 i 更相似)确实可以产生低于 0 和高于 1 的值。再次感谢您的帮助——它确实切断了很多我的代码太胖了!

标签: python python-3.x numpy cosine-similarity


【解决方案1】:

soft_cosine = 1 - (np.dot(a,np.dot(s,b)) / (np.sqrt(np.dot(a,np.dot(s,b))) * np.sqrt(np.dot(a,np.dot(s,b)))))

我认为你需要改变:分母既有“a”又有“b”。

soft_cosine = 1 - (np.dot(a,np.dot(s,b)) / (np.sqrt(np.dot(a,np.dot(s,a))) * np.sqrt(np.dot(a,np.dot(s,b))))).

【讨论】:

  • 您能否指定如何计算两个向量之间的“S”相似度矩阵?
【解决方案2】:

据我所知,这可能只是一个公式错误。你能用我的试试吗?

soft_cosine = a @ (s@b) / np.sqrt( (a @ (s@a) ) * (b @ (s@b) ) )

我使用 @ 运算符(它是 ndarrays 上 np.matmul 的简写),因为我觉得写起来更简洁:它只是矩阵乘法,无论是一维还是二维。这是一种计算两个一维数组之间的点积的简单方法,代码比通常的np.dot 函数少。

【讨论】:

  • 嘿!谢谢你的建议。我在我的df上试过了。原来它产生与我的版本完全相同的输出,包括负值。 (唉,语法不那么复杂!)
  • 我不明白为什么你只期望正值,根据软余弦的定义,它应该产生从-1到1的值。
  • 感谢 RandomGuy。使用我使用的向量和上面的公式,它会产生 0 到 1 之间的值。
猜你喜欢
  • 1970-01-01
  • 2019-11-10
  • 2017-09-15
  • 1970-01-01
  • 2015-12-17
  • 2020-02-11
  • 2016-08-23
  • 1970-01-01
  • 2020-04-21
相关资源
最近更新 更多