编写基本推荐引擎

时间:2010-10-29 12:45:56

标签: recommendation-engine

我正在寻找一个基本的推荐引擎,它将采用并存储一个数字ID列表(与书籍相关),将这些ID与具有大量相同ID的其他用户进行比较,并根据这些ID推荐其他书籍

经过一段谷歌搜索后,我发现了this article,它讨论了Slope One算法的实现,但似乎依赖于用户对被比较项目进行评级。理想情况下,我希望在不需要用户提供评级的情况下实现这一目标。我假设如果用户在他们的收藏中有这本书,他们会喜欢它。

虽然我觉得我可以默认每本书的评级为10,但我想知道我是否可以使用更高效的算法。理想情况下,我想动态计算这些建议(避免批量计算)。任何建议,将不胜感激。

3 个答案:

答案 0 :(得分:11)

您的任务的基本算法是collaborative memory-based推荐系统。这很容易实现,特别是当您的项目(在您的案例中)只有ID而没有其他功能时。

但是,正如您已经说过的那样,您需要来自用户的某些评级。但是不要考虑像1到5星的评级,但更像是二元选择,如0(书不读)和1(书读),或感兴趣的不对感兴趣。

然后使用适当的 distance measure 计算所有用户(及其项目集)与您自己之间的差异,选择 n 最相似的用户你自己(活跃用户是谁)并挑选你没有评价的项目(或考虑,选择0)。

我认为在这种情况下,一个好的距离测量将是<1>范围距离,或者有时称为曼哈顿距离。但是,您必须尝试使用​​数据集才能获得最佳结果。

本主题的一个很好的介绍是Breese等人的论文,协同过滤的预测算法的实证分析。可用here(PDF)。对于研究论文,这是一个容易阅读。

答案 1 :(得分:2)

Apriori algorithm可以根据用户感兴趣的项目集为您提供建议。你必须定义自己的有趣集合的概念,例如用户在单个订单中购买的商品,用户购买的商品,用户评价的商品,用户详细浏览的商品。

Apriori算法需要批处理,但存在可能不需要批处理的改进。这些是AprioriTid和AprioriHybrid(对不起,没有链接)。

答案 2 :(得分:0)

@ndg这是非常有见地的,作为在这个领域工作的人,我认为你正确使用了相当于〜{0,1}评级系统。星级评分中的大多数差异只是噪音。你可以允许{0,1,2}加上“爱它!”按钮但是用户在使用这些按钮时不一致,所以限制选择是很好的。 Hotpot让用户拥有10种超级爱情,让它保持一致。

我的建议是要在过于宽泛的笔触中小心绘画。换句话说,通用算法是最简单的,但你错过了机会主义的机会。

获取您非常熟悉的小数据集 - 比如让您的一些朋友使用该网站 - 并记下可能对用户距离评级产生正面或负面影响的所有因素。然后在建模过程中,您必须决定哪些因素以及如何/多少。

请记住,规范的数量大约是曲线数量的大小。你可能想要考虑一个quasinorm,pseudonorm,甚至是非连续的规范。

我认为没有理由使用曼哈顿规范,事实上我会使用基于图形的规范来计算用户之间的距离。