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:// ...
随机推荐
- C语言介绍
以下东东转自百度百科 C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.它由美国贝尔实验室的Dennis M. Ritchie于1972年推出,1978年后,C语言已先后被 ...
- C# 网上收集的一些所谓的开源项目
C#开源 商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7- ...
- VBS中解决路径带空格的三种方法
vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: Set wshell=CreateObject(&qu ...
- Chapter 2 Open Book——6
Last night I'd discovered that Charlie couldn't cook much besides friedeggs and bacon. 昨天晚上我终于发现查理除了 ...
- insertRule()与addRule()创建规则
要向现有的样式表中添加新规则,需要使用insertRule()方法.这个方法接受两个参数:规则文本和表示在那里插入规则的索引.下面是一个例子: sheet.insertRule("body ...
- beego: 获取request参数
beego提供了一套web开发的框架.但我们在开发过程中遇到了一些问题,现汇总如下. 测试1:测试只有keys数组的情况 func (this *TestController) Index() { k ...
- javascript克隆一个对象
/* * 克隆一个对象 */ com.ty.repairtech.JsonOperation.clone = function(obj) { // Handle the 3 simple types, ...
- 运维必备:Oracle自备份精简教程(linux及win)
Oracle在linux环境下的自动备份 1.自动导出及历史文件删除脚本 su - oracle<<EOF cd /db_backup/databak mv orabak*.* /db_b ...
- linux脚本定期执行
vi /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # .----------- ...
- js获取后台json数据显示在jsp页面元素
jsp id <font size=2 >Today:</font> <font id ="todaytotal" size=2 color=&quo ...