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

Posted

技术标签:

【中文标题】电影推荐的 MapReduce Jaccard 相似度计算【英文标题】:MapReduce Jaccard Similarity Calculation for movie Recommendations 【发布时间】:2019-01-16 14:16:15 【问题描述】:

我正在参加有关分布式系统的考试,我试图解决去年考试中的一个 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?提前感谢您提供的任何解释。如果您想更好地解释练习的数据,请询问。

【问题讨论】:

【参考方案1】:

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

输入记录 -> x 地图功能->f 输入记录上映射函数的输出 -> f(x)

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

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

reduce 函数的输出对于每个输入键都是唯一的 (key -> aggregation_computation(values))。例如在你的情况下,

Movie (Id)              Number of Users
Star Wars               50
John Wick               32
Fifty Shades of Grey    9000
...

【讨论】:

以上是关于电影推荐的 MapReduce Jaccard 相似度计算的主要内容,如果未能解决你的问题,请参考以下文章

基于MapReduce和协同过滤算法的推荐系统研究

利用MapReduce仿QQ音乐实现“今日推荐歌曲“系统

利用MapReduce仿QQ音乐实现“今日推荐歌曲“系统

JAVA推荐系统-基于用户和物品协同过滤的电影推荐

chapter2:提供推荐

MapReduce案例----影评分析(年份,电影id,电影名字,平均评分)