我正在尝试使用与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比较每一行?
请帮忙。我已经厌倦了一个星期......
答案 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.
注意:矢量项很稀疏。
我用三个步骤来做到这一点:
sqrt(sum(item*item))
。 按用户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
........
(非常简单)计算itemid1和itemid2的评级;使用sum(item1*item2)
我们知道sqrt(sum(item1*item1))
和sqrt(sum(item2*item2))
,因此我们得到了余弦相似度。