Mahout分布式运行实例:基于矩阵分解的协同过滤评分系统(一个命令实现文件格式的转换)
前言:之前配置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分布式运行实例:基于矩阵分解的协同过滤评分系统(一个命令实现文件格式的转换)的更多相关文章
- SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高
1.背景知识 在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法.这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐.其公式为:
- 【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 ...
- 推荐算法之用矩阵分解做协调过滤——LFM模型
隐语义模型(Latent factor model,以下简称LFM),是推荐系统领域上广泛使用的算法.它将矩阵分解应用于推荐算法推到了新的高度,在推荐算法历史上留下了光辉灿烂的一笔.本文将对 LFM ...
- centos中-hadoop单机安装及伪分布式运行实例
创建用户并加入授权 1,创建hadoop用户 sudo useradd -m hadoop -s /bin/bash 2,修改sudo的配置文件,位于/etc/sudoers,需要root权限才可以读 ...
- 简单的基于矩阵分解的推荐算法-PMF, NMF
介绍: 推荐系统中最为主流与经典的技术之一是协同过滤技术(Collaborative Filtering),它是基于这样的假设:用户如果在过去对某些项目产生过兴趣,那么将来他很可能依然对其保持热忱.其 ...
- 基于用户的最近邻协同过滤算法(MovieLens数据集)
基于用户的最近邻算法(User-Based Neighbor Algorithms),是一种非概率性的协同过滤算法,也是推荐系统中最最古老,最著名的算法. 我们称那些兴趣相似的用户为邻居,如果用户 ...
- 基于用户相似性的协同过滤——Python实现
代码基本来自项亮的<推荐系统实践>,把书上的伪代码具体实现,还参考了https://www.douban.com/note/336280497/ 还可以加入对用户相似性的归一化操作,效果会 ...
- 用Spark学习矩阵分解推荐算法
在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib ...
- 机器学习笔记7:矩阵分解Recommender.Matrix.Factorization
目录 1矩阵分解概述 1.1用在什么地方 1.2推荐的原理 2矩阵分解的原理 2.1目标函数 2.2 损失函数 2.3 通过梯度下降的方法求得结果 3 代码实现 参考地址: 贪心学院:https:// ...
随机推荐
- Windows进程间通信(下)
六.动态数据交换(Dynamic Data Exchange) 动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式.应用程序可以使用DDE进行一次性数据传输,也可以当出 ...
- sort函数使用的基本知识
STL中就自带了排序函数sortsort 对给定区间所有元素进行排序 要使用此函数只需用#include <algorithm> sort即可使用,语法描述为:sort(begin,en ...
- OPENWRT make defconfig错误之一
make defconfig rm: cannot remove `tmp/.host.mk': Permission denied 退到trunk上级目录 su root sudo chown -R ...
- LeetCode OJ 297. Serialize and Deserialize Binary Tree
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- 安装 nodejs
接下来使用npm命令安装express和socket.io 没有的话 用yum 安装一下 12 npm install --save expressnpm install --save socket. ...
- List列表 OrderBy
一个条件排序情况 list.OrderBy(item => tem.State); 多个条件的情况下 list.OrderBy(item => new {item.State, item. ...
- Unity 的几种打包姿势(android)
Unity 版本 4.3.2 图片1 1 默认的工程进行打包 得到的apk为8.1m(net subset) 图片2 2 代码剥离最小 – use mirco mscorlib 图片3 3 从网上 ...
- ENC28j60以太网芯片驱动程序简介
ENC28j60以太网芯片驱动程序简介 ENC28J60 驱动开发要点 enc28J60 和 Arduino (1)——ping通你的Arduino MCU51单片机uIP协议栈+ENC28J60网卡 ...
- js中Object.__proto__===Function.prototype
参考:http://stackoverflow.com/questions/650764/how-does-proto-differ-from-constructor-prototype http:/ ...
- 转载:数位DP模板
// pos = 当前处理的位置(一般从高位到低位) 2 // pre = 上一个位的数字(更高的那一位) 3 // status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回, 4 ...