使用python在值列表上的余弦距离

时间:2013-07-29 07:48:55

标签: python arrays numpy distance cosine

我的目标是通过从列表中取一个值来计算f列表(f=[[3492.6], [13756.2], [22442.1], [22361.9], [26896.4]])中每个值的余弦相似度,并计算列表中其余值与余弦距离的余弦距离有多接近。因此,结果应该是五个不同的相似性得分。但是,出于某种原因,即使我在其他数据集上测试代码,我仍然将1.0作为余弦相似度。显然,[22361.9]更像[22442.1]而不是[13756.2](相对于距离)。见下面的代码;

import numpy.linalg as LA
import numpy as np
import sys

f=[[3492.6], [13756.2], [22442.1], [22361.9], [26896.4]]
cx = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 2)
for c in f:
     for i in f:
        cosine=cx(c, i)
        print cosine

有什么想法吗?非常感谢提前。

2 个答案:

答案 0 :(得分:0)

这里的问题是您尝试使用错误的相似性指标。余弦相似性测量两个向量的方向相似性。如果它们具有相同的方向,就像你的情况一样,因为它们都是一维的,结果总是为1.如果你试图将公式应用于一维向量,你可以很容易地检查它。

答案 1 :(得分:0)

你的“向量”都是标量,所以它们的余弦相似度都是1.0。您可以将标量视为沿一维空间中唯一轴的矢量,并且余弦相似性基于两个矢量之间的角度。在一维空间中,“向量”之间的角度始终为0,因此就此比较而言,所有“向量”都非常相似。

改为使用多维向量:

f = [ [3492.6, 2134.1],
      [13756.2, 243234.3],
      [22442.1, 23424.0],
      [22361.9, 23482.4],
      [26896.4, 126875.4] ]

输出:

1.0
0.57
0.97
0.97
0.69
0.57
1.0
0.76
0.76
0.99
0.97
0.76
1.0
1.0
0.85
0.97
0.76
1.0
...

此列表中剩余的1.0值来自将矢量与其自身进行比较的位置,因此您可能希望跳过这些值(因为它们总是会导致1.0)。