2016-02-26 192 views
2

我需要找到一組點的最佳擬合迴歸線。 例如,對於該矩陣:Java線性迴歸

int b [][] = {  { 3, 1, 0, 0, 0, 0, 0, 0, 0 }, 
        { 1, 2, 3, 1, 0, 1, 0, 0, 0 }, 
        { 0, 1, 2, 1, 0, 0, 0, 0, 0 }, 
        { 0, 0, 0, 3, 0, 0, 0, 0, 0 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
        { 0, 0, 0, 0, 0, 1, 3, 0, 0 }, 
        { 0, 0, 0, 0, 0, 1, 2, 3, 1 }, 
        { 0, 0, 0, 0, 0, 1, 1, 1, 2 }, 
        { 0, 0, 0, 0, 0, 0, 0, 0, 1 } }; 

每個數字表示的數據點的該位置處的量(重量我想)(其中,行是X軸和列都爲Y)。 我試圖使用apache數學庫中的SimpleRegression類,並遇到一些問題。首先,它似乎不支持權重。第二,我相信我做錯了什麼,即使對於主對角線上只有1的矩陣,斜率/截距結果也沒有意義。

public static void main(String[] args) { 

     double a[][] = new double[9][9]; 
     for (int i = 0; i < 9; i++) 
      a[i][i] = 1; 


     SimpleRegression r = new SimpleRegression(true); 

     r.addData(a); 

     System.out.println("Slope = " + r.getSlope()); 
     System.out.println("Intercept = " + r.getIntercept()); 

} 

這給我的結果是不正確的。我會假設這個矩陣表示函數f(x)= x,但我得到的斜率是-0.12499 ..

任何人都可以指出我在做什麼錯了嗎? 我有一種感覺,我不僅濫用代碼,而且數學。

+0

addData([] [])期望一個2xN矩陣我想是爲什麼你不嘗試addData(x,y)單獨? – gpasch

+0

並且認爲應該給座標(i,j)不是值 - 再次不是簡單迴歸的用戶,只是通過閱讀 – gpasch

+0

謝謝,它似乎正在沿着sI預期的方向工作,我一定誤解了方式該方法起作用。閱讀關於維基百科的線性迴歸讓我思考了整個矩陣的線條。 也似乎多次添加相同的座標會增加它的重量。有用的知道。 我毫不猶豫地稱這個解決方案,直到明天早上我再測試一下,但這是一個很好的進展。謝謝。 – TheFooBarWay

回答

1

正如評論所言,addData()需要一個2 x N矩陣的x y位置或個人x y位置。下面的示例返回爲1的斜率爲對角矩陣按預期:

public static void main(String[] args) { 
    double a[][] = new double[9][9]; 
    for (int i = 0; i < 9; i++) 
     a[i][i] = 1; 

    SimpleRegression r = new SimpleRegression(true); 

    addData(r, a); 

    System.out.println("Slope = " + r.getSlope()); 
    System.out.println("Intercept = " + r.getIntercept()); 
} 

public static void addData(SimpleRegression r, double[][] data) { 
    for(int x=0; x<data.length; x++) { 
     for(int y=0; y<data[0].length; y++) { 
      for(int i=0; i<data[x][y]; i++) { 
       r.addData(x, y); 
      } 
     } 
    } 
} 

該示例假定索引0對應於0的位置時,索引1對應的1等上的位置。如果不是這種情況,則需要添加一個函數來將索引轉換爲位置。