我已经看到在K最近邻居算法中使用了余弦相似度来根据用户偏好生成推荐。在这些模型中,将给定产品的用户评分视为向量,然后通过两个向量之间的余弦相似度确定两个用户之间的相似度。 (例如http://www.neo4j.org/graphgist?8173017)
我的问题是这样的:
谁能解释使用余弦相似度的推荐引擎如何考虑并行用户首选项?在我看来,如果两个用户具有平行(但不同)的首选项,则它们可以具有完全极性的分级首选项,但生成的余弦相似度为1。例如,如果一个用户将5部电影评为10颗星中的1部影片,而另一个用户将相同的5部电影评为10颗星中的10部,则其余弦相似度将为1(在我看来,这似乎是一种不准确的衡量标准用户相似性)。
问题示例:
如果我们要衡量两个用户的用户偏好,并且要衡量他们对3种产品的偏好,则可以将他们的偏好存储为两个向量:
a =(1,1,1)和b =(10,10,10)
然后,我们可以使用余弦相似度来衡量它们之间的相似度。但是在这种情况下,即使它们代表相反的用户偏好,它们的余弦相似度也将是1。
最佳答案
众所周知,香草余弦相似度有一个重要的drawback-不考虑不同用户之间的评分等级差异。
调整后的余弦相似度通过从每个共同评定对中减去相应的用户平均值来弥补此缺陷。正式地,使用此项的项i和j之间的相似性
方案由
这里的R¯u
是第u个用户的评分的平均值。
在您的示例中,预处理后,a和b都变为
(0,0,0). // We cannot calculate the cosine similarity since the normalizer is 0.
这在现实中是很少见的(同样,如果用户对每个项目始终评分相同,则对了解用户或项目没有任何帮助)。
假设我们在每个用户的偏好向量中添加另一个偏好分数,以使相似度可计算。
a = (1,1,1,2)
b = (10,10,10,8)
a1 = (1,2,2,1) // a user that has similar preference to a
b1 = (9,8,9,10) // another user that has similar preference to b
norm_a = a - mean(a) = [-0.25000 -0.25000 -0.25000 0.75000]
norm_b = b - mean(b) = [0.50000 0.50000 0.50000 -1.50000]
norm_a1 = [-0.50000 0.50000 0.50000 -0.50000]
norm_b1 = [0 -1 0 1]
sim(a,b) = norm_a*norm_b / (sqrt(sum(norm_a.^2)) * sqrt(sum(norm_b.^2))) = -1
类似地:
sim(a,a1) = 0.866
sim(b,b1) = -0.82