4

f=[[3492.6], [13756.2], [22442.1], [22361.9], [26896.4]]我的目标是通过从列表中获取一个值来计算 f 列表 ( 因此,结果应该是五个不同的相似度分数。然而,由于某种原因,即使我在其他数据集上测试代码,我仍然得到 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

有任何想法吗?提前谢谢了。

4

2 回答 2

0

这里的问题是您尝试使用错误的相似度度量。余弦相似度衡量两个向量方向的相似度。如果它们具有相同的方向,就像您的情况一样,因为它们都是一维的,结果将始终为 1。如果您尝试将公式应用于一维向量,您可以轻松检查这一点。

于 2013-07-29T08:09:48.060 回答
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)。

于 2013-07-29T08:24:45.017 回答