Apr 08, 2014  Categories in tutorial tagged with Mahout hadoop 协同过滤  Joe Jiang

前言:之前配置Mahout时测试过一个简单的推荐例子,当时是在Eclipse上运行的,由于集成插件的缘故,所以一切进行的都比较顺利,唯一不足的是那是单机运行的,没有急于分布式系统处理。所以基于测试分布式处理环境的目的,下午找了一个实例来运行,推荐系统原型是一个电影评分的系统。


一、问题描述

对于协同过滤(Collaborative Filtering),我们就是要预测用户所喜欢的但是又没有发现的物品。下面给出一个明确的评分(1.0-5.0)矩阵,设为矩阵A。但是A有一部分没有值,表明用户没有对此物品评分,于是我们需要预测出没有值的评分部分。

评分矩阵(user X item) A


二、解决思路

当然我们知道有基于用户(userBased)和基于物品(itemBased)协同过滤算法。通过计算用户或物品的相似度来求得所缺失的打分。

基于用户的协同过滤推荐大致原理如下:根据所有用户对物品或者信息的偏好,发现与当前用户口味和偏好相似的“邻居”用户群,在一般的应用中是采用计算“K-邻居”的算法;然后,基于这 K 个邻居的历史偏好信息,为当前用户进行推荐。

基于项目(物品)的协同过滤推荐的基本原理也是类似的,只是说它使用所有用户对物品或者信息的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户。

假设用户 A 喜欢物品 A 和物品 C,用户 B 喜欢物品 A,物品 B 和物品 C,用户 C 喜欢物品 A,从这些用户的历史喜好可以分析出物品 A 和物品 C 时比较类似的,喜欢物品 A 的人都喜欢物品 C,基于这个数据可以推断用户 C 很有可能也喜欢物品 C,所以系统会将物品 C 推荐给用户 C。

基于Mahout上运行的本例程序,我们这里讲潜在因子模型(latent factor model)方法。用户和物品分布在一个k维的特征空间,用户的未知评分可以简单的通过相应的用户和物品的向量的乘积得到。

也就是将矩阵A分解成两个矩阵U和M。

用户特征矩阵U:

用户x特征(users X features)矩阵U

物品特征矩阵M:

物品x特征(items X features)矩阵M

可以通过计算U(users X features) 与M’ (features X items)的乘积A_k (users X items)来接近A。

A_k = UM’

A_k矩阵

这样就预测到了用户对未知物品的评分。


三、Mahout算法原理

那么该如何来分解A为U和M呢?

Mahout使用的是这篇论文《Large-scale Parallel Collaborative Filtering for the Netflix Prize》中的加权lambda正规化的交替最小二乘法(ALS-WR)。(我暂时还没研究具体原理)


四、Mahout运行步骤

在MovieLens上找到电影数据记的下载压缩包,下载IM的数据:下载地址

解压出ratings.dat文件,并利用如下命令转换成用逗号分开的ratings.csv文件(其中类似/home/mhadoop/的路径均为我电脑上的配置,具体因不同电脑环境而异,下文中均如此不再赘述,请注意):

/*转换文件命令*/
cat /home/mhadoop/data/ratings.dat |sed -e s/::/,/g| cut -d, -f1,2,3 > /home/mhadoop/data/ratings.csv

然后将csv表文件上传到HDFS,假设在hdfs的路径为/home/mhadoop/input/ratings.csv:

hadoop dfs -mkdir /home/mhadoop/input
hadoop dfs -put /home/mhadoop/input/ratings.csv /home/mhadoop/input

将rating分为预测集(10%)和训练集(90%):

mahout splitDataset -i /home/mhadoop/input/ratings.csv -o /home/mhadoop/dataset –t 0.9 –p 0.1

运行分布式的ALS-WR算法来进行矩阵的分解(matrix factorization):

mahout parallelALS -i /home/mhadoop/dataset/trainingSet/ -o /home/mhadoop/out --numFeatures 20 --numIterations 10 --lambda 0.065

之后会在/home/mhadoop/out生成M和U以及保存的评分,可以通过命令hadoop dfs -ls或者hadoop dfs -cat查看相关文件及内容。

通过预测集来对模型进行评价,评价标准是RMSE:

mahout evaluateFactorization -i /home/mhadoop/dataset/probeSet/ -o /home/mhadoop/out/rmse/ --userFeatures /home/mhadoop/out/U/ --itemFeatures /home/mhadoop/out/M/

RMSE结果会输出在/home/mhadoop/out/rmse/rmse.txt。

最后进行推荐:

mahout recommendfactorized -i /home/mhadoop/out/userRatings/ -o /home/mhadoop/recommendations/ --userFeatures /home/mhadoop/out/U/ --itemFeatures /home/mhadoop/out/M/ --numRecommendations 6 --maxRating 5

结果在/home/mhadoop/recommendations/。

以上文件以及最终推荐结果可以在命令行中通过cat命令查看,同时也可以在浏览器通过50030端口的HDFS文件系统查看,以下为HDFS查看下效果图:

文件系统中评分结果图


结语:好吧,虽然跑通了分布式例子但是原理还不是特别理解,所以找论文找书籍找技术宅的博客去看看。感谢 GOOGLE,Wikipedia - Collaborative filtering, King's Notes 以及 Apache Mahout官方文档的帮助。

Mahout分布式运行实例:基于矩阵分解的协同过滤评分系统(一个命令实现文件格式的转换)的更多相关文章

  1. SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高

    1.背景知识 在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法.这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐.其公式为:

  2. 【RS】List-wise learning to rank with matrix factorization for collaborative filtering - 结合列表启发排序和矩阵分解的协同过滤

    [论文标题]List-wise learning to rank with matrix factorization for collaborative filtering   (RecSys '10 ...

  3. 推荐算法之用矩阵分解做协调过滤——LFM模型

    隐语义模型(Latent factor model,以下简称LFM),是推荐系统领域上广泛使用的算法.它将矩阵分解应用于推荐算法推到了新的高度,在推荐算法历史上留下了光辉灿烂的一笔.本文将对 LFM ...

  4. centos中-hadoop单机安装及伪分布式运行实例

    创建用户并加入授权 1,创建hadoop用户 sudo useradd -m hadoop -s /bin/bash 2,修改sudo的配置文件,位于/etc/sudoers,需要root权限才可以读 ...

  5. 简单的基于矩阵分解的推荐算法-PMF, NMF

    介绍: 推荐系统中最为主流与经典的技术之一是协同过滤技术(Collaborative Filtering),它是基于这样的假设:用户如果在过去对某些项目产生过兴趣,那么将来他很可能依然对其保持热忱.其 ...

  6. 基于用户的最近邻协同过滤算法(MovieLens数据集)

      基于用户的最近邻算法(User-Based Neighbor Algorithms),是一种非概率性的协同过滤算法,也是推荐系统中最最古老,最著名的算法. 我们称那些兴趣相似的用户为邻居,如果用户 ...

  7. 基于用户相似性的协同过滤——Python实现

    代码基本来自项亮的<推荐系统实践>,把书上的伪代码具体实现,还参考了https://www.douban.com/note/336280497/ 还可以加入对用户相似性的归一化操作,效果会 ...

  8. 用Spark学习矩阵分解推荐算法

    在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib ...

  9. 机器学习笔记7:矩阵分解Recommender.Matrix.Factorization

    目录 1矩阵分解概述 1.1用在什么地方 1.2推荐的原理 2矩阵分解的原理 2.1目标函数 2.2 损失函数 2.3 通过梯度下降的方法求得结果 3 代码实现 参考地址: 贪心学院:https:// ...

随机推荐

  1. C++ 中 const和define的区别

    来源网址:http://wujiangping.blog.163.com/blog/static/195182011201255115125205/ 请区别用#define命令定义的符号常量和用con ...

  2. how to increase an regular array length in java?

    Arrays in Java are of fixed size that is specified when they are declared. To increase the size of t ...

  3. robots.txt 文件指南

    http://robots.51240.com/ robots 生成器

  4. flowers

    问题大全 Do you like flowers?(Why?) What flowers do you like?(why?) What is your favorite flower? Are fl ...

  5. mysql innobackupex备份工具

    先简单介绍一下这个工具:innobackupexinnobackupex比xtarbackup有更强的功能,它整合了xtrabackup和其他的一些功能,他不但可以全量备份/恢复,还可以基于时间的增量 ...

  6. sqlserver日志文件过大的处理方法

      SqlServer 数据库中与备份和恢复相关的日志文件有MDF和LDF文件 存在于\\sqlserver_install_dir\MSSQL\Data\1.文件解释.mdf文件    MDF是SQ ...

  7. CodeForces 567B Berland National Library hdu-5477 A Sweet Journey

    这类题一个操作增加多少,一个操作减少多少,求最少刚开始为多少,在中途不会出现负值,模拟一遍,用一个数记下最大的即可 #include<cstdio> #include<cstring ...

  8. Swift 常用字符串操作

    原文链接:http://www.jianshu.com/p/52e7580166ff 版本2:增加了Swift 2.0的语法,与Swift 1.2的语法相比,主要是:advance方法变成了advan ...

  9. PullToRefreshGridView上拉加载、下拉刷新

    eclipse中的项目: //注意:此刷新功能是使用的第三方的PullToRefreshScrollView,因此需要导入第三方library作为依赖 步骤:导入第三方library,依赖:点击你的应 ...

  10. 正确使用#include和前置声明(forward declaration)

    http://blog.csdn.net/SpriteLW/article/details/965702