推荐算法的核心在于对相似用户和相似物品的识别,下面手动重复下这个过程帮助理解。
数据准备:
初始数据:
1 |
101 |
5 |
1 |
102 |
3 |
1 |
103 |
2.5 |
2 |
101 |
2 |
2 |
102 |
2.5 |
2 |
103 |
5 |
2 |
104 |
2 |
3 |
101 |
2.5 |
3 |
104 |
4 |
3 |
105 |
4.5 |
3 |
107 |
5 |
4 |
101 |
5 |
4 |
103 |
3 |
4 |
104 |
4.5 |
4 |
106 |
4 |
5 |
101 |
4 |
5 |
102 |
3 |
5 |
103 |
2 |
5 |
104 |
4 |
5 |
105 |
3.5 |
5 |
106 |
4 |
变成矩阵表示:
用户ID/资源编号 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
1 |
5 |
3 |
2.5 |
|
|
|
|
2 |
2 |
2.5 |
5 |
2 |
|
|
|
3 |
2.5 |
|
|
4 |
4.5 |
|
5 |
4 |
5 |
|
3 |
4.5 |
|
4 |
|
5 |
4 |
3 |
2 |
4 |
3.5 |
4 |
|
推荐算法步骤:
- 首先计算相似性:
计算方法有:欧几里得距离法,皮尔逊相关系数,cosine相似度,Tanimoto系数。
以欧几里得距离法为例:
1) 基于相似用户
用户相似度矩阵(保留两位小数):
用户/用户 |
1 |
2 |
3 |
4 |
5 |
1 |
0 |
0.2 |
0.29 |
0.67 |
0.47 |
2 |
0.2 |
0 |
0.33 |
0.19 |
0.19 |
3 |
0.29 |
0.33 |
0 |
0.28 |
0.36 |
4 |
0.67 |
0.19 |
0.28 |
0 |
0.4 |
5 |
0.47 |
0..19 |
0.36 |
0.4 |
0 |
计算公式:以用户1和用户2为例:
Distance(U1,U2) =sqrt(sum(pow(5-2, 2), pow(3-2.5, 2), pow(2.5-5, 2))) = ;
Similar(U1,U2) =1/(1+Distance(U1,U2));
double[][] userMatrix = new double[App.USERNUM][App.USERNUM];
for(int i=0; i< App.USERNUM; i++){
//没有做任何优化
for(int j=0; j< App.USERNUM; j++){
if(i == j)
continue;
double sum = 0;
for(int k=0; k<App.ITEMNUM ;k++){
if(App.matrix[i][k]!=0 && App.matrix[j][k]!=0)
sum += Math.pow(App.matrix[i][k]-App.matrix[j][k], 2);
}
if(sum >0)
userMatrix[i][j] = Double.parseDouble(new DecimalFormat("#.00").format(1.0/(1+Math.sqrt(sum))));
}
}
计算结果如上表,从上表中就可以看出如果取两个最近邻居,推荐结果最多3个的话,则:
用户 |
相似用户 |
推荐物品 |
用户1 |
4,5 |
104,105,106 |
用户2 |
3 |
105,107 |
用户3 |
2,5 |
102,103,106 |
用户4 |
1,5 |
102,105 |
用户5 |
1,4 |
没有推荐 |
Mahout结果如下:
结论:从上面结果可以看出,结果大致差不多,同时mahout会对一些推荐的结果进行了修正,去掉了一些结果。
2) 基于物品相似度:
物品相似度矩阵
物品/物品 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
101 |
0 |
0.3 |
0.17 |
0.39 |
0.33 |
0.5 |
0.29 |
102 |
0.3 |
0 |
0.27 |
0.47 |
0.67 |
0.5 |
0 |
103 |
0.17 |
0.27 |
0 |
0.2 |
0.4 |
0.31 |
0 |
104 |
0.39 |
0.47 |
0.2 |
0 |
0.59 |
0.67 |
0.5 |
105 |
0.33 |
0.67 |
0.4 |
0.59 |
0 |
0.67 |
0.67 |
106 |
0.5 |
0.5 |
0.31 |
0.67 |
0.67 |
0 |
0 |
107 |
0.29 |
0 |
0 |
0.5 |
0.67 |
0 |
0 |
计算公式:以物品1和物品2为例:
Distance(I1,I2)=sqrt( sum(pow(5-3, 2), pow(2-2.5, 2), pow(4-3, 2)));
Similar(I1,I2) =1/(1+Distance(I1,I2));
接下来同上。