寻找相似物品和用户的推荐算法(及实现)

7
我有一个包含约700k用户及其观看/听取/阅读/购买等物品的数据库。 我想要建立一个推荐引擎,根据具有相似品味的用户所喜欢的物品来推荐新商品。同时,我还想在正在构建的社交网络上找到用户可能想要添加为好友的人(类似于last.fm)。
我的要求如下: 1. 我数据库中的“大多数”用户实际上不是我的网站用户。它们是从第三方来源进行数据挖掘得到的。但是,在推荐用户时,我希望将搜索限制为是我的网站成员的人(同时仍然利用更大的数据集)。 2. 我需要考虑多个条目,不是“像你喜欢的这个项目的人...”,而是“喜欢你所享受的大多数项目的人...”。 3. 我需要计算用户之间的相似度,并在查看他们的个人资料(品味测量表)时显示。 4. 有些项目被评价了,其他项目则没有。评分从1-10分,而不是布尔值。在大多数情况下,如果其他统计数据中不存在评分值,可以通过其他统计数据推断出评分值(例如,如果用户收藏了一个项目,但没有对其进行评分,我可以假设评分为9)。 5. 它必须以某种方式与Python代码交互。最好使用单独的(可能是NoSQL)数据库,并公开一个API供我在Web后端中使用。我正在使用Pyramid和SQLAlchemy制作项目。 6. 我希望考虑物品流派。 7. 我希望根据物品的类型(可能是标签)和喜欢该物品的用户所喜欢的内容来显示类似物品,就像Amazon的“购买此物品的人”和Last.fm艺术家页面一样。不同流派的物品仍应显示,但相似度值较低。 8. 我希望有一个文档完整的算法实现,并提供一些示例。
请不要给出像“使用pysuggest或mahout”这样的答案,因为它们实现了大量算法,而我正在寻找最适合我的数据/用途的算法。我对Neo4j很感兴趣,以及如何将其表达为用户和物品之间连接的图形。
3个回答

5
为了确定用户之间的相似度,您可以在用户向量上运行余弦或皮尔逊相似度(在Mahout和互联网上到处都可以找到!)。因此,您的数据表示应该类似于:
 u1  [1,2,3,4,5,6] 
 u2  [35,24,3,4,5,6] 
 u1  [35,3,9,2,1,11] 

在考虑多个项目时,您可以使用上述内容确定某人的档案有多相似。相关性得分越高,他们非常相似的可能性就越大。您可以设置阈值,因此具有0.75相似度的人具有类似的档案。
如果您缺少值,当然可以自己编造值。我只会保持它们是二进制的,并尝试混合各种不同的算法。这被称为集成。
总体而言,您正在寻找称为基于项目的协作过滤的东西,作为您设置的推荐方面,并用于识别类似的项目。它是一个标准的推荐算法,几乎可以完成您所要求的一切。
在尝试查找相似用户时,您可以在用户向量之间执行某种相似性度量。
关于Python,名为《集体智慧编程》的书提供了所有Python示例,请拿起一本并阅读第1章。
将所有这些表示为图形将有些问题,因为您的无限表示是Bipartite Graph。有很多推荐方法采用基于图形的方法,但通常不是最佳表现方法。

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,也能运行cypher查询。

免责声明:我为Neo4j工作

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


对于类型,我建议使用与物品连接的类型类别节点,并在匹配子句中考虑这些节点。 - Michael Hunger
1
这确实非常方便,发布的链接将信息存储在图形数据库中,而不是基于图形的推荐方法。 - Steve
谢谢您!我已经阅读了更多资料,在Neo4j文档中查看了Cypher Cookbook,它正好符合我所需的要求。我决定采用图形数据库方法来推荐引擎。 - vomitcuddle

1
我可以建议您查看我的开源项目Reco4j。它是一个基于图形的推荐引擎,可以非常简单地在像您这样的图形数据库上使用。我们支持neo4j作为图形数据库。它目前处于早期版本,但很快将会有更完整的版本可用。同时,我们正在寻找一些我们项目的使用案例,请与我联系,以便我们可以看看如何合作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接