资源描述:
《Apache Mahout的Taste基于Hadoop实现协同过滤推荐引擎的代码分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、ApacheMahout的Taste基于Hadoop实现协同过滤推荐引擎的代码分析Taste是ApacheMahout提供的一个协同过滤算法的高效实现,它是一个基于Java实现的可扩展的高效的推荐引擎。该推荐引擎是用这样简单的数据格式表达用户对物品的偏好。以此为输入数据,计算后就可以得到为每个user推荐的items列表。他提供了方便的单机版的编程接口,也提供了基于hadoop的分布式的实现。单机版的编程接口主要适用于写demo和做算法的评估,若
2、处理大规模数据,还是需分布式的实现。以下是对org.apache.mahout.cf.taste.hadoop.item.RecommenderJob的各MapReduce步骤的一个解读。Taste实现一个分布式的协同过滤推荐共经历了如下12个MapReduce步骤。以下分析了各步骤的Mapper和Reducer都做了哪些工作,并有什么格式的数据输出。代码分析:1、计算item的itemid_index和最小itemid值1.1、ItemIDIndexMapper.class,VarIntWrit
3、able.class,VarLongWritable.class,用原始输入,将userid,itemid,pref数据转成itemid_index,itemid 1.2、ItemIDIndexReducer.class,VarIntWritable.class,VarLongWritable.class,在itemid_index,Iterator中找最小的itemid,输出itemid_index,minimum_itemid此处只是保存一个int型的itemid_index索
4、引和对应的long型的itemid的映射2、计算各user的item偏好向量,即Vector- 2.1、ToItemPrefsMapper.class,VarLongWritable.class,booleanData?VarLongWritable.class:EntityPrefWritable.class,用原始输入,读入偏好数据,得到userid,2.2、ToUserVectorReducer.class,VarLongWritable.clas
5、s,VectorWritable.class,将userid,Iterator中的itemid变成itemid_index,得到userid,Vector,后者用RandomAccessSparseVector来存。3、统计数据中有多少个user3.1、CountUsersMapper.class,CountUsersKeyWritable.class,VarLongWritable.class,用步骤2的输出,统计独立userid数
6、目,先转换数据为userid,userid3.2、CountUsersReducer.class,VarIntWritable.class,NullWritable.class,通过CountUsersPartitioner将所有数据发到一个区,一个Reducer来处理由于userid都已排序,所以可以用极简单的方式来统计出独立userid数输出只有一个值,即用户数4、计算item的user偏好向量,即Vector,也即拿步骤2的结果做矩阵的修剪和转置4.1、MaybeP
7、runeRowsMapper.class,IntWritable.class,DistributedRowMatrix.MatrixEntryWritable.class,用步骤2的输出,按指定的maxCooccurrences参数值来修剪Vector的数目,目的是控制计算的规模,减少计算量然后转为以userid_index为列号、itemid_index为行号、pref为值的矩阵,用MatrixEntryWritable表示矩阵。输出为itemid_index,Matrix8、ex,itemid_index,pref>4.2、ToItemVectorsReducer.class,IntWritable.class,VectorWritable.class,输出为itemid_index,Vector,相当于对步骤2的结果进行了矩阵的转置,有了偏好矩阵数据,接下来会调用RowSimilarityJob来计算行的相似度此处的行是item,所以默认是item-base的CF。但其实可以通过传入是否转置的参数来对步骤1进行调