1. 程式人生 > >利用java批量求相關係數(pearson相關係數)(一)

利用java批量求相關係數(pearson相關係數)(一)

臨近期末複習統計學,沒複習完感覺自己十分憋屈,總想幹點別的什麼,敲個程式碼玩玩吧。

pearson相關係數的計算參考:https://blog.csdn.net/Anglebeat/article/details/40299273(這個參考地址的程式碼有一點錯誤)

我在這裡指出具體錯誤,他的temp重複計算了。

前面程式碼我是直接抄的上面那個部落格的,稍微做了一下他的錯誤的修改,所以作者和姓名我都懶得改了(尊重原創)。

第一個類是計算分母(Denominator)的類,名字叫做DenominatorCalculate.java

/**
 * 
 */

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 temp1=0.0;
		double temp2=0.0;
		for(int i=0;i<size;i++){
			 temp1 += Double.parseDouble(xList.get(i));
		}
		xAverage = temp1/size;
		
		for(int i=0;i<size;i++){
			 temp2 += Double.parseDouble(yList.get(i));
		}
		yAverage = temp2/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);
	}
}

第二個類是計算分子(Numerator)的,名字叫做NumeratorCalculate.java

/**
 * 
 */

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

第三個類就是主呼叫函式的類了,這裡也沿用了上文部落格命名的名字叫做CallClass.java

/**
 * 
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.*;
import java.io.*;
import org.apache.poi.ss.usermodel.*;

/**
 * @author SinWang
 *
 */
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("批量計算Pearson相關係數");
		String filePath = ".\\例11.6.xls";
	FileInputStream stream = new FileInputStream(filePath);
	HSSFWorkbook workbook = new HSSFWorkbook(stream);//讀取現有的Excel
	HSSFSheet sheet= workbook.getSheet("Sheet3");//得到指定名稱的Sheet
	//HSSFRow Row=null;
	// HSSFCell Cell=null;
	
	for (Row row : sheet)
	{
 	for (Cell cell : row)
 	{
 		// System.out.print(cell.getCellType());
 		//如果是第一列就把它放到xlist,如果是第二列就把它放到ylist
 		if(cell.getColumnIndex()==0){
 			//Get the value of the cell as a number.      return double
 			double x=cell.getNumericCellValue();
 			System.out.print(x+"\t");
 			String x1=Double.toString(x);
 			xList.add(x1);
 		}else{
 			//Get the value of the cell as a number.      return double
 			double y=cell.getNumericCellValue();
 			System.out.print(y+"");
 			String y1=Double.toString(y);
 			yList.add(y1);
 		}
 	}
 	System.out.println();
	}
		

		
		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("運算結果是:");
		System.out.printf("CORR = "+CORR);
	}
}




這個CallClass類我要詳細說說了,因為我批量操作主要是利用這個類,這個類只實現了我想要的一部分功能(不然我不可能稱它為一,以後我會用物件的方式將他一個個分離,以便於構造重複利用批量操作的程式碼)

這個類讀取的是一個 叫做“例11.6.xls”的excel文件,這裡我用到了統計學第六版(中國人民大學出版社—我不是打廣告的,只是為了複習才用的)的例題裡面的檔案。

例題資料

 

建立個Excel名字為"例11.6.xls",把它放到sheet3就行了

 

我用到了哪些包呢

我在這裡給出了下載地址:https://www.apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.zip

解壓之後找一個jar包,解壓之後放到程式碼的同一個級別目錄下就行了。

我執行的效果圖: