两个向量之间的软余弦距离(Python)

两个向量之间的软余弦距离(Python),python,python-3.x,numpy,cosine-similarity,Python,Python 3.x,Numpy,Cosine Similarity,我想知道是否有一个好方法来计算两个数字向量之间的软余弦距离。到目前为止,我已经看到了句子的解决方案,但不幸的是,这对我没有帮助 假设我有两个这样的向量: 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] [.

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

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

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
之间的软余弦距离,但要考虑特征之间的相似性。我找到了这个公式,可以计算出我需要的:

我已经尝试过使用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的更大的数据帧上运行它,对于一些向量,它会产生负值。很明显,我做错了什么

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

最好的,
约翰

在我看来,这可能只是一个公式错误。你能试试我的吗

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

我使用了
@
操作符(这是on-ndarray的缩写),因为我发现它写起来更简洁:它只是矩阵乘法,不管是1D还是2D。这是一种计算两个1D数组之间点积的简单方法,代码比通常的
np.dot
函数要少。

嘿!谢谢你的建议。我在我的df上试过了。结果表明,它产生的输出与我的版本完全相同,包括负值。(唉,语法不那么复杂!)我不明白为什么你只期望正值,根据软余弦的定义,它应该产生从-1到1的值。谢谢你。通过我使用的向量和上面的公式,它产生0到1之间的值。我找到了“解决方案”。该公式已正确执行。事实证明,允许不对称相似性的相似性矩阵(i和j的相似性可能比j和i的相似性更高)确实可以产生小于0和大于1的值。再次感谢您的帮助--它确实从我的代码中删除了很多内容!