算法 Pearson ?

1、Pearson 相关系数 ,相似度计算,

 用于推荐系统用户推荐上,比如用户A 看过 电影 M1,M2, M3 ,用户B 看过电影M1,M3

 根据M1,M3 的电影评分,发现用户A 和用户B 相似,就可以把 M2电影推荐给用户B。

---缺点 并没有考虑电影的内容,只是根据A/B 认识进行推荐的,有很大局限性,如果不认识的用户,就会出现很大的偏差,怎么办? 

这里暂不解决,CF CB 的算法进行计算。

Pearson 计算公式

\frac{\sum_{ij}^{n}(x_{i}-x)(y_{j}-y))}{\sqrt{\sum_{i}^{n}(x_{i}-x)^{2}}\sqrt{\sum_{i}^{n}(y_{i}-y)^{2}}}

x 表示 xi...n 的平均值 y 表示 yj...n 的平均值

--------------

package com.fandong.algorithm;

import java.util.Arrays;

/***
 * 均方差
 */
public class Pearson {
    /***
     * 计算相关的系数
     * -1 - 1.0 之间
     * 0.8-1.0 极强相关性
     * 0.6-0.8 强相关性
     * 0.4-0.6 弱相关性
     * 0.2-0.4 极弱相关性
     * 0-0.2   无相关性
     * @param ds1
     * @param ds2
     * @return
     */
   public double getCorrelationoefficent(Double[] ds1, Double[] ds2) throws Exception{
       if(ds1.length == 0 || ds2.length == 0){
           throw new Exception("数组大小为0");
       }
       double avgs1 = Arrays.stream(ds1).mapToDouble(s->s).sum()/ds1.length;
       double avgs2 = Arrays.stream(ds2).mapToDouble(s->s).sum()/ds2.length;

       double sum1 =0D,sum2=0D;
       for(double item: ds1){
           sum1 +=Math.pow(item-avgs1,2);
       }
       for(double item: ds2){
           sum2 +=Math.pow(item-avgs2,2);
       }
       double numerator =0D;
       for(int i=0;i<ds1.length;i++){
           numerator +=(ds1[i]-avgs1)*(ds2[i]-avgs2);
       }
       return numerator / (Math.sqrt(sum1)*Math.sqrt(sum2));
   }


}
package com.fandong;

import com.fandong.algorithm.Pearson;

public class PearsonDemo {

    public static void main(String[] args) throws Exception {
        /**
         * 假设处理的好的数据如下
         * 表示对一类电影的评分集合
         * 相关系数-1 - 1.0
         */
        Double[] m1 = new Double[]{1.0,0.0,2.0,3.0,1.0,2.0};
        Double[] m2 = new Double[]{4.0,4.0,5.0,4.0,3.0,5.0};
        Double[] m3 = new Double[]{3.0,1.0,3.0,4.0,3.0,2.0};

        Pearson pearson = new Pearson();
        System.out.println("m1 : m2 的相关系数"+ pearson.getCorrelationoefficent(m1,m2));
        System.out.println("m1 : m3 的相关系数"+ pearson.getCorrelationoefficent(m1,m3));
        System.out.println("m2 : m3 的相关系数"+ pearson.getCorrelationoefficent(m2,m3));
    }


}

说明: 评分系统0-5 分,我们发现,m1 的用户可能很不喜欢这些电影。m2 的对电影都比较认可。这就相当于两个极端值。所有两者的相关项相关性不强。

m1 m3 的相关性比较强,说明都打了相对低的分。

m2 m3 的相关性为负数,虽然m3 比价喜欢个别电影,其他也很低,都是相关性为负数。

发布了61 篇原创文章 · 获赞 1 · 访问量 660

猜你喜欢

转载自blog.csdn.net/u012842247/article/details/103517227