mahout基于用户的协同过滤-userCF

首先参考文章用Maven构建Mahout项目:http://blog.fens.me/hadoop-mahout-maven-eclipse/   完成了利用maven搭建的mahout推荐项目。

 首先,要处理的数据形式是什么样的:

用户id 物品id 用户打分
     
     
协同过滤算法的过程:

基于用户的协同过滤算法思想很简单,就是像用户推荐与其有相同兴趣的用户的物品。

主要是利用矩阵变换和欧式距离公式处理数据。

要判定最临近用户(即兴趣形似用户)就得用一个衡量方式排序并筛选出来,在这里衡量的标准就是距离。

欧式距离:

similar = 1/(1+sqrt( (a-b)2 + (a-c)2 ))
而mahout中对算法公式进行了优化:

similar = n/(1+sqrt( (a-b)2 + (a-c)2 )) 

    n为b,c的个数
    similar>1 => similar=1
    similar<-1 => similar=-1

如果要计算距离,就需要将数据转化成矩阵形式:

101 102 103 104 105 106 107
[1,] 5.0 3.0 2.5 0.0 0.0   0   0
[2,] 2.0 2.5 5.0 2.0 0.0   0   0
[3,] 2.5 0.0 0.0 4.0 4.5   0   5
[4,] 5.0 0.0 3.0 4.5 0.0   4   0
[5,] 4.0 3.0 2.0 4.0 3.5   4   0 


欧氏相似矩阵转换(矩阵与自身做距离计算)

 [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 0.0000000 0.6076560 0.2857143 1.0000000 1.0000000
[2,] 0.6076560 0.0000000 0.6532633 0.5568464 0.7761999
[3,] 0.2857143 0.6532633 0.0000000 0.5634581 1.0000000
[4,] 1.0000000 0.5568464 0.5634581 0.0000000 1.0000000
[5,] 1.0000000 0.7761999 1.0000000 1.0000000 0.0000000 

计算出的最临近用户结果:取前两位距离最近的(userCF.java里有对NEIGHBORHOOD_NUM的设定

[1,]    4    5
[2,]    5    3
[3,]    5    2
[4,]    1    5
[5,]    1    3 
用户1 与用户4.5最临近

然后比较4.5用户对商品的评分:取其平均值做排序筛选

       101  102  103  104  105  106  107
   4    0    0         0      4.5   0.0    4      0
   5    0    0         0      4.0   3.5    4      0 

所以对1的推荐即为 104 和106(userCF.java里有对RECOMMENDER_NUM推荐物品个数的设定)

输出结果形式:

uid:1(104,4.274336)(106,4.000000)
uid:2(105,4.055916)
uid:3(103,3.360987)(102,2.773169)
uid:4(102,3.000000)
uid:5


你可能感兴趣的:(mahout基于用户的协同过滤-userCF)