推薦算法的核心在於對類似用戶和類似物品的識別,下面手動重複下這個過程幫助理解。算法
數據準備:優化
初始數據:spa
1code |
101orm |
5blog |
1ci |
102資源 |
3table |
1form |
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));
接下來同上。