利用java批量求相關係數(pearson相關係數)(一)
阿新 • • 發佈:2018-11-22
臨近期末複習統計學,沒複習完感覺自己十分憋屈,總想幹點別的什麼,敲個程式碼玩玩吧。
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文件,這裡我用到了統計學第六版(中國人民大學出版社—我不是打廣告的,只是為了複習才用的)的例題裡面的檔案。
我用到了哪些包呢? 我在這裡給出了下載地址:https://www.apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.zip 解壓之後找一個jar包,解壓之後放到程式碼的同一個級別目錄下就行了。 我執行的效果圖: |