Tom*_*tin 5 recommendation-engine collaborative-filtering mahout
我们试图找到项目(以及后来的用户)之间的相似性,其中项目在用户的各种列表中排名(想想Hi Fidelity中的 Rob,Barry和Dick ).给定列表中较低的索引意味着较高的评级.
我想一个标准的方法是使用Pearson相关性,然后以某种方式反转索引.
然而,正如我所理解的那样,Pearson相关性的目的是弥补用户之间的差异,这些用户通常评价较高或较低但具有相似的相对评级.
在我看来,如果列表是连续的(虽然任意长度),这个位置所暗示的评级不会以这种方式倾斜.
我想在这种情况下,基于欧几里德的相似性就足够了.是这样的吗?使用Pearson相关性会产生负面影响并找到不合适的相关性吗?什么相似性度量可能最适合这些数据?
此外,虽然我们希望列表中的位置生效,但我们不希望惩罚相距太远的排名.两个用户同时列出具有非常不同排名的列表中的项目仍应被视为相似.
杰卡德相似度在您的情况下看起来更好。要包含您提到的排名,您可以采用物品袋方法。
使用您的 ( Rob, Barry, Dick) 示例,其评级分别为 (3,2,1),您将Rob3 次插入该用户a的包中。
Rob, Rob, Rob.
Run Code Online (Sandbox Code Playgroud)
然后对于Barry,您执行两次。目前的包如下所示,
Rob, Rob, Rob, Barry, Barry.
Run Code Online (Sandbox Code Playgroud)
最后放进Dick包里。
Rob, Rob, Rob, Barry, Barry, Dick
Run Code Online (Sandbox Code Playgroud)
假设另一个用户b有一袋[Dick, Dick, Barry],您计算 Jaccard 相似度如下:
a和之间的交集b=[Dick, Barry]a和的并集b=[Rob, Rob, Rob, Barry, Barry, Dick, Dick]即,交集中的项目数除以并集中的项目数。
这种相似性度量不会惩罚相距甚远的排名。你可以看到:
两个用户在列表中都具有排名非常不同的项目,但仍应被视为相似。