皮尔逊相关度系数原理,以及java实现


转载请标明出处:http://blog.csdn.net/u010670689/article/details/41895105

1.原理:



以上列出的四个公式等价,其中E是数学期望,cov表示协方差,N表示变量取值的个数。

数学期望,协方差解释文章链接:http://blog.csdn.net/u010670689/article/details/41896399


相关系数的值介于–1与+1之间,即–1≤r≤+1。其性质如下:

  • 当r>0时,表示两变量正相关,r<0时,两变量为负相关
  • 当|r|=1时,表示两变量为完全线性相关,即为函数关系。
  • 当r=0时,表示两变量间无线性相关关系。
  • 当0<|r|<1时,表示两变量存在一定程度的线性相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱。
  • 一般可按三级划分:|r|<0.4为低度线性相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关。


2.java实现:使用公式二实现的

package youling.studio.pearson;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

/** 
*  
*  
*/ 
public class Similarity { 
   static Logger logger = Logger.getLogger(Similarity.class.getName()); 
   Map<String, Double> rating_map = new HashMap<String, Double>(); 
   List<Double> rating_map_list = new ArrayList<Double>(); 
 
   /** 
    * @param args 
    */
   public static void main(String[] args) { 
       Similarity similarity1 = new Similarity(); 
       similarity1.rating_map_list.add(20d); 
       similarity1.rating_map_list.add(7d); 
       similarity1.rating_map_list.add(26d); 
       Similarity similarity2 = new Similarity(); 
       similarity2.rating_map_list.add(7d); 
       similarity2.rating_map_list.add(3d); 
       similarity2.rating_map_list.add(6d); 
       logger.info("" + similarity1.getsimilarity_bydim(similarity2)); //0.8多,属于高度相关
       
       
       Similarity similarity3 = new Similarity(); 
       similarity3.rating_map_list.add(12d); 
       similarity3.rating_map_list.add(4d); 
       similarity3.rating_map_list.add(8d); 
       Similarity similarity4 = new Similarity(); 
       similarity4.rating_map_list.add(3d); 
       similarity4.rating_map_list.add(1d); 
       similarity4.rating_map_list.add(2d); 
       logger.info("" + similarity3.getsimilarity_bydim(similarity4)); //结果是1.0成比例其实就是前面和后面是倍数关系
       
  } 
   
 
   public Double getsimilarity_bydim(Similarity u) { 
       if(this.rating_map_list.size()!=u.rating_map_list.size()){
	   return null;
       }
       double sim = 0d; //最后的皮尔逊相关度系数
       double common_items_len = this.rating_map_list.size(); //操作数的个数
       double this_sum = 0d; //第一个相关数的和
       double u_sum = 0d; //第二个相关数的和
       double this_sum_sq = 0d; //第一个相关数的平方和
       double u_sum_sq = 0d; //第二个相关数的平方和
       double p_sum = 0d; //两个相关数乘积的和
       
       for(int i = 0;i<this.rating_map_list.size();i++){
	   double this_grade = this.rating_map_list.get(i);
	   double u_grade = u.rating_map_list.get(i);
	   //评分求和                     //平方和                     //乘积和
	   this_sum += this_grade;
	   u_sum += u_grade;
	   this_sum_sq += Math.pow(this_grade, 2);
	   u_sum_sq += Math.pow(u_grade, 2);
	   p_sum += this_grade*u_grade;
       }
       
       logger.info("common_items_len:"+common_items_len); 
       logger.info("p_sum:"+p_sum); 
       logger.info("this_sum:"+this_sum); 
       logger.info("u_sum:"+u_sum); 
       double num = common_items_len * p_sum - this_sum * u_sum; 
       double den = Math.sqrt((common_items_len * this_sum_sq - Math.pow(this_sum, 2)) * (common_items_len * u_sum_sq - Math.pow(u_sum, 2))); 
       logger.info("" + num + ":" + den); 
       sim = (den == 0) ? 1 : num / den; 
	   
       return sim;
   } 
   
} 
 


3.适用范围:

当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于:

(1)、两个变量之间是线性关系,都是连续数据。

(2)、两个变量的总体是正态分布,或接近正态的单峰分布。

(3)、两个变量的观测值是成对的,每对观测值之间相互独立。






---


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。