我正在尝试使用MapReduce的余弦相似性进行基于项目的推荐。
这是输入集。
项目Idx_1,用户Idx_1项目Idx_1,用户Idx_2项目Idx_2,用户Idx_1项目Idx_3,用户Idx_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]项目Idx_3,[用户Idx_1:0,用户Idx_2:0,用户IDx_3:1]。。。
但是如何使用MapReduce比较每一行?
请帮忙。我已经受够了一个星期了。。
item1表示一个项目,我们可以使用向量[user1,user2,user3…userN]来识别它。item1和item2的余弦相似性是
sum(item1*item2)/ sqrt(sum(item1*item1))* sqrt(sum(item2*item2))
您可以将此sqrt(sum(item1*item1))添加到item1行;我将其添加到项目行作为D.
注意:矢量项是稀疏的。
我用三个步骤来做到这一点:
- 计算每个项目的
sqrt(sum(item*item))
按用户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 ........
(非常简单)计算itemid1和itemid2的评分;使用
sum(item1*item2)
,我们已经知道了sqrt(sum(item1*item1))
和sqrt(sum(item2*item2))
,所以我们得到了余弦相似度。