首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >电影推荐的MapReduce Jaccard相似度计算

电影推荐的MapReduce Jaccard相似度计算
EN

Stack Overflow用户
提问于 2019-01-16 14:16:15
回答 1查看 695关注 0票数 3

我正在进行分布式系统考试,我试图解决去年考试中的一个MapReduce问题。但我很难弄清楚我将创建什么样的函数。本练习涉及处理包含{userID、movieID、时间戳}的数据集。我们想要构建一个服务,在观看电影后向用户推荐一部电影。用户(Id)已经在元组中看到了电影(Id)。要推荐另一部电影,您需要计算Jaccard的相似性:

Jaccard( X,Y)=N/ (Nx + Ny - N),其中:

  • Nx =观看电影X的用户数量
  • Ny =观看Y电影的用户数量
  • N=同时看电影X和Y的用户数目

MR函数必须以伪码形式显示如下:

代码语言:javascript
复制
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的输入。

这不是作业,因为它是过去的期末考试,这就是为什么我不把它放在家庭作业的问题。(如果需要,可以提供到考试pdf的链接)

首先,我尝试了以下几点:

代码语言:javascript
复制
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?谢谢您的任何解释。如果你想更好地解释练习的日期,请问。

EN

回答 1

Stack Overflow用户

发布于 2019-01-18 14:37:50

map/ map部分将每个输入记录转换为(键->值)对。

输入记录-> x映射函数-> f在输入记录-> f(x)上的映射输出

在您的特定示例中,通过丢弃时间戳将{userID、movieID、时间戳}的元组转换为键值映射(movieId -> userId)。

map/ reduce的部分接受您从上面创建的每个键值映射,并执行一个聚合函数(减)。由于一个key的所有数据都需要位于一个节点上才能执行精确的聚合计算,所以特定key的值将被移动到负责该key的特定节点。这就是为什么reduce接受输入作为(键->列表(值))或示例(movieId -> List(userIds))的原因。因此,对每个reduce调用来说,key将是不同的。

对于每个输入键,reduce函数的输出将是唯一的(键-> aggregation_computation(值))。例如,在你的例子中,

代码语言:javascript
复制
Movie (Id)              Number of Users
Star Wars               50
John Wick               32
Fifty Shades of Grey    9000
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54219015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档