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

四、輸出結果:例如以下圖






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM