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