【发布时间】: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]]
所以a 和b 是1x5 向量,s 是5x5 矩阵,描述了a 和b 中的特征有多相似。
现在,我想计算 a 和 b 之间的软余弦距离,但要考虑特征之间的相似性。我找到了这个公式,它应该计算出我需要的东西:
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