Neo4j 做推荐 (11)—— 协同过滤(余弦相似度)
2019-08-18 本文已影响0人
程序员imHou
余弦距离:
Jaacard相似度对于比较电影很有用,实际上是比较两组(类型、演员、导演等)。但是对于电影评级,每个关系都有一个我们可以考虑的权重。
余弦相似度:
![](https://img.haomeiwen.com/i1350464/d8dc1c0cb5acaf7d.png)
两个用户的余弦相似度将告诉我们两个用户对电影的偏好有多相似。具有高余弦相似度的用户将具有类似的偏好。
根据余弦相似度,找到与Cynthia Freeman 最相似偏好的用户。
// 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;