【问题标题】:Approaches for Content-based Item Recommendations基于内容的项目推荐方法
【发布时间】:2011-05-31 15:34:42
【问题描述】:

我目前正在开发一个应用程序,我想在其中对类似项目进行分组。项目(如视频)可以由用户创建,并且它们的属性可以在以后更改或扩展(如新标签)。我不想像大多数协同过滤机制那样依赖用户的偏好,而是想根据项目的属性(如相似的长度、相似的颜色、相似的标签集等)比较项目的相似性。计算对于两个主要目的是必要的:为给定项目建议 x 相似项目,以及将相似项目聚类成组。

到目前为止,我的应用程序遵循异步设计,我想尽可能地解耦这个集群组件。新项目的创建或为现有项目添加新属性将通过发布组件随后可以使用的事件来宣传。

可以尽最大努力提供计算并“快照”,这意味着我可以在给定时间点获得可能的最佳结果,尽管结果质量最终会提高。

所以我现在正在寻找合适的算法来计算相似的项目和集群。重要的约束是可扩展性。最初,应用程序必须处理几千个项目,但后来也可能处理数百万个项目。当然,计算将在其他节点上执行,但算法本身应该是可扩展的。如果算法在数据的部分变化上支持某种增量模式,那就太好了。

我最初将每个项目相互比较并存储数值相似性的想法听起来有点粗略。此外,它需要n*(n-1)/2 条目来存储所有相似性,并且任何更改或新项目最终都会导致n 相似性计算。

提前致谢!

更新 tl;dr

为了澄清我想要什么,这是我的目标场景:

  • 用户生成条目(想想文档)
  • 用户编辑条目元数据(想想标签)

这是我的系统应该提供的:

  • 作为推荐的给定项目的相似条目列表
  • 相似条目的集群

两种计算都应基于:

  • 条目的元数据/属性(即相似标签的使用)
  • 因此,使用适当指标的两个条目的距离
  • 不基于用户投票、偏好或操作(与协同过滤不同)。尽管用户可以创建条目并更改属性,但计算应仅考虑项目及其属性,而不考虑与之关联的用户(就像只有项目而没有用户存在的系统一样)。

理想情况下,算法应该支持:

  • 条目属性的永久更改
  • 在更改时增量计算相似条目/集群
  • 规模
  • 如果可能的话,比简单的距离表更好(因为 O(n²) 空间复杂度)

【问题讨论】:

  • 也许将“相似”一词替换为测量比较的项目的两个方面有多远并将这些相加可能会有所帮助。总体距离 = 长度距离 + 颜色距离 + 标签距离

标签: cluster-analysis recommendation-engine collaborative-filtering collective-intelligence


【解决方案1】:

您需要基于项目而不是基于用户的协同过滤。谷歌上有很多算法可以解决这个问题。基于项目的解决方案总是比基于用户的解决方案更好地扩展。 Item based collaborative filtering in PHP 有一些易于理解的示例代码,适合您的需求:

【讨论】:

    【解决方案2】:

    K-means clustering 可能是你想要的。

    注:

    集群的数量 k 是一个输入参数:不恰当的 k 选择可能会产生糟糕的结果......它在某些数据集上效果很好,而在其他数据集上却惨遭失败。

    所以你应该考虑有多少集群,多少标签,以及什么指标。

    另请参阅堆栈溢出questions/tagged/k-means

    【讨论】:

      【解决方案3】:

      看看mahout.apache.org,而不是从头开始写。它具有您正在寻找的聚类算法以及推荐算法。它与Hadoop 一起工作,因此您可以轻松scale it out

      这将允许您根据您的关键字和/或视频描述确定集群中的类似文档。

      https://cwiki.apache.org/MAHOUT/k-means-clustering.html

      有一个关于使用Reuters 数据集对文档进行聚类的快速教程。这与您要实现的目标非常相似。 Mahout 包括推荐算法,例如斜率一、基于用户、基于项目,并且非常容易扩展。它还有一些非常有用的聚类算法,支持降维功能。如果您的矩阵是稀疏的(也就是说,很多标签的使用统计信息很少),这对您很有用。

      还可以查看 Lucene 以使用其 tfidf 功能对标签和文档进行聚类。另请检查Solr。两者都是 Apache 项目。

      【讨论】:

        【解决方案4】:

        您必须根据产品的具体情况和您的判断力来决定相似度指标是什么。视频长度重要吗?如果是这样,它应该得到很高的权重。

        【讨论】:

          【解决方案5】:

          http://taste.sourceforge.net/old.html

          味觉是一种灵活、快速的 协同过滤引擎 爪哇。引擎将用户的 对物品的偏好(“口味”)和 返回估计的偏好 其他项目。例如,一个网站 出售书籍或 CD 可以轻松使用 从过去的味道中找出答案 购买数据,其中 CD 客户 可能有兴趣听。

          味觉提供了丰富的 您可以从中获取的组件 构建一个定制的推荐器 系统从算法的选择。 味道被设计成 企业就绪;它专为 性能、可扩展性和 灵活性。它支持一个标准 基于 J2EE 的 EJB 接口 应用程序,但味道不只是 对于 Java;它可以作为外部运行 公开推荐的服务器 通过 Web 到您的应用程序的逻辑 服务和 HTTP。

          http://savannah.nongnu.org/projects/cofi/

          目前,想要使用的程序员 协同过滤必须阅读 文献并实施自己的 算法。很多时候, 程序员可能会设计自己的 算法,他们通常会 产生次优算法。我们想要 建立已经的基础 测试算法并记录 可用于广泛的 从研究到背景 应用程序。指导原则 就是设计要薄。 科菲不想成为一切 为所有人。所以重点是 提供很少的代码行, 并依靠程序员 提供必要的胶水。

          还有几个here

          【讨论】:

          • 请注意,“Taste”早已被纳入 Apache Mahout。
          【解决方案6】:

          在开始实施、调整或使用现有库之前,请确保您了解该领域;阅读“Collective Intelligence in Action”之类的内容是一个好的开始。

          【讨论】:

            【解决方案7】:

            Recommendation Algorithm 会非常有用,因为它列出了处理您的目的的标准算法。

            更新:

            我猜您正在查看的是Collaborative Quality Filtering,不仅是协作过滤,我还附上了论文链接,希望对您有所帮助。

            【讨论】:

            • 据我了解,这些算法都是基于用户评分或相似度。
            • 他们也在考虑产品规格。一旦用户选择了特定产品,然后根据产品类型提出其他相关建议。
            • 好的,你指的是哪种算法?亚马逊会进行商品与商品之间的计算,但只针对从用户行为生成的子集,而不是针对每个商品与整个集合中的其他商品进行比较。
            • 是的,你是对的,但你能详细说明你到底想要完成什么吗?
            • 我仍然认为这些是不同的东西。协作质量过滤使用加权评论(投票/排名等)。我根本没有任何评论。
            猜你喜欢
            • 1970-01-01
            • 2015-07-02
            • 2015-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-04
            相关资源
            最近更新 更多