vom*_*dle 7 theory algorithm recommendation-engine data-mining collaborative-filtering
我有一个大约70万用户的数据库以及他们观看/收听/阅读/购买/等的项目.我想建立一个推荐引擎,推荐基于具有相似品味的用户喜欢的新项目,以及实际上找到用户可能希望在我正在构建的社交网络上成为朋友的人(类似于最后.调频).
我的要求如下:
请不要给出像"使用pysuggest或mahout"这样的答案,因为那些实现了大量的算法,我正在寻找最适合我的数据/使用的算法.我一直对Neo4j感兴趣,以及如何将它们表示为用户和项目之间的连接图.
要确定用户之间的相似性,您可以跨用户向量运行余弦或皮尔逊相似性(在Mahout中发现,并且实际上在网络上的任何地方!)。所以你的数据表示应该看起来像
u1 [1,2,3,4,5,6]
u2 [35,24,3,4,5,6]
u1 [35,3,9,2,1,11]
Run Code Online (Sandbox Code Playgroud)
在要考虑多个项目的时候,您可以使用上述方法来确定某人的个人资料的相似程度。相关分数越高,他们拥有非常相似的项目的可能性越大。您可以设置一个阈值,以使相似度为.75的用户的个人资料中包含相似的项目集。
在缺少价值的地方,您当然可以弥补自己的价值。我只是将它们保留为二进制,然后尝试混合各种不同的算法。这就是所谓的合奏。
总体而言,您正在寻找一种称为基于项目的协作过滤作为设置的推荐方面,并且还用于标识相似的项目。这是一种标准的推荐算法,几乎可以满足您的所有要求。
尝试查找相似用户时,您可以跨用户向量执行某种类型的相似性度量。
关于Python,这本名为《集体智慧编程》的书以python给出了所有示例,因此请阅读本书并阅读第1章。
将所有这些都表示为图形会有点麻烦,因为您不朽的表示是二分图。有很多推荐方法都使用基于图的方法,但通常不是最佳性能的方法。
实际上,这是像 Neo4j 这样的图形数据库的优点之一。
因此,如果您的数据模型如下所示:
user -[:LIKE|:BOUGHT]-> item
Run Code Online (Sandbox Code Playgroud)
您可以使用如下的 cypher 语句轻松地为用户获得推荐:
start user = node:users(id="doctorkohaku")
match user -[r:LIKE]->item<-[r2:LIKE]-other-[r3:LIKE]->rec_item
where r.stars > 2 and r2.stars > 2 and r3.stars > 2
return rec_item.name, count(*) as cnt, avg(r3.stars) as rating
order by rating desc, cnt desc limit 10
Run Code Online (Sandbox Code Playgroud)
这也可以使用 Neo4j Core-API 或 Traversal-API 来完成。
Neo4j 有一个Python API,也可以运行密码查询。
免责声明:我为 Neo4j 工作
还有一些由Marko Rodriguez撰写的关于协同过滤的有趣文章。
归档时间: |
|
查看次数: |
4519 次 |
最近记录: |