电影推荐的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相似度计算的主要内容,如果未能解决你的问题,请参考以下文章

文本相似度计算(一):距离方法

chapter2:提供推荐

R语言计算杰卡德相似系数(Jaccard Similarity)实战:自定义函数计算Jaccard相似度对字符串向量计算Jaccard相似度将Jaccard相似度转化为Jaccard距离

关于Jaccard相似度在竞品分析中的一点思考

使用 Jaccard 相似度对分类数据进行聚类

有没有一种根据 Jaccard 相似度对图进行聚类的有效方法?