Neo4j 做推荐 (11)—— 协同过滤(余弦相似度)

余弦距离:

Jaacard相似度对于比较电影很有用,实际上是比较两组(类型、演员、导演等)。但是对于电影评级,每个关系都有一个我们可以考虑的权重。

余弦相似度:

余弦相似性公式

两个用户的余弦相似度将告诉我们两个用户对电影的偏好有多相似。具有高余弦相似度的用户将具有类似的偏好。

根据余弦相似度,找到与Cynthia Freeman 最相似偏好的用户。


1
2
3
4
5
6
7
8
// Most similar users using Cosine similarity
MATCH (p1:User {name: "Cynthia Freeman"})-[x:RATED]->(m:Movie)<-[y:RATED]-(p2:User)
WITH COUNT(m) AS numbermovies, SUM(x.rating * y.rating) AS xyDotProduct,
SQRT(REDUCE(xDot = 0.0, a IN COLLECT(x.rating) | xDot + a^2)) AS xLength,
SQRT(REDUCE(yDot = 0.0, b IN COLLECT(y.rating) | yDot + b^2)) AS yLength,
p1, p2 WHERE numbermovies > 10
RETURN p1.name, p2.name, xyDotProduct / (xLength * yLength) AS sim
ORDER BY sim DESC LIMIT 100;

在 “Neo4j 做推荐 (11)—— 协同过滤(余弦相似度)” 上有 2 条评论

发表评论