余弦相似性 - 作为推荐引擎的缺点?

时间:2014-10-07 21:33:10

标签: neo4j machine-learning knn recommendation-engine cosine-similarity

我已经看到在K-Nearest Neighbor算法中使用Cosine Similarity来根据用户偏好生成推荐。在这些模型中,给定产品的用户评级被视为向量,然后两个用户之间的相似性由两个向量之间的余弦相似性确定。 (例如http://www.neo4j.org/graphgist?8173017

我的问题是: 任何人都可以解释使用Cosine Similarity的推荐引擎如何考虑并行用户偏好? 在我看来,如果两个用户具有完全极性评级偏好,并且如果他们具有并行(但不同)偏好,则会产生1的余弦相似度。例如,如果一个用户将5部电影评为1在10颗星中,另一位用户对同样的5部电影评分为10颗星中的10颗,他们的余弦相似度为1(在我看来,这似乎是衡量用户相似性的不准确度)。

cosine similarity

问题示例: 如果我们测量两个用户的用户偏好,并且我们测量他们对3个产品的偏好,我们可以将他们的偏好存储为两个向量:

a =(1,1,1)和b =(10,10,10)

然后我们可以使用余弦相似度来衡量它们彼此之间的相似程度。但在这种情况下,它们的余弦相似度将为1,即使它们代表极端相反的用户偏好。

1 个答案:

答案 0 :(得分:3)

众所周知,香草余弦相似度有一个重要的drawback - 不考虑不同用户之间评定量表的差异。

调整的余弦相似性通过从每个共同对中减去相应的用户平均值来抵消该缺点。形式上,项目i和j之间的相似性使用此 计划由。给出 enter image description here

此处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