Mahout中基于项目的CF主要步骤


这里只是记录整个算法的主要流程,中间没有涉及到具体的细节。

假设原始的数据集的格式如下:

第一步:生成用户向量(user-vector),最终输出结果为,这个vector记录了这个userId打过分的所有项目的打分值。

第二步:生成项目向量(item-vector),map的输入为第一步的输出,这一步最后的输出为,这个vector记录了所有对这个itemId打过分的userId,以及对应的打分值。

第三步:计算Item Similarity,根据步骤一生成的用户向量(实际上经过了进一步的处理)计算item similarity

             对于每一个用户向量,首先将基按照itemId升序排序,例如,假如有用户A和用户B的用户向量,A对1,2,3,4这四个item打分了,B对2,3,5这三个item打分了,排序之后 有A->1,2,3,4 ;B->2,3,5 ,对于某一个用户向量,可以认为里面的某一个item与它后面(包括自身)的items存在某种相似度(因为它们出现在同一个用户向量中,可能具有一定的关联),例如对于向量A ,可以认为 1和1,2,3,4有相似度,2和2,3,4有相似度,3和3,4有相似度,4 和4有相似度,所以对于一个用户向量,最终输出多组关系:

对于A输出  : 

        (1)   <1,vector<1,2,3,4>>;

        (2)   <2,vector<2,3,4>>;

        (3)   <3,vector<3,4>>

        (4)   <4,vector<4>>

对于B输出  : 

        (5)   <2,vector<2,3,5>>;

        (6)   <3,vector<3,5>>;

        (7)   <5,vector<5>>

最后 reduce的时候,key相同的关系对汇总到一块,例如在上面的例子中(2) 和(5)合并,(3)和(6)合并

经过这个步骤之后,可以得到和某个item相似的其它item,它们构成了一个上三角形的相似度矩阵(前面对每个用户向量按itemId升序排序保证了最后得到一个上三角形),经过简单的变换后可以由这个上三角形矩阵获得整个相似度矩阵,它是对称矩阵。到此,相似度矩阵生成,item similarity 计算完毕。


第四步:根据用户向量(第一步得到)和第三步得到的相似度,得到结果 ,List>>,即对于某一个item,输出:

   1. 它的相似度向量,即item-vector

   2. 对这个item打过分的所有用户id

   3. 用户打分值

这三个输出组合成一个 VectorAndPrefsWritable对象,所以输出的是


第五步: 根据第四步输出,得到结果 > ,即这个user对某一个item打分值为pref,并且这个item的相似度向量为vector。那么很明显,这个vector里面的items是有可能被推荐给这个用户的,例如,假如最后 用户A对item1 打分了,item1的相似度向量中包含item2和item3,同时A也对item4打分了,item4的相似度向量中包含item2和item5,即:

用户      打分item      与打分item相似的items

  A         item1          item2    item3

  A         item4          item2    item5

显然item2,3,5都有可能被推荐给用户A ,可以计算出将它们推荐给A的相似度有多大,具体怎么计算还是看源代码吧,发现语言好难组织。好吧,我是菜鸟。








你可能感兴趣的:(Mahout)