用于查找类似项目和用户的推荐算法(和实现)

vom*_*dle 7 theory algorithm recommendation-engine data-mining collaborative-filtering

我有一个大约70万用户的数据库以及他们观看/收听/阅读/购买/等的项目.我想建立一个推荐引擎,推荐基于具有相似品味的用户喜欢的新项目,以及实际上找到用户可能希望在我正在构建的社交网络上成为朋友的人(类似于最后.调频).

我的要求如下:

  • 我数据库中的大多数"用户"实际上并不是我网站的用户.它们是从第三方来源挖掘的数据.但是,在推荐用户时,我希望将搜索范围限制为我网站的成员(同时仍然利用更大的数据集).
  • 我需要考虑多个项目.不是"喜欢你喜欢这一项的人......",而是"喜欢你喜欢的大多数物品的人......".
  • 我需要计算用户之间的相似性,并在查看他们的个人资料时显示它们(味道 - 米).
  • 有些项目是评级的,有些则不是.评级是1-10,而不是布尔值.在大多数情况下,如果不存在其他统计数据,则可以从其他统计数据中扣除评级值(例如,如果用户喜欢某个项目,但未对其进行评级,我可以假设评级为9).
  • 它必须以某种方式与Python代码交互.优选地,它应该使用单独的(可能是NoSQL)数据库并公开API以在我的web后端中使用.我正在制作的项目使用Pyramid和SQLAlchemy.
  • 我想考虑项目类型.
  • 我希望在项目页面上显示类似的项目,包括其类型(可能是标签)和喜欢该项目的用户(如亚马逊的"购买此项目的人"和Last.fm艺术家页面).仍应显示来自不同类型的项目,但具有较低的相似度值.
  • 我希望通过一些示例来详细记录算法的实现.

请不要给出像"使用pysuggest或mahout"这样的答案,因为那些实现了大量的算法,我正在寻找最适合我的数据/使用的算法.我一直对Neo4j感兴趣,以及如何将它们表示为用户和项目之间的连接图.

Ste*_*eve 5

要确定用户之间的相似性,您可以跨用户向量运行余弦或皮尔逊相似性(在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章。

将所有这些都表示为图形会有点麻烦,因为您不朽的表示是二分图。有很多推荐方法都使用基于图的方法,但通常不是最佳性能的方法。


Mic*_*ger 4

实际上,这是像 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撰写的关于协同过滤的有趣文章。