2

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

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

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

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

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

提前致谢!

更新 tl;博士

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

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

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

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

两种计算都应基于:

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

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

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

7 回答 7

4

与其从头开始编写,不如查看 mahout.apache.org。它具有您正在寻找的聚类算法以及推荐算法。它与Hadoop一起工作,因此您可以轻松扩展它

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

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

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

还可以看看Lucene使用它的 tfidf 特性来集群标签和文档。还要检查Solr。两者都是 Apache 项目。

于 2011-01-07T12:08:46.163 回答
3

推荐算法将非常有用,因为它列出了处理您的目的的标准算法。

更新:

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

于 2010-12-28T16:14:41.673 回答
3

K-means 聚类可能是您想要的。

注意:

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

因此,您应该考虑有多少集群、多少标签以及什么指标。

另请参阅堆栈溢出问题/标记/k-means

于 2011-01-05T11:45:07.137 回答
2

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

Taste 是一个灵活、快速的 Java 协同过滤引擎。该引擎获取用户对项目的偏好(“口味”)并返回对其他项目的估计偏好。例如,销售书籍或 CD 的网站可以轻松地使用 Taste 从过去的购买数据中找出客户可能有兴趣听的 CD。

Taste 提供了一组丰富的组件,您可以从中通过一系列算法构建定制的推荐系统。Taste 旨在为企业做好准备;它专为性能、可扩展性和灵活性而设计。它支持基于 J2EE 的应用程序的标准 EJB 接口,但 Taste 不仅适用于 Java,还适用于 Java。它可以作为外部服务器运行,通过 Web 服务和 HTTP 向您的应用程序公开推荐逻辑。

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

目前,想要使用协同过滤的程序员必须阅读文献并实现自己的算法。通常情况下,程序员可能会设计自己的算法,他们通常会产生次优算法。我们希望建立一个已经测试过的算法和文档的基础,可以在从研究到应用的广泛环境中使用。指导原则是设计要薄。科菲不想成为所有人的一切。因此,重点是交付很少的代码行,并依靠程序员提供必要的粘合剂。

这里还有一些

于 2011-01-08T06:39:32.430 回答
1

Before starting to implement, adapt or use existing library, make sure you know the domain; reading something like "Collective Intelligence in Action" is a good start.

于 2011-01-07T19:41:35.783 回答
1

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

于 2011-01-07T21:05:38.227 回答
0

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

于 2011-03-14T04:45:40.537 回答