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

时间:2012-01-19 19:25:55

标签: algorithm theory data-mining recommendation-engine collaborative-filtering

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

我的要求如下:

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

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

3 个答案:

答案 0 :(得分:4)

要确定用户之间的相似性,您可以在用户向量中运行余弦或皮尔逊相似性(在Mahout中找到并且在网上的所有位置!)。因此,您的数据表示应该类似于

 u1  [1,2,3,4,5,6] 
 u2  [35,24,3,4,5,6] 
 u1  [35,3,9,2,1,11] 

在您想要考虑多个项目的位置,您可以使用上述内容来确定某些人员配置文件的相似程度。相关分数越高,他们拥有非常相似的项目的可能性就越大。您可以设置阈值,以便具有.75相似度的人在其个人资料中具有类似的项目集。

当你缺少价值观时,你当然可以构成自己的价值观。我只是保留它们二进制并尝试混合各种不同的算法。这被称为合奏。

总体而言,您正在寻找一种称为基于项目的协同过滤作为您设置的推荐方面,并且还用于识别类似项目。它是一种标准推荐算法,几乎可以满足您的所有要求。

尝试查找类似用户时,您可以在用户向量中执行某种类型的相似性指标。

关于Python,这本名为集体智能编程的书在python中提供了所有样本,所以去拿一份副本并阅读第1章。

将所有这些表示为图表将有点过量,因为你的不朽代表是Bipartile Graph。有许多推荐方法使用基于图表的方法,但它通常不是最佳表现方法。

答案 1 :(得分:4)

实际上,这是像Neo4j这样的图形数据库的甜点之一。

因此,如果您的数据模型如下所示:

user -[:LIKE|:BOUGHT]-> item

您可以使用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

这也可以使用Neo4j Core-API或Traversal-API完成。

Neo4j有Python API,也可以运行密码查询。

免责声明:我为Neo4j工作

Marko Rodriguez还有一些关于协同过滤的有趣文章。

答案 2 :(得分:1)

我建议您查看我的开源项目Reco4j。它是一个基于图形的推荐引擎,可以像你这样的图形数据库以非常直接的方式使用它。我们支持图形数据库neo4j。它处于早期版本,但很快就会有更完整的版本。与此同时,我们正在寻找我们项目的一些用例,所以请联系我,以便我们了解我们如何合作。