推荐算法的核心在于对相似用户和相似物品的识别,下面手动重复下这个过程帮助理解。
数据准备:
初始数据:
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));
接下来同上。