使用MapReduce计算余弦相似度

时间:2014-10-21 16:54:41

标签: mapreduce recommendation-engine cosine-similarity

我正在尝试使用与MapReduce的余弦相似性来制作基于项目的推荐。

这是输入集。

itemIdx_1, userIdx_1
itemIdx_1, userIdx_2
itemIdx_2, userIdx_1
itemIdx_3, userIdx_3
... 

如何使用此输入数据进行设计?

要使用余弦相似度,我猜输入应该如下所示,

(no preferences, so data'd be 0 or 1 assumedly)
    itemIdx_1 , [userIdx_1:1, userIdx_2:1, userIdx_3:0]
    itemIdx_2 , [userIdx_1:0, userIdx_2:1, userIdx_3:0]
    ItemIdx_3 , [userIdx_1:0, userIdx_2:0, userIdx_3:1]
    ...

但是如何使用MapReduce比较每一行?

请帮忙。我已经厌倦了一个星期......

1 个答案:

答案 0 :(得分:0)

item1表示一个项目,我们可以使用vector [user1,user2,user3 ... userN]来识别它。而item1和item2的余弦相似度为

sum(item1*item2)/ sqrt(sum(item1*item1))* sqrt(sum(item2*item2)) 

您可以将此sqrt(sum(item1 * item1))添加到item1行;我将它添加到项目行 作为D.
注意:矢量项很稀疏。

我用三个步骤来做到这一点:

  1. 计算每个项目的sqrt(sum(item*item))
  2. 按用户ID映射。通过这种方式,我们得到每个用户的选择(同一选择在同一个reduce函数中)。例如。

    userid    itemid     rating  (D) 
    223  2344 4
    223  2324 5
    223  3444 3
    

    然后为每个用户组合每两个项目。然后我们得到一个用户每两个项目的列表。 E.g。

    itemid1 itemid2  rating1 rating2 (D1) (D2)  
    2344  2324 4 5  
    ........
    
  3. (非常简单)计算itemid1和itemid2的评级;使用sum(item1*item2)我们知道sqrt(sum(item1*item1))sqrt(sum(item2*item2)),因此我们得到了余弦相似度。