Pearson product-moment correlation coefficient in java(java的简单相关系数算法)

一、什么是Pearson product-moment correlation coefficient(简单相关系数)?

          相关表和相关图可反映两个变量之间的相互关系及其相关方向,但无法确切地表明两个变量之间相关的程度。

于是,著名统计学家卡尔·皮尔逊设计了统计指标——相关系数(Correlation coefficient)。

相关系数是用以反映变量之间相关关系密切程度的统计指标。

相关系数是按积差方法计算,相同以两变量与各自平均值的离差为基础,通过两个离差相乘来反映两变量之间相关程度;着重研究线性的单相关系数。

百度百科:http://baike.baidu.com/view/172091.htm

       统计学中,皮尔逊积矩相关系数英语Pearson product-moment correlation coefficient。又称作 PPMCCPCCs[1], 文章中经常使用r或Pearson's r表示)用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。在自然科学领域中,该系数广泛用于度量两个变量之间的相关程度。

它是由卡尔·皮尔逊弗朗西斯·高尔顿在19世纪80年代提出的一个相似却又稍有不同的想法演变而来的。

[2][3]这个相关系数也称作“皮尔森相关系数r”。

Wikipedia:http://zh.wikipedia.org/zh/皮尔逊积矩相关系数

二、简单相关系数的公式

两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差标准差的商:

\rho_{X,Y}={\mathrm{cov}(X,Y) \over \sigma_X \sigma_Y} ={E[(X-\mu_X)(Y-\mu_Y)] \over \sigma_X\sigma_Y},

以上方程定义了整体相关系数, 一般表示成希腊字母ρ(rho)。基于样本对协方差和标准差进行预计,能够得到样本相关系数, 一般表示成r:

r = \frac{\sum ^n _{i=1}(X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum ^n _{i=1}(X_i - \bar{X})^2} \sqrt{\sum ^n _{i=1}(Y_i - \bar{Y})^2}}.

一种等价表达式的是表示成标准分的均值。

基于(Xi, Yi)的样本点。样本皮尔逊系数是

r = \frac{1}{n-1} \sum ^n _{i=1} \left( \frac{X_i - \bar{X}}{\sigma_X} \right) \left( \frac{Y_i - \bar{Y}}{\sigma_Y} \right)

当中

\frac{X_i - \bar{X}}{\sigma_X}\bar{X} 及  \sigma_X

各自是标准分、样本平均值和样本标准差

Wikipedia:http://zh.wikipedia.org/zh/皮尔逊积矩相关系数


相关关系是一种非确定性的关系。相关系数是研究变量之间 线性相关程度的量。因为研究对象的不同,相关系数有例如以下几种定义方式。

相关系数公式

相关系数公式

简单相关系数:又叫相关系数或线性相关系数。一般用字母P 表示。用来度量两个变量间的线性关系。
复相关系数:又叫多重相关系数。

复相关是指因变量与多个自变量之间的相关关系。比如,某种商品的季节性需求量与其价格水平、职工收入水平等现象之间呈现复相关关系。

典型相关系数:是先对原来各组变量进行 主成分分析,得到新的线性关系的综合指标,再通过综合指标之间的线性相关系数来研究原各组变量间相关关系。


百度百科:http://baike.baidu.com/view/172091.htm


三、代码实现:

(1) NumeratorCalculate类 实现分式的 分子 计算;
(2) DenominatorCalculate类 实现分式的 分母 计算。
(3) CallClass类 调用上面的方法。

代码一:NumeratorCalculate类
/**
 * 
 */
package numerator.pearson.conefficient;

import java.util.ArrayList;
import java.util.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author alan-king
 * 
 * the class is going to calculate the numerator;
 * 
 *
 */
public class NumeratorCalculate {
	
	//add global varieties
	protected List<String> xList , yList;
	
	public NumeratorCalculate(List<String> xList ,List<String> yList){
		this.xList = xList;
		this.yList = yList;
	}
	
	/**
	 * add operate method
	 */
	public double calcuteNumerator(){
		double result =0.0;
		double xAverage = 0.0;
		double temp = 0.0;
		
		int xSize = xList.size();
		for(int x=0;x<xSize;x++){
			temp += Double.parseDouble(xList.get(x));
		}
		xAverage = temp/xSize;
		
		double yAverage = 0.0;
		temp = 0.0;
		int ySize = yList.size();
		for(int x=0;x<ySize;x++){
			temp += Double.parseDouble(yList.get(x));
		}
		yAverage = temp/ySize;
		
		//double sum = 0.0;
		for(int x=0;x<xSize;x++){
			result+=(Double.parseDouble(xList.get(x))-xAverage)*(Double.parseDouble(yList.get(x))-yAverage);
		}
		return result;
	}
}

代码二: DenominatorCalculate类
/**
 * 
 */
package numerator.pearson.conefficient;

import java.util.List;

/**
 * @author alan-king
 *
 */
public class DenominatorCalculate {
	
	//add denominatorCalculate method
	public double calculateDenominator(List<String> xList,List<String> yList){
		double standardDifference = 0.0;
		int size = xList.size();
		double xAverage = 0.0;
		double yAverage = 0.0;
		double xException = 0.0;
		double yException = 0.0;
		double temp = 0.0;
		for(int i=0;i<size;i++){
			temp += Double.parseDouble(xList.get(i));
		}
		xAverage = temp/size;
		
		for(int i=0;i<size;i++){
			temp += Double.parseDouble(yList.get(i));
		}
		yAverage = temp/size;
		
		for(int i=0;i<size;i++){
			xException += Math.pow(Double.parseDouble(xList.get(i))-xAverage,2);
			yException += Math.pow(Double.parseDouble(yList.get(i))-yAverage, 2);
		}
		//calculate denominator of 
		return standardDifference = Math.sqrt(xException*yException);
	}
}

代码三: CallClass类
/**
 * 
 */
package numerator.pearson.conefficient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


/**
 * @author alan-king
 *
 */
public class CallClass {
	
	
	public static void main(String[] args) throws IOException{
		double CORR = 0.0;
		List<String> xList = new ArrayList<String>();;
		List<String> yList = new ArrayList<String>();
		
		System.out.println("Please input your X's varieties and Y's varieties\r"+
							"differnt line,then you should key into \"s\" to end the inputing operator!");
		
		//initial varieties for xList,yList;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str =null;
		boolean flag = false;
		while(!(str=br.readLine()).equals("s")){
			String[] vStr = str.split(",");
			int size = vStr.length;
			if(flag == false){
				for(int i=0;i<size;i++){
					xList.add(i, vStr[i]);
				}
				flag = true;
			}else if(flag == true){
				for(int i=0;i<size;i++){
					yList.add(i, vStr[i]);
				}
				flag = false;
			}
			
		}
		
		NumeratorCalculate nc = new NumeratorCalculate(xList,yList);
		double numerator = nc.calcuteNumerator();
		DenominatorCalculate dc = new DenominatorCalculate();
		double denominator = dc.calculateDenominator(xList, yList);
		CORR = numerator/denominator;
		System.out.println("We got the result by Calculating:");
		System.out.printf("CORR = "+CORR);
	}
}

四、输出结果:例如以下图





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值