mahout - 列表排名项目的最有效相似度度量

标签 mahout recommendation-engine collaborative-filtering

我们试图找到项目(以及后来的用户)之间的相似性,其中项目在用户的各种列表中排名(想想 Hi Fidelity 中的 Rob、Barry 和 Dick)。给定列表中较低的索引意味着较高的评级。

我想一个标准的方法是使用 Pearson 相关性,然后以某种方式反转索引。

但是,据我了解,Pearson 相关性的目的是补偿通常对事物进行较高或较低评分但具有相似相对评分的用户之间的差异。

在我看来,如果列表是连续的(尽管长度是任意的),那么位置所暗示的评级会以这种方式倾斜并不是问题。

我想在这种情况下,基于欧几里得的相似性就足够了。是这种情况吗?使用 Pearson 相关性会产生负面影响并找到不合适的相关性吗?什么相似性度量可能最适合这些数据?

此外,虽然我们希望列表中的位置产生影响,但我们不想惩罚相距太远的排名。两个用户都在列表中具有非常不同的排名的项目仍然应该被认为是相似的。

最佳答案

Jaccard Similarity在你的情况下看起来更好。要包括您提到的排名,您可以采用一袋元素的方法。

使用您的 ( Rob , Barry , Dick ) 示例,它们的评分分别为 (3,2,1),您插入 Rob 3次进入该用户a的包。

Rob, Rob, Rob.

然后为 Barry ,你做两次。当前的包看起来像下面,
Rob, Rob, Rob, Barry, Barry.

你把Dick最后放进包里。
Rob, Rob, Rob, Barry, Barry, Dick

假设另一个用户 b有一袋[Dick, Dick, Barry] ,您计算 Jaccard 相似度如下:
  • a之间的交集和 b = [Dick, Barry]
  • 工会ab = [Rob, Rob, Rob, Barry, Barry, Dick, Dick]
  • Jaccard 相似度 = 2/7,

  • 也就是说,交集中的项目数除以联合中的项目数。

    此相似性度量确实 不是 惩罚相距甚远的排名。你可以看到:

    Two users both featuring an item in a list with very differing ranking should still be considered similar.

    关于mahout - 列表排名项目的最有效相似度度量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12934411/

    相关文章:

    python - 协同过滤的矩阵分解 - 新用户和项目?

    sql - 如何实现类似Digg的算法?

    hadoop - 如何在 Apache mahout 中合并两个相似实例

    facebook - 如何在 Twitter、Facebook 等无评级系统上应用协同过滤

    java - 从整数中删除字符

    hadoop - 使用 Mahout 进行连续协同过滤

    java - 如何在Java中序列化apache Spark的MatrixFactorizationModel

    python - LightFM推荐: Inconsistent error with interaction data

    hadoop - Hadoop中的矩阵求逆,乘法和本征计算

    statistics - 如何在 mahout 中解释 IRStatisticsImpl 数据