1、Pearson 相关系数 ,相似度计算,
用于推荐系统用户推荐上,比如用户A 看过 电影 M1,M2, M3 ,用户B 看过电影M1,M3
根据M1,M3 的电影评分,发现用户A 和用户B 相似,就可以把 M2电影推荐给用户B。
---缺点 并没有考虑电影的内容,只是根据A/B 认识进行推荐的,有很大局限性,如果不认识的用户,就会出现很大的偏差,怎么办?
这里暂不解决,CF CB 的算法进行计算。
Pearson 计算公式
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 比价喜欢个别电影,其他也很低,都是相关性为负数。