• 推荐算法之计算相似度


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

     

    数据准备:

    初始数据:

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

    接下来同上。

  • 相关阅读:
    第三次作业
    利用LINQ to SQL 增删改查本地数据库
    【转】C#,回车,换行
    【转】C#3.0编码习惯与命名规则
    Connect to the DSP on C6A8168/DM8168/DM8148 using CCS
    【转】OpenCV 移植学习EMCV
    目标跟踪小结
    利用TortoiseSVN获取最新版本的OpenCV源码
    转图像灰度化方法总结及其VC实现
    OpenCV读取视频的格式注意点
  • 原文地址:https://www.cnblogs.com/abc123456789/p/3528470.html
Copyright © 2020-2023  润新知