【问题标题】:Writing a basic recommendation engine [closed]编写一个基本的推荐引擎[关闭]
【发布时间】:2010-10-29 12:45:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: recommendation-engine


    【解决方案1】:

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

    但是,正如您已经说过的,您需要用户对项目进行某种评级。但是不要认为评分是 1 到 5 星,而更像是二元选择,例如 0(未读过的书)和 1(已读过的书),或者感兴趣不有兴趣

    然后使用一个合适的distance measure来计算所有用户(以及他们的项目集)和你自己的差异,选择n个和你最相似的用户(无论活跃用户是谁)并挑选出您尚未评价的项目(或考虑过,选择 0)。

    我认为在这种情况下,一个好的距离度量应该是 1 范数距离,或者有时称为曼哈顿距离。但此时您必须对数据集进行试验才能获得最佳结果。

    Breese 等人的论文Empirical Analysis of Predictive Algorithms for Collaborative Filtering 是对这个主题的一个很好的介绍。可用here (PDF)。对于研究论文,它很容易阅读。

    【讨论】:

    • 你推荐L1规范的依据是什么?
    • @Lao Tzu:纯粹是在我自己的经验测量和测试中。当我使用只有二进制“评级”的数据(比如收藏或收藏中的书)时,它给了我很好的(就像比大多数其他规范更好)的结果。但正如我所说,这是你必须自己尝试的一点。或者翻阅一些关于这些问题的研究论文。
    • 很公平。在我正在开发的系统中,我们使用特定于产品的规范。我发现围绕给定客户的详细信息设计度量空间会更简单。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      @ndg 这很有见地,作为在该领域工作的人,我认为您使用相当于 ~ {0,1} 的评级系统是正确的。星级评分的大部分差异只是噪音。您可以允许 {0,1,2} 带有“喜欢它!”按钮,但用户在使用此类按钮时也不一致,因此限制选择可能是件好事。 Hotpot 让用户拥有 10 种超爱,保持一致。

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

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

      请记住,范数的数量大约是曲线数量的大小。您可能需要考虑准范数、伪范数,甚至是非连续范数。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-25
        • 2011-02-11
        • 1970-01-01
        • 2016-06-18
        • 2010-09-25
        • 2011-02-28
        • 1970-01-01
        • 2012-03-02
        相关资源
        最近更新 更多