zoukankan      html  css  js  c++  java
  • [转]使用Python MrJob的MapReduce实现电影推荐系统

    [原文]: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

  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/naniJser/p/3013160.html
Copyright © 2011-2022 走看看