【发布时间】:2011-05-31 15:34:42
【问题描述】:
我目前正在开发一个应用程序,我想在其中对类似项目进行分组。项目(如视频)可以由用户创建,并且它们的属性可以在以后更改或扩展(如新标签)。我不想像大多数协同过滤机制那样依赖用户的偏好,而是想根据项目的属性(如相似的长度、相似的颜色、相似的标签集等)比较项目的相似性。计算对于两个主要目的是必要的:为给定项目建议 x 相似项目,以及将相似项目聚类成组。
到目前为止,我的应用程序遵循异步设计,我想尽可能地解耦这个集群组件。新项目的创建或为现有项目添加新属性将通过发布组件随后可以使用的事件来宣传。
可以尽最大努力提供计算并“快照”,这意味着我可以在给定时间点获得可能的最佳结果,尽管结果质量最终会提高。
所以我现在正在寻找合适的算法来计算相似的项目和集群。重要的约束是可扩展性。最初,应用程序必须处理几千个项目,但后来也可能处理数百万个项目。当然,计算将在其他节点上执行,但算法本身应该是可扩展的。如果算法在数据的部分变化上支持某种增量模式,那就太好了。
我最初将每个项目相互比较并存储数值相似性的想法听起来有点粗略。此外,它需要n*(n-1)/2 条目来存储所有相似性,并且任何更改或新项目最终都会导致n 相似性计算。
提前致谢!
更新 tl;dr
为了澄清我想要什么,这是我的目标场景:
- 用户生成条目(想想文档)
- 用户编辑条目元数据(想想标签)
这是我的系统应该提供的:
- 作为推荐的给定项目的相似条目列表
- 相似条目的集群
两种计算都应基于:
- 条目的元数据/属性(即相似标签的使用)
- 因此,使用适当指标的两个条目的距离
- 不基于用户投票、偏好或操作(与协同过滤不同)。尽管用户可以创建条目并更改属性,但计算应仅考虑项目及其属性,而不考虑与之关联的用户(就像只有项目而没有用户存在的系统一样)。
理想情况下,算法应该支持:
- 条目属性的永久更改
- 在更改时增量计算相似条目/集群
- 规模
- 如果可能的话,比简单的距离表更好(因为 O(n²) 空间复杂度)
【问题讨论】:
-
也许将“相似”一词替换为测量比较的项目的两个方面有多远并将这些相加可能会有所帮助。总体距离 = 长度距离 + 颜色距离 + 标签距离
标签: cluster-analysis recommendation-engine collaborative-filtering collective-intelligence