首先参考文章用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