0

我正在尝试使用 MapReduce 的余弦相似度进行基于项目的推荐。

这是输入集。

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

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

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

(没有偏好,所以数据假设为 0 或 1)
    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 比较每一行?

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

4

1 回答 1

0

item1 表示一个项目,我们可以使用向量 [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
    

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

    itemid1 itemid2  rating1 rating2 (D1) (D2)  
    2344  2324 4 5  
    ........
    
  3. (很简单)计算 itemid1 和 itemid2 的评分;使用sum(item1*item2)and 我们已经知道sqrt(sum(item1*item1))and sqrt(sum(item2*item2)),所以我们得到余弦相似度。

于 2015-06-19T01:17:30.977 回答