范围内的数字列表之间的相似性?

时间:2016-03-23 02:58:35

标签: python cosine-similarity

如何定义比较范围的最大和最小数量?例如,我有Shane的以下电影评级; [5,5,5,5,5,5,5]和Jaycee评级列表; [1,1,1,1,1,1,1],它们超出5星。假装这些是字典中的.values(),电影按顺序排列。

使用以下功能时:

from math import *

def square_rooted(x):

    return round(sqrt(sum([a*a for a in x])),3)

def cosine_similarity(x,y):

    numerator = sum(a*b for a,b in zip(x,y))
    denominator = square_rooted(x)*square_rooted(y)
    return round(numerator/float(denominator),3)

print cosine_similarity([5, 5, 5, 5, 5, 5, 5], [1, 1, 1, 1, 1, 1, 1])

当它应该接近比率的低端时,输出为1.0,可能在0.5左右,因为它在5和1之间。如何做到这一点?

1 个答案:

答案 0 :(得分:2)

从你的例子:

numerator = 5*1*7 = 35

并且

denominator = sqrt(5*5*7) * sqrt(1*1*7) = 5 * sqrt(7) * sqrt(7) = 35

这就是你得到1.0的原因,如果考虑余弦相似度公式,这是有道理的:

a.b = ||a|| ||b|| cos (theta)

请注意,由于您有[5, 5, ..., 5][1, 1, ..., 1],因此您的两个矢量指向7维坐标中的完全相同的方向。因此,它具有匹配的余弦相似度,即1.0cos(theta)是1.0。