推荐算法之计算相似度

推荐算法的核心在于对相似用户和相似物品的识别,下面手动重复下这个过程帮助理解。

 

 

数据准备:

初始数据:

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

 

 

推荐算法步骤:

  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));

接下来同上。

 

posted @ 2014-01-21 15:30  IT_cnblogs  阅读(2625)  评论(0编辑  收藏  举报