如何定义比较范围的最大和最小数量?例如,我有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之间。如何做到这一点?
答案 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.0
。 cos(theta)
是1.0。