设为首页 收藏本站
查看: 1010|回复: 0

[经验分享] mahout推荐部分在hadoop上实现步骤分析

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-1-23 09:23:30 | 显示全部楼层 |阅读模式
 mahout推荐部分单机运行时的代码没有具体看,但是理解看来应该不难,给定【userid,item,rate】的话其他语言写个算法也能实现。在hadoop上运行的时候,才具有挑战意义,没有那些datamodel的概念,mahout in action书上的内容看了半天觉得还是不大了解,上面算的“共现矩阵”,神马神马的,资料也比较少,看得更晕,于是自己看了下实现的步骤,发现还是挺“牛逼”的,出于对java的掌握程度略低,此处就把大概步骤列一下,看官请轻喷- -!
  如网上说得,这个部分最恶心的一点是RecommenderJob 是 final类...图如下:
     表格右半部分由于博客园搞的东西被遮住了看不到,程序员么,总有办法解决的~ 【审查元素》复制table节点》插入到新的html里】或者【选中表格部分再复制到excel里面看】
  整个里面以皮尔逊系数的计算为例,建议先看下皮尔逊算法的计算公式,以及如何将他分解(分解是关键)。
job_name功能 mapper reducer combiner
inputformatpathinputoutputinputoutputoutputformatpath
itemIDIndex产生itemId->index的映射textrating.CSVtext[index,itemId][index,[itemId,*]][index,min(itemId)]sequencepreparePreferenceMatrix/itemIDIndex/ItemIDIndexReducer
toUserVectors产生userID映射
每个itemID的value
textrating.CSVtext[userId,[itemId,prefValue]][userId,[[itemId,prefValue],*]][userId,[[index,value],*]]sequencepreparePreferenceMatrix/userVectors/
   Count产生用户数sequencepreparePreferenceMatrix/numUsers.bin
toItemVectors产生index映射
userID的value
sequencepreparePreferenceMatrix/userVectors/[userId,[[index,value],*]][index,[[userId,value],*]][index,[[[userId,value],*],*]][index,[[userId,value],*]]sequencepreparePreferenceMatrix/ratingMatrix/ToItemVectorsReducer
  
normsAndTranspose共同购买某个item的用户的商品直接的第一次相似度计算,用户后面产生item到user的最终相似度,分解pearson计算的分子和父母可以发现如此计算的原因sequencepreparePreferenceMatrix/ratingMatrix/[index,[[userId,value],*]][userId,[index,pref]][userId,[[index,pref],*](Iterable)][userId,[[index,pref],*](vector)]sequenceweightsMergeVectorsReducer
  产生rowVector为
(xi-x拔)/sqrt(sum(x-x拔后的平方)),pref为上述值
numNonZeroEntries为每次叠加+1
maValue为上述value的最大值
cos和pearson时norm都为0
判断后将三个值写入对应文件,
同时输出merge后的向量
2的24次方减一:16777215sequencemaxValues.bin
 
16777215
sequencenorms.bin
 
150994943
sequencenumNonZeroEntries.bin
 
pairwiseSimilaritymapper端:由一个用户的第一次相似度计算结果作为输入,产生 item到item的相似度计算,pearson为两个因子相乘,作为第二次相似度的结果,reducer端,汇总itemA对itemB的第二次相似度计算,原因为A对B时,是N对N的行为,最后相似度相加作为结果sequenceweights[userId,[[index,pref],*]][indexA,[[indexB,aggr(prefA,prefB)],*]][indexA,[[[indexB,aggr(prefA,prefB)],*]],*][indexA,[[indexB,simB],*]]sequencepairwiseSimilarity/VectorSumReducer
  indexB>indexA,返回
vector.aggregate(prefA,prefB),pearson里面
调用cosin,默认为两式相乘
preparePreferenceMatrix/ratingMatrix/
这里面获取列的总数numberOfColumns
像combiner那样先做一次变换,然后调用vector.similarity(),public similarity(double dots, double normA, double normB, int numberOfColumns) {
    return dots;
  } cosin 和 person返回dots ,就是value
到这边indexA 与 indexB的相似度已经计算完 对于indexA可能有多个indexB,simB,
合并相同的indexB,默认采用function.plus,为simB+simB1
asMatrix减少输入结果集,N*N/2减少为N*TOPK,并且去0sequencepairwiseSimilarity/[indexA,[[indexB,simB],*]]循环,输出 [indexB,[indexA,simB]],[indexC,[indexA,simC]]simB,simC为非0,
一次性输出[indexA,topKSimilarities]的TOPK向量,K为maxSimilaritiesPerRow,所有输出都是非0
[indexA,[topKSimilarities,transposedPartial]][itemA,[topKSimilarities]]sequencesimilarityMatrixMergeToTopKSimilaritiesReducer
  maxSimilaritiesPerRow如果没设置返回全部,
如果没任何限制 这里应该也包括了自己和自己的相似度
 
prePartialMultiply1mapper端重设和自己的相似度为double.NaNsequencesimilarityMatrix[itemA,[topKSimilarities]][itemA,[topKSimilarities]]default reducer sequenceprePartialMultiply1
  重设和自己的相似度为double.NaN
 
prePartialMultiply2过滤userVector中的数据,有些用户不需要sequencepreparePreferenceMatrix/userVectors/[userId,[[index,value],*]][index,[user_id,value]]default reducer sequenceprePartialMultiply2
  取存在于userFile中的user数据,如果存在user表
则只输出user表中的数据
 
partialMultiply通过判断是是vector还是[userid,value],产生一个物品的topk相似度和用户对该物品的评分sequenceprePartialMultiply1 default mapperindex,value为prefOrvectorindex,value为prefAndVectorsequencepartialMultiply
  prePartialMultiply2 对于任一item,只有一个topKSimilarities,但是有多个用户对这个item的value(similarityMatrixColumn, userIDs, prefValues)
 
itemFiltering根据设置和partialMultiply一样输出的向量,最终达到过滤textfilterFiletext[itemId,userId][itemid,[userId,*]][index,[[index,NaN],[userId,*],[1.0,*]]]sequenceexplicitFilterPath存在时才能找到
 
aggregateAndRecommend最终推荐… partialMultiply[index,VectorAndPrefsWritable
(vector, userIDs, prefValues)]
[userId,[prefValue,similarityMatrixColumn]][userId,[[prefValue,similarityMatrixColumn],*]]
  explicitFilterPath


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-14550-1-1.html 上篇帖子: Hadoop伪分布模式配置 下篇帖子: Windows下Cygwin环境的Hadoop安装(1)- Cygwin安装和配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表