mahout之推荐系统源码笔记(4) ---总结与优化

mahout之推荐系统源码笔记(4) —总结与优化

花了几天的时间阅读分析了mahout推荐系统中基于java单机和基于hadoop的分布式mapreduce源码。根据其推荐系统hadoop程序的job划分写了笔记1、2、3。在这里,基于笔记1,2,3做一个总结。
我们先从相似度开始。

什么是相似度,就是我们在构建推荐系统时,基于user或者基于item都需要计算出相应的候选item或者是user。那么在mahout的hadoop程序中,他运用的是基于item的推荐系统,同样的,也需要计算相似度。
计算相似度的公式我在之前的笔记中列举过,有欧几里得,皮尔森等等。
sim
可以看到这些计算公式都需要向量的乘积和平方。
什么是一个向量呢,就是说我们比较item两两之间的相似度的时候,则用户就是维度,这样两个向量就由< item , user>构成,而其中的值就是pref偏好。
然后我们通过将item或者user转化为向量,运用公式计算相似度,就得到了item或者user两两之间的相似度。

那么mahout需要计算相似度就要求向量之间的平方和、内积。他是怎么操作的呢?
我们回到mahout的mapreduce转化。
在准备阶段,我们分别通过输入数据得到了以下的结构:

输入数据:
String: userid item pref
mapreduce:
Long: userid , Vector: <itemid , pref>
Long: itemid , Vector: <userid , pref>

得到这两个结构以后,这两个结构我们开始分开使用。首先我们需要用Long: userid , Vector: < itemid , pref>来计算相似度,的到物品两两之间的相似度矩阵,并且根据用户输入的最大行/列队矩阵向量进行规范剪枝,来缩小矩阵的体积,删去相似度低不会用到推荐系统的向量。具体的过程就不一一阐述,输入输出如下:

输入数据:
Long: userid , Vector: <itemid , pref>
输出数据
Long: itemA , Vector: <itemB , sim>  (剪枝后的结果)

接下来我们使用Long: itemid , Vector: < userid , pref>构建基于item的信息集。什么是信息集合呢?因为推荐系统是半离线处理的,所以我们可以计算好所有用户的推荐,然后根据我们的需求给各个用户推荐item,所以这就需要我们构建一个中间数据集合来存储每个item的信息,这个信息中包含了item的相似矩阵、使用item的用户以及这些用户使用item以后的pref打分。我们有了这个中间数据集,稍作变换就可以求出最终的分数预测的数据集。同样,输入输出如下:

输入数据:
Long: itemA , Vector: <itemB , sim>  (每个item的相似矩阵)
Long: itemid , Vector: < userid , pref> (用户-商品矩阵)
输出数据
Long: itemA , ( Vector<itemB , sim> , List<userID> , List<pref> )

得到如上中间数据集合以后我们就可以求最后的预测分数了,我们根据预测分数排行以后就可以给每个用户推荐了。过程如下:

输入数据:
Long: itemA , ( Vector<itemB , sim> , List<userID> , List<pref> )
中间结果:
Long: userid , ( pref , Vector<itemB , sim> )
输出数据:
Long: userid , Vector( item , predictPref )

最后将结果输出。

总结了所有过程,可以看到抛去细节mahout做的并不是很难,而且其中有一些来回变换应用在mapreduce上比较占用io读写,其实有很多步骤可以省略,当然具体到工作环境中,有时可以一将多个job简化,比方说mahout的第一个job的第一个mapreduce,它将item的ID做了个内部索引的映射,当我们的itemID并不是特别特别巨大的时候根本没有必要做这一步工作,还有后面构建中间数据集,其实可以略过,将Long: userid , Vector: < itemid , pref>中的itemID根据Long: itemA , Vector: < itemB , sim> (每个item的相似矩阵)进行合并,得到的结果就是我们最后一步的中间结果。
写到这里,有一些对于推荐系统应用在分布式环境的想法。
代码读了三到四天,其实说到头,执行的步骤不是那么复杂,数学支持度也不高,推荐系统的预测结果也并不是那么好,通过这些弊端,有以下两个想法:
第一,编程环境。
不是吐槽hadoop,但是hadoop对于推荐系统这种偏重迭代、数据转化的运算确实有点捉襟见肘,mapreduce执行的操作不多,代码量却是巨额,真正核心的东西没有表达出来,预定义的接口环境变量等等却定义了一堆,我想如果能够简化编程环境,让我们的操作直接贴近核心数据,对真正的数据多做处理可能是一个比较好方向,当然我并不是说mahout所有的代码都是冗余的,自定义的数据类型确实可以贴近数据做一些优化,可是真正用到的核心点并不多,数据量大但结构简单的时候其实意义并不是很大,说到这里就比较推荐RDD编程,抽象程度比较高,可以抽象得直接操作数据,写起来不用考虑太多其他方面,这对数据处理方面都是一大进步。
第二,数据挖掘方法。
推荐系统出来将近二十年了,可是mahout对海量数据做的推荐系统(基于hadoop)运用的还是最基本的协同过滤以及als方法,其实相较于协同过滤,我更推荐als算法一些,因为als算法可以抽象出用户、商品的特征,运算量越大,特征表现越精准细致,根据精确的特征做推荐,可以精确得把握到用户的喜好兴趣。除此之外我们还可以根据用户的行为运用很多不同的方法来构建推荐系统。用户群体聚类、关联规则分析、用户信息抽象(神经网络)等等,多个分类器的集成可以对推荐系统取得更好更优的结果。
同时,相应的另一方面来看,不同的应用场景我们需要使用不同的推荐分析方式,并不是所有的推荐都适用于一种推荐分析方法,所以具体的行业方面我们可以具体来个性化设计。
而且,随着数据分析行业的发展, 这种user-item-pref的方式已经远远无法达到我们的需求,我们有更多的用户信息,诸如个人资料、ip、操作信息、浏览历史、自定义标签等等不同的信息,并不是所有的信息都适用这种CF模式,所以我们需要对数据挖掘的方法进行更新、优化。

下面补充一些关于mahout协同过滤的优化:
首先准备阶段我们只需要得到:userID , Vector< itemID , pref > 即可。itemID的内部索引标准化这一步可以再外部数据输入之前进行标准化,而不用写在mapreduce中。那么prepare的步骤如下:

输入:userID itemID pref(text)
输出:userID , Vector<itemID , pref>和min_int , Vector<userID , num>

得到userID-itemID矩阵以及每个用户操作数量计数。
接下来我们需要计算相似度矩阵,得到itemA , Vector< itemB , sim >这种形式的相似度矩阵,具体步骤如下:
首先计算norms得到平方和:

map:
userID , Vector<itemID , pref>
reduce:
itemID , norms (pref平方和)

接下来计算agg(item两两pref乘积),同原mahout操作:

map:
userID , Vector<itemID , pref>
-> sortby itemID
-> 双重循环对Vector<itemID , Pref>处理得到[ItemA , <itemB , aggregete>](itemA< itemB)
reduce:
itemA , Vector<itemB , agg>
->对所有itemA和itemB相同的条目进行加和
->通过保存下来的norms,和加和后的[itemA , Iterable<itemB , aggregete>]计算相似度
->[itemA , Vector<itemB , sim>](itemA< itemB) 输出

这样我们就得到了item之间的相似度。
接下来我们进行推荐评估:

map:
读取[itemA Vector<itemB , sim>]并根据输入:
[userID , Vector<itemID , pref , Vector<null> >]
对[itemA , Vector<itemB , sim>]中的itemA和[userID , Vector<itemID , pref>]的itemID进行map合并转化

reduce:
合并bykey得到[userID , Vector<itemA , pref , Vector<itemB , sim> >]
计算预测分数,得到[userID , Vector<itemB , pref>]输出

转载请注明出处:http://blog.csdn.net/utopia_1919/article/details/51860344

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
分享主要分为以下五个部分: HAWQ基本介绍; HAWQ架构以及各重要组件的基本原理; HAWQ的中短期规划; 如何贡献到HAWQ和成为Apache Committer; Q A。 一、HAWQ基本介绍 HAWQ是一个Hadoop原生大规模并行SQL分析引擎,针对的是分析性应用。和其他关系型数据库类似,接受SQL,返回结果集。但它具有大规模并行处理很多传统数据库以及其他数据库没有的特性及功能。主要如下: 对标准的完善支持:ANSI SQL标准,OLAP扩展,标准JDBC/ODBC支持,比其他Hadoop
Hadoop 的 HDFS 集群在使用一段时间后,各个 DataNode 节点的磁盘使用率肯定会出现不平衡的情况,也就是数据量层面的数据倾斜,如图: 引起这种情况的方式很多: 1.        添加新的 Datanode 节点 2.        人为干预将数据的副本数降低或者增加   我们都知道当 HDFS 出现数据不平衡的时候,就会造成 MapReduce 或 Spark 等应用程序无法很好的利用本地计算的优势,而且 Datanode 节点之间也没有更好的网络带宽利用率,某些 Datanode 节点
线性判别分析(Linear Discriminant Analysis) 标签(空格分隔): 监督学习 @author : duanxxnj@163.com @time : 2016-07-11 线性判别分析Linear Discriminant Analysis 线性分类器 判别式函数discriminant functions 从判别式或后验概率到决策面 线性判别分析Linear Discriminant Analysis 二次判别分析QDA Fisher判别式 类间距离 类内距离 Fisher线性判

Jenkins 2.0新时代:从CI到CD - 2016-07-12 14:07:50

2.0 破茧重生 自从去年9月底Jenkins的创始人Kohsuke Kawaguchi提出Jenkins 2.0(后称2.0)的愿景和草案之后,整个Jenkins社区为之欢欣鼓舞,不管是官方博客还是Google论坛,大家都在热烈讨论和期盼2.0的到来。4月20日,历经Alpha(2/29),Beta(3/24),RC(4/7)3个版本的迭代,2.0终于正式发布。这也是Jenkins面世11年以来(算上前身Hudson)的首次大版本升级。那么,这次升级具体包含了哪些内容呢? 外部 从外部来看,2.0最大的
基本流程图如下: 命令如下: 将用sqoop导入Oracle数据到HDFS./sqoop import --connect jdbc:oracle:thin:@192.168.146.128:1521:orcal -- username scoot --passwd tiger --table emp --columns 'empno, ename, job, sal, deptno' -m 1 --target -dir '/sqoop/emp'使用sqoop导入oracle数据到hive中,./sqo

HIVE和HBASE区别 - 2016-07-11 17:07:52

1. 两者分别是什么?    Apache Hive是一个构建在Hadoop基础设施之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive不能够进行交互查询--因为它只能够在Haoop上批量的执行Hadoop。     Apache HBase是一种Key/Value系统,它运行在HDFS之上。和Hive不一样,Hbase的能够在它的数据库上实时运行,而不是运行MapRe
内容翻译:@穆文(微信公众号 数据挖掘机养成记) 寒小阳 校正调整: 寒小阳 龙心尘 时间:2016年7月 出处: http://blog.csdn.net/han_xiaoyang/article/details/51871068 http://blog.csdn.net/longxinchen_ml/article/details/51823339 说明:本文为斯坦福大学CS224d课程的中文版内容笔记整理,已得到斯坦福大学课程@Richard Socher教授的授权翻译 0.前言 之前的课程里介绍了
​(上图为马云试乘互联网汽车) 与几乎所有人的认知相反,我们现在才刚刚站在移动互联网新时代的大门口。 从1975年PC诞生到2007年iPhone诞生,这30年是基于PC互联网的商业社会;从2007年到2016年这10年是商业社会从PC互联网向移动互联网过渡的10年,这10年也是云计算和大数据崛起的10年;以2016年7月阿里和上汽联合推出的互联网汽车为标志,未来的30年才是真正的移动互联网世代,商业社会的主要基础设施也将过渡到智能终端和移动互联网,智能终端则将从智能手机和互联网汽车过渡到更多品类。 在真
目录 目录 前文列表 前提条件 完成下面的步骤以创建数据库 创建service credentials服务凭证 创建Neutron的API Endpoints 配置自服务网络 安装网络组件 配置服务组件 配置 Modular Layer 2 ML2 插件 配置Linux 桥接代理 配置layer-3代理 配置DHCP代理 配置元数据代理 配置计算使用网络 完成安装 前文列表 Openstack组件部署 — Overview和前期环境准备 Openstack组建部署 — Environment of Con
目录 目录 前文列表 安装组件 配置通用组件 配置自服务网络选项 配置Linux 桥接代理 配置Nova使用网络 完成安装 验证操作Execute following commands on Controller Node 前文列表 Openstack组件部署 — Overview和前期环境准备 Openstack组建部署 — Environment of Controller Node Openstack组件部署 — Keystone功能介绍与认证实现流程 Openstack组件部署 — Keyston