推薦算法之計算類似度

推薦算法的核心在於對類似用戶和類似物品的識別,下面手動重複下這個過程幫助理解。算法

 

 

數據準備:優化

初始數據: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

 

 

推薦算法步驟:

  1. 首先計算類似性:

計算方法有:歐幾里得距離法,皮爾遜相關係數,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));

接下來同上。

相關文章
相關標籤/搜索