电影推荐的MapReduce Jaccard相似度计算
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了电影推荐的MapReduce Jaccard相似度计算相关的知识,希望对你有一定的参考价值。
我正在考试分布式系统,我试图解决去年考试中的MapReduce问题。但我很难搞清楚我将创建的MR功能。练习是关于处理包含{userID,movieID,timestamp}的数据集。我们想要建立一个服务,在用户之后向用户推荐电影。用户(id)已在元组中看到电影(id)。要推荐另一部电影,您需要计算Jaccard相似度:
Jaccard(X,Y)= N /(Nx + Ny-N),其中:
- Nx =看过电影X的用户数
- Ny =看过电影Y的用户数
- N =同时看过电影X和Y的用户数
在伪代码中MR函数必须如下:
MAP(key1, value1):
// Do stuff about<key1,value1>
emit(key2,value2)
REDUCE(key2,list(value2)):
//do stuff about <key2, list(value2)>
emit(key3,value3)
重要:reduce_1的输出为e.x.必须是map_2的输入。
P.S。:这不是一个家庭作业,因为它是一个过去的决赛考试,这就是为什么我不把它放在家庭作业问题。 (如果需要,可以提供考试pdf的链接)
我为初学者尝试了以下方法:
MAP(key1, value1):
//key = tupleID
// value1 = {userID, movieID, timestamp}
// I discard timestamp as it doesn't offer any help on creating
Jaccard similarity.
emit(movieID,userID)
REDUCE(movieID,list(userID)):
Nx = 0
for each user u in list(userID):
Nx = Nx +1
emit(movieID,Nx)
我不知道接下来该做什么。我还没有理解MR背后的逻辑,关于第二个MR将作为输入得到什么。例如,MovieID将保持不变,或者它将获得数据集中的下一个movieID?提前感谢您提供的任何解释。如果您想更好地解释练习的数据,请询问。
map / reduce的map
部分将每个输入记录转换(映射)到(key - > value)对。
输入记录 - > x
地图功能 - > f
输入记录上的地图功能输出 - > f(x)
在您的具体示例中,您将通过丢弃时间戳将{userID,movieID,timestamp}的元组转换为键值映射(movieId - > userId)。
map / reduce的reduce
部分采用您从上面创建的每个键值映射,并执行聚合函数(reduce)。由于一个key
的所有数据都需要位于一个节点上以执行精确的聚合计算,因此特定key
的值将移动到负责该key
的特定节点。这就是为什么reduce
将输入视为(键 - >列表(值))或您的示例(movieId - > List(userIds))。所以,对于每个reduce
电话,key
将是不同的。
reduce
函数的输出将是每个输入键的唯一(键 - > aggregation_computation(值))。例如在你的情况下,
Movie (Id) Number of Users
Star Wars 50
John Wick 32
Fifty Shades of Grey 9000
...
以上是关于电影推荐的MapReduce Jaccard相似度计算的主要内容,如果未能解决你的问题,请参考以下文章
R语言计算杰卡德相似系数(Jaccard Similarity)实战:自定义函数计算Jaccard相似度对字符串向量计算Jaccard相似度将Jaccard相似度转化为Jaccard距离