mahout算法源码分析之Itembased Collaborative Filtering(五)推荐
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit。
接上篇,本篇分析该算法的最后一个job。
在上篇计算共生矩阵的乘积后,接下来又到了一个shouldRunNextPhase的方法了,这个方法里面含有三个prepareJob,但是本次只分析一个,为啥?因为在实战中没有设置filterFile,这里其实是可以设置filterFile的,设置这个参数的作用是什么,用源码中的英文解释就是过滤掉不不关心的用户,那我就会产生疑问了,在上个计算共生矩阵乘积的时候明明是可以设置一个文件,用于过滤掉我们不关心的用户了,这里还要过滤?所以这里不是很明白源码设计的思路。但是,这里是分析算法的,关于过滤,其实也可以这样说,把全部结果分析出来后,然后再进行过滤,全部结果的分析就是算法的大概,而后面进行过滤可做可不做(这种做法和原来设计的还是有点不同的,效率不一样,如果可以在前期过滤掉一些数据,那么后面的计算会加快)。整个系列blog都是分析算法,所以过滤这一块暂时不关心。
这里可以看到是有三个job调用的:
上面的图中的userIDWritable:5,prefAndSimilarityColumn:org.apache.mahout.cf.taste.hadoop.item.PrefAndSimilarityColumnWritable@5cb2666c类似这样的就是最后map的输出结果了,这个结果怎么解读?首先key就是userIDWritable了,后面就是实际值;后面的prefAndSimilarityColumn打印的是一个地址,同时看到不同的用户id输出的地址竟然是一样的?比如针对第一条输出(即上面的输出),其输出其实应该是<key,value> --><5,[4.0,[107:0.10275248438119888,106:0.14243397116661072,105:0.11584573984146118,104:0.1601526141166687,103:0.15548737347126007,102:0.14201472699642181,101:NaN]]>而第二条的输出其实是:<key,value> -->
<1,[5.0,[107:0.10275248438119888,106:0.14243397116661072,105:0.11584573984146118,104:0.1601526141166687,103:0.15548737347126007,102:0.14201472699642181,101:NaN]]>通过上面的两条比较发现其实value只有prefValue的值不一样而已,但是为什么地址居然是一样的呢?这个是因为prefAndSimilarityColumn变量是在for循环外面定义好了,所以其地址不会变,同时因为每条数据设置值后直接写入了文件中,不存在后面设置的值会覆盖前面值的情况;整合后的map输出如下所示(只列出了用户1和2的数据):1=[104:3.5838122,106:3.4916115,105:3.473163], 2=[106:2.8146582,105:2.7573717,107:2.0]可以看到这个已经是排过序的了,到这里全部的mahout源码基本分析完毕,下篇应该来一篇整体的数据流程才行,使用excel做一个表格上面写上公式,这样应该会便于理解这个算法。分享,成长,快乐
转载请注明blog地址:http://blog.csdn.net/fansy1990