Neo4j 做推荐 (9)—— 协同过滤(人群的智慧)

简单的协同过滤

MATCH (u:User {name: "Cynthia Freeman"})-[:RATED]->(:Movie)<-[:RATED]-(o:User)

MATCH (o)-[:RATED]->(rec:Movie)

WHERE NOT EXISTS( (u)-[:RATED]->(rec) )

RETURN rec.title, rec.year, rec.plot

LIMIT 25

上面的简单的过滤方法其实存在很多问题,例如不基于流行度来进行规范或不考虑评级。

只考虑用户喜欢的类型

许多推荐系统融合了协同过滤和基于内容的方法,对于特定用户,哪些类型的评分高于平均水平?用它来评分类似的电影:

MATCH (u:User {name: "Andrew Freeman"})-[r:RATED]->(m:Movie)

WITH u, avg(r.rating) AS mean

MATCH (u)-[r:RATED]->(m:Movie)-[:IN_GENRE]->(g:Genre)

WHERE r.rating > mean

WITH u, g, COUNT(*) AS score

MATCH (g)<-[:IN_GENRE]-(rec:Movie)

WHERE NOT EXISTS((u)-[:RATED]->(rec))

RETURN rec.title AS recommendation, rec.year AS year, COLLECT(DISTINCT g.name) AS genres, SUM(score) AS sscore

ORDER BY sscore DESC LIMIT 10

分析:

1. 用户u评过的电影的平均分

2. 找出用户u评过的高于平均分的电影的分类,并对分类计数

3. 找出这些分类的相关的电影,并且这些电影是用户u没有评过分的

4. 找出电影分类中影片数最多的前10部电影

Neo4j 做推荐 (1)—— 基础数据

Neo4j 做推荐 (2)—— 基于内容的过滤

Neo4j 做推荐 (3)—— 协同过滤

Neo4j 做推荐 (4)—— 基于内容的过滤(续)

Neo4j 做推荐 (5)—— 基于类型的个性化建议

Neo4j 做推荐 (6)—— 加权内容算法

Neo4j 做推荐 (7)—— 基于内容的相似度量标准

Neo4j 做推荐 (8)—— 协同过滤(利用电影评级)

Neo4j 做推荐 (9)—— 协同过滤(人群的智慧)

Neo4j 做推荐 (10)—— 协同过滤(皮尔逊相似性)

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

Neo4j 做推荐 (12)—— 协同过滤(基于邻域的推荐)

你可能感兴趣的:(Neo4j 做推荐 (9)—— 协同过滤(人群的智慧))