mahout基于hadoop的CF代码分析

【Hadoop学习】之Mahout Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,也是apache的重点项目。Mahout最大的优点就是基于hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升了算法可处理的数据量和处理性能。对机器学习算法的分布式实现比较感兴趣,后续准备深入学习下Mahout这个项目。今天主要是把基本的环境给搭建起来了,然后跑了一个demo主要是参照 阅读详情

mahout的taste框架是协同过滤算法的实现。它支持DataModel,如文件、数据库、NoSQL存储等,也支持hadoop的MapReduce。这里主要分析的基于MR的实现。

基于MR的CF实现主要流程就在org.apache.mahout.cf.taste.hadoop.item.RecommenderJob类中(注意mahout有两个RecommendJob,要看清楚是哪一个包)。这 个类的run方法就包含了所有的步骤。从上到下,完整的其实有10步(中间计算item相似度其实拆分成了3个job,我们也当做是一个phase吧), 也就是说,如果指定了所有的必要参数,运行一次item-based CF算法,会执行12个JOB,当然有的步骤是可以忽略的,下面会讲。以下就是详细的每一步骤的分析:

phase1: itemIDIndex

这步主要是将itemId转成一个int。这里设计上其实有点小问题,如果item的数量非常多,比如超过int的最大值,那就有可能会出现重合了。所以用long其实更为合适。

   input:用户评分文件(这也是我们最原始的输入了),格式一般为:userId \t itemId \t score。注意输入必须是textfile的。可能是为了方便测试吧,mahout的很多包默认输入都是textfile格式的。

   map:(index, itemId)

   reduce: (index, itemId)


phase2: toUserVector

   input:用户评分文件

   param: --userBooleanData如果这个参数为true,则会忽略评分列,对于买或不买这类数据有时需要指这定这个值。

   map: (userId, itemId,pref)

   reduce: 以用户为key,输出成向量形式==> (userId, VectorWritable<itemId, pref>)

 

phase3: countUser,计算用户数

   map: (userId)

   reduce: 输出总用户数count

 

phase4: maybePruneAndTranspose

   input: phase2的输出:userVector

   param: --maxCooccurrences

   map: (userId,Vector<itemId, pref>) ==>(itemId,DistributedRowMatrix<userId,pref>),注意如果指定了—maxCooccurrences参数,这里会有裁剪,每个userId最多对maxCooccurrences的itemId打分

   这里的DistributedRowMatrix,分布式行矩阵:行:itemId,列:userId

   reduce: (itemId, VectorWritable<userId,pref>)

 

phase5: RowSimilarityJob

这一步比较关键,计算item相似度,它拆分成了三个JOB。

   param: --numberOfColumns, --similarityClassname,--maxSimilaritiesPerRow(默认:100)

 

   job1:weight

      input:phase4的输出

       map: (itemId, VectorWritable <userId, pref>) ==>(userId, WeightedOccurrence<itemId, pref, weight>)

       这里的weight,对于欧氏向量距离,或者Pearson距离等,均为Double.NaN,即无效。在LoglikelihoodVectorSimilarity中有用到weight的值。

       reduce:(userId, WeightedOccurrenceArray<itemId, pref, weight>)

 

   job2:pairwise similarity *item相似度计算*

      map: 对同一用户的所有item-rating,输出两两item之间的关系 ==>(WeightedRowPair<itemA, itemB, weightA, weightB>, coocurrence<userId,valueA, valueB>) (同上,这里的权重weightA,B对于欧氏距离等可以忽略)

       reduce: 在这端,以<itemA,itemB>为key聚合了来自不同map的所有用户的打分,最后输出itemA和B的对称相似度(即以itemA为key或以itemB为key)==>(SimilarityMatrixEntryKey<itemA,similarity>, MatrixEntryWritable<WeightedRowPair<itemA, itemB,weightA, weightB>>) ,(SimilarityMatrixEntryKey<itemB,similarity>, MatrixEntryWritable<WeightedRowPair<itemB, itemA,weightB, weightA>>)

 

   job3:entries2vectors *汇总item的相似items*

      param: --maxSimilaritiesPerRow

      map: (itemA, itemB, similarity) & (itemB,itemA, similarity) 这里在group的时候按相似度降序做了排序,如果有--maxSimilaritiesPerRow参数,则会做裁剪。

      reduce: (itemA, VectorWritable <item,similarity>)

至此,item相似度计算完毕。

 

phase6: prePartialMultiply1 

   input: phase5的最后输出(即item相似度)

   map: 直接输出item对应的相似items,这里用VectorOrPrefWritable做了封装,表明有可能是相似度向量,也有可能是对item的打分,并且对item为自己的,将相似度设为Double.NaN,以过滤自身。==>(itemId,VectorOrPrefWritable<item, similarity>)

    reduce: IdentityReducer

 

phase7: prePartialMultiply2

   input: phase2的输出userVectors

   map: 输出:(itemId, VectorOrPrefWritable<userId, pref>)

   这里默认考虑用户对10个item的评分,可以通过maxPrefsPerUserConsidered参数调整。

   如果指定了usersFile,则在setup时会把所有的userId读入内存,用于过滤。如果map输入数据的userID不在usersFile中,则会被忽略。注意,这是mahout的设计bug,对于比较大的数据集,很有可能造成OOM(事实上在我的测试程序中已经出现OOM了…),这种bug下面还会出现。输出的是用户的评分,同phase6的VectorOrPrefWritable的封装。

   reduce: IdentityReducer

 

phase8: partialMultiply

     input: 6和7的输出:prePartialMultiply1, prePartialMultiply2

     map: Identity。由于6和7的输出的key均为itemId,因而在reduce端同一item的相似item以及对应的用户评分会聚合到一起。

     reduce:(itemId, VectorAndPrefsWritable<similarityMatrix, List<userId>,List<pref>>) 没做特殊处理,直接合在一起,输出相似度矩阵,所有的userId及对item的打分。

 

phase9: itemFiltering 

    将过滤文件输出成<userId, itemId>。如果指定了--filterFile参数,则在最后的聚合推荐中会过滤userId对应的items。这一步在实际中多数是可以忽略的,只要不指定这个参数即可。

 

phase10: aggregateAndRecommend

    map: 对每个用户,输出对当前item的评分,以及与当前item的所有相似items==>(userId, PrefAndSimilarityColumnWritable<pref,vector<item, similarity>>)

   reduce: 聚合了这个用户所有的评分历史,以及相似items,计算对该用户的推荐结果 ==> (userId, List<itemId>)。

注意在reduce的setup中,会将phase1产生的所有itemId到index的映射读入内存,这里只要Item数据集稍大,就会OOM。这是比较严重的设计bug。

事实上,如果item是正规的整数,而不是guid之类的,phase1和这一步的读入内存是完全可以略掉的。这样的话就完全可以在企业级的数据集上使用(我的测试数据集是15亿+的user-item-rating,1.5亿+的用户,在最后这一步挂掉了,前面所有phase都能跑成功)。

至此,已经形成了推荐结果,CF完成。

 

以上的所有步骤中,phase5的计算item相似度是最慢的(这个其实也很直觉)。

总体上,mahout有几处比较严重的设计问题,这么设计的主要原因,是很多内部的Writable,如VectorWritable,它们的Index都是int型的,所以如果要改,就会牵一发而动全身。

对于超大规模数据集,建议还是裁剪一下吧,distinct item过亿一般是会挂的,最好能够控制在千万的级别内。

基于Mahout构建推荐引擎 什么是Mahout? Mahout 是 Apache旗下的一个开源项目,基于由以前的研究人员研究的经典推荐算法,它抽象和实现理论研究成果,将理论知识中的复杂运算进行封装,并支持多种数据源格式(文件,数据库等)并提供了多种可扩展的选项,将其集成到框架中去,使得开发人员能够通过API直接使用该算法实现,通过工具集隐藏其复杂的底层实现,帮助我们创建智能应用程序更快,更简单。此外,通过使... 阅读详情

相关推荐

Hadoop-Mahout:使用 Mahout 在 Hadoop 上进行推荐、集群和分类

Hadoop-Mahout 使用 Mahout 在 Hadoop 上进行推荐、集群和分类

基于hadoop下的mahout推荐系统实现

mahout是一个推荐系统的apache下的框架,而hadoop是一个分布式的框架。基于《mahout in action》一书中的第六章介绍了关于分布式的hadoop实现,首先先介绍关于mahout下的基于共现矩阵的物品相似度的算法实现。 概要 这篇文章主要论述我在实现上一篇文章所述功能时的具体操作过程。因为Hadoop现在有两套新旧API接口,因此在实现过程中需要十分注意你

渣渣 1万+

hadoop实现购物商城推荐系统

1,商城:是单商家,多买家的商城系统。数据库是mysql,语言java。2,sqoop1.9.33:在mysql和hadoop中交换数据。3,hadoop2.2.0:这里用于练习的是伪分布模式。4,完成内容:喜欢该商品的人还喜欢,相同购物喜好的好友推荐。1,通过sqoop从mysql中将“用户收藏商品”(这里用的是用户收藏商品信息表作为推荐系统业务上的依据,业务依据可以很复杂。这里主要介绍推荐系统的基本原理,所以推荐依据很简单)的表数据导入到hdfs中。2,用MapReduce实现推荐算法。3,通过sqoop将推荐系统的结果写回mysql。4,java商城通过推荐系统的数据实现<喜欢该商品的人

Hadoop 的机器学习与数据挖掘:Mahout 和 Spark MLlib

1.背景介绍 Hadoop 是一个分布式计算框架,可以处理大规模数据集。它的核心组件有 Hadoop 分布式文件系统(HDFS)和 MapReduce 计算模型。Hadoop 可以用于存储和处理大量数据,但是当需要进行机器学习和数据挖掘时,它并不是最佳选择。因为 Hadoop 的 MapReduce 模型不适合处理迭代计算和实时计算,这些计算是机器学习和数据挖掘的关键。 为了解决这个问题,Ap...

AI天才研究院 1527

CentOS7下Graylog3.0高效日志管理:从零搭建到实战应用

本文详细介绍了在CentOS7操作系统上从零开始搭建Graylog3.0日志管理平台的完整过程。内容涵盖Java环境准备、MongoDB与Elasticsearch依赖安装、Graylog Server核心配置,并实战演示了通过Graylog Sidecar集中管理日志采集器以及配置邮件告警功能,为中小型团队提供了一个比ELK更轻量、易维护的一体化日志解决方案。

weixin_29207149的博客 85

实测对比:Gromacs GPU版vsCPU版性能差异到底有多大?2023最新基准测试

本文通过2023年最新基准测试,详细对比了Gromacs GPU版与CPU版的性能差异。测试显示,GPU版本在计算速度上可提升54倍,同时显著降低内存需求和能耗成本。文章还提供了GPU版安装优化实践和硬件选购指南,为计算生物学研究提供关键参考。

weixin_29243063的博客 327

java hadoop mahout_一个基于Mahout与hadoop的聚类搭建

mahout是基于Hadoop的数据挖掘工具,因为有了hadoop,所以进行海量数据的挖掘工作显得更为简单。但是因为算法需要支持M/R,所以不是所有常用的数据挖掘算法都会支持。这篇文章会告诉你,如何使用hadoop + mahout搭出一个简易的聚类工具。第一步:搭建hadoop平台。我使用的是ubuntu 11.04,如果没有ubuntu的开发环境,就参考我的帖子《Ubuntu 10.10 ja...

weixin_39705435的博客 532

EBS开发_离散工单创建API

--以下代码于20171213在TONY环境中实现 DECLARE     l_iface_rec    wip.wip_job_schedule_interface%ROWTYPE; --工单任务接口表     l_group_id     NUMBER;     l_returnstatus VARCHAR2(40);     l_errormsg     VARCHAR2(2000

蜗牛先生快跑的博客 2596

Mahout驾驭hadoop之详解

众所周知,Mahout是基于Hadoop分布式系统的,要想看懂Mahout的源码,首先得明白mahout是如何使用hadoop的! 首先,在我的&lt;&lt;Hadoop运行原理详解&gt;&gt;一篇中,详细介绍了hadoop的运行机制,这里就不多说了!下面我就以Kmeans聚类算法为例,讲讲mahout如何利用hadoop实现数据挖掘算法并行化.如以下类图所示, 该...

184

语音增强评价指标全解析:从MOS到eSTOI的实战指南

本文全面解析了语音增强领域的核心评价指标,包括主观评价的黄金标准MOS,以及PESQ、STOI、eSTOI等关键客观指标。文章详细阐述了各指标的原理、适用场景与实战计算方法,并提供了Python代码示例,旨在帮助开发者和研究者建立科学的评估体系,以平衡语音可懂度与音质,从而优化算法效果。

yhn456789的博客 1198

机器学习——径向基函数(RBF)神经网络

目录 一、什么是基函数 二、什么是径向基函数 三、为什么RBF神经网络使用一个径向基函数作为隐含层的激活函数 四、参数训练 五、RBF网络vs BP网络和 SVM 一、什么是基函数 著名的傅里叶变换是指:n个有参(权值)的正、余弦三角函数基的和式可以等价的表示任意一个周期函数,这里的“基”和我们数学中说的坐标基或向量基含义相同,即坐标空间中任意一个向量都可以用基向量的线性和表示出来。 因此,我们引入函数空间的概念,函数空间中的每个连续函数可以表示为基函数的线性组合,就像向量空间中的每..

CHWB2580的博客 6272

mahout基于Hadoop的CF代码分析(转)

来自:http://www.codesky.net/article/201206/171862.html mahout的taste框架是协同过滤算法的实现。它支持DataModel,如文件、数据库、NoSQL存储等,也支持Hadoop的MapReduce。这里主要分析的基于MR的实现。 基于MR的CF实现主要流程就在 org.apache.mahout.cf.taste.Hadoop.item...

weixin_33778544的博客 108

基于MATLAB实现的克里金插值的代码

参考代码 克里金插值matlab代码 youwenfan.com/contentcsb/81657.html。

jghhh01的博客 481

Mahout介绍和简单应用

Mahout学习(主要学习内容是Mahout中推荐部分的ItemCF、UserCF、Hadoop集群部署运行) 1.Mahout是什么? Mahout是一个算法库,集成了很多算法。 Apache Mahout 是 Apache Software Foundation(ASF)旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。 Mah...

Null的博客 5086

【Flutter 问题系列第 85 篇】Xcode 运行 Flutter 提示 The Dart VM Service was not discovered after 60 seconds.

在 Xcode 上运行 Flutter 时提示 `The Dart VM Service was not discovered after 60 seconds. This is taking much longer than expected...`,意思是 `60秒后未发现Dart虚拟机服务。这比预期的要长得多`

“Allen Su”的博客 2235

汽车电子RTOS--AUTOSAR OS

AUTOSAR OS(AUTomotive Open System ARchitecture Operating System)是AUTOSAR(汽车开放系统架构)标准中的一个重要组件,它是一个专门为汽车电子控制单元(ECU)设计的实时操作系统(RTOS)。AUTOSAR OS旨在提供一个标准化的软件平台,以促进不同供应商和汽车制造商之间的组件复用和协同开发,提高软件质量和降低成本。

MHD0815的博客 1797

147 Mahout运行在Hadoop集群

Hadoop 执行脚本 hadoop jar mahout-examples-0.9-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input /sanbox/movie/10M.txt --output /sanbox/movie/r -s SIMILARITY_LOGLIKELIHOOD 参数说明: –inp...

阿甘兄 597

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

使用Mahout实现基于用户的协同过滤(user-based CF)算法/Mahout推荐系统入门实践

Mahout是 Apache Software Foundation(ASF)旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用Apache Hadoop库,Mahout可以有效地扩展到云中。逻辑回归Bayesian贝叶斯SVM支持向量机Perceptron感知器算法神经网络随机森林有限波尔兹曼机Canopy聚类K均值算法模糊K均值。

如烟 4258

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

mahout 0.9与 hadoop2.x 冲突 解决办法

在跑mahout的CF时遇到一个类冲突问题,IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected 如下图 查询了下原因,是由于mahout0.9以下依赖的hadoop版本是1.x,和hadoop 2.x 不兼

explorer1989的专栏 1251

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

mahout基于hadoop的推荐引擎代码分析

mahout的taste框架是协同过滤算法的实现。它支持DataModel,如文件、数据库、NoSQL存储等,也支持hadoop的MapReduce。这里主要分析的基于MR的实现。 基于MR的CF实现主要流程就在org.apache.mahout.cf.taste.hadoop.item.RecommenderJob类中(注意mahout有两个RecommendJob,要看清楚是

lhfredfly的专栏 1199

Apache Mahout的Taste基于Hadoop实现协同过滤推荐引擎的代码分析

Taste 是 Apache Mahout 提供的一个协同过滤算法的高效实现,它是一个基于Java实现的可扩展的高效的推荐引擎。 该推荐引擎是用这样简单的数据格式表达用户对物品的偏好。 以此为输入数据,计算后就可以得到为每个user推荐的items列表。 他提供了方便的单机版的编程接口,也提供了基于hadoop的分布式的实现。 单机版的编程接口主要适用于写demo和做算法的评估,若处理

zhang434的专栏 1165

个性化推荐学习(mahout)

参考链接:个性化推荐算法总结:https://blog.youkuaiyun.com/Yasin0/article/details/89、

littleyy666的博客 1642

Mahout学习总结

Mahout学习总结 一、Mahout定义 ①Mahout是一个算法库,集成了很多算法; ②Mahout是Apache SoftWare Foundation(ASF)旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序; ③Mahout包含许多实现,包括:聚类、分类、推荐过滤、频繁子项挖掘; ④通过Apache Hadoop库,Mahout可以有效地扩展到Hadoop集群; 二、M...

#7的博客 1277

运行mahout0.6 hadoop版本的CF

1准备数据集这里使用了movieLen的数据集, 下载地址: http://www.grouplens.org/node/73 这里选取了那个1m的数据集 下载之后还要写个小程序将格式转化成csv格式的,才能在作为hadoop的输入 package com.dataset.format.convert; import java.io.BufferedReader;

xhjx2618的专栏 678

Mahout基于hadoop的推荐器(Recommender)

[size=x-large]介绍[/size] 本页主要描述,怎么在hadoop集群上运行Mahout Taste的推荐器 [size=x-large]步骤[/size] [size=large]在那单个机器上测试[/size] 进入事例目录,执行: [code="java"]mvn -q exec:java -Dexec.mainClass="org.apache.mahout.c...

奔跑的羚羊 311

hadoop2.2+mahout0.9实战

版本:hadoop2.2.0,mahout0.9。 使用mahout的org.apache.mahout.cf.taste.hadoop.item.RecommenderJob进行测试。 首先说明下,如果使用官网提供的下载hadoop2.2.0以及mahout0.9进行调用mahout的相关算法会报错。一般报错如下: java.lang.IncompatibleClassCh

nkliming的专栏 1402
上一篇: hive中间结果和结果的压缩
下一篇: 最大熵模型
inte_sleeper
博客等级 码龄21年 73粉丝 73原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值