现在的位置: 首页 > 综合 > 正文

[转]使用Python MrJob的MapReduce实现电影推荐系统

2012年11月08日 ⁄ 综合 ⁄ 共 7538字 ⁄ 字号 评论关闭

[原文]:http://www.sobuhu.com/archives/567

最近发现一个很好玩的Python库,可以方便的使用在Python下编写MapReduce任务,直接使用Hadoop Streaming在Hadoop上跑。对于一般的Hadoop而言,如果任务需要大量的IO相关操作(如数据库查询、文件读写等),使用Python还是Java、C++,性能差别不大,而如果需要大量的数据运算,那可能Python会慢很多(语言级别上的慢),参考这里

最常见的如日志分析、Query统计等,都可以直接用Python快速完成。

Python作为一种快速开发语言,优美、简洁的语法征服了很多人,现在很多的机器学习程序最初都是跑在Python上的(如知乎的推荐引擎),只有当规模大到一定程度才会转移到C或Java上。

本文会通过一个简单的电影推荐系统来介绍如何使用MrJOB。

 首先,可能很多人对性能格外在意,可以先看这篇文章:

http://stackoverflow.com/questions/1482282/java-vs-python-on-hadoop

MrJob项目地址: https://github.com/Yelp/mrjob

MrJOB的精简介绍

这里重点在于实现电影推荐的系统,所以对于MrJob本身的介绍会比较简略,够用即可,详细说明可以看官方文档。

首先,在Python中安装mrjob后,最基本的MapReduce任务很简单:

上面的代码中,有三个函数,mapper、combiner、reducer,作用和普通的Java版本相同:

  • mapper用来接收每一行的数据输入,对其进行处理返回一个key-value对;
  • combiner接收mapper输出的key-value对进行整合,把相同key的value作为数组输入处理后输出;
  • reducer和combiner的作用完全相同,不同之处在于combiner是对于单个mapper进行处理,而reducer是对整个任务(可能有很多mapper在执行)的key-value进行处理。它以各个combiner的输出作为输入。

更为详细的介绍,如分步任务、数据初始化等可以参考其这份官方文档

电影推荐系统

假设我们现在有一个影视网站,每一个用户可以给电影评1到5分,现在我们需要计算每两个电影之间的相似度,其过程是:

  • 对于任一电影A和B,我们能找出所有同时为A和B评分过的人;
  • 根据这些人的评分,构建一个基于电影A的向量和一个基于电影B的向量;
  • 根据这两个向量计算他们之间的相似度;
  • 当有用户看过一部电影之后,我们给他推荐与之相似度最高的另一部电影;

你可以从这里下载一些开源的电影评分数据,我们使用的是1000个用户对1700部电影进行的100000万个评分数据,下载后的数据文件夹包含一个README,里面有对各个文件的详细介绍,鉴于我们只需要(user|movie|rating)数据,所以我们用Python把这些数据进行一些处理:

处理后的数据类大约似于这样:

 

皮尔逊相关系数

判断两个向量的相似度的方式有很多种,比如测量其欧氏距离、海明距离等,这里我们用皮尔逊相关系数来计算器相关性,该系数可以理解为两个向量之间夹角的余弦值,介于-1到1之间,绝对值越大相关性越强,公式为:

第一步,我们首先对把每个用户的所有评分聚合到一起,代码如下:

使用命令 $python step1.py ratings.csv > result1.csv 获得第一步的结果。

第二步,根据第一步聚合起来的用户评分,按照皮尔逊系数算法获得任一两个电影之间的相关性,代码及注释如下:

使用命令 $python step2.py result1.csv > result2.csv 获得第二步的结果。

获得结果集示例:

[Movie A, Movie B] [similarity, rating count]

可以看到结果还是具有一定的实际价值的,需要注意的是,Stars Fell on Henrietta, The (1995) 这部电影是1.0,也就是完全相关,但是由于只有两个人同时对他们进行了评价,所以结果并非全都很正确,这里还要考虑多少人进行了评价。

结语

本文的内容来自于参考资料中的博客,博主仅做了整理工作,有任何问题可以和我交流。需要指出的是,类似于本文中的电影推荐仅仅是众多推荐算法中一种,可以说是对物品进行相似度判断,实际上也可以根据用户进行用户相似度判断,相似的用户总是喜欢相同的电影,这在实践中效果更好一点,也更容易根据社交关系进一步挖掘。

 

参考资料:http://aimotion.blogspot.com.br/2012/08/introduction-to-recommendations-with.html

抱歉!评论已关闭.