2016-02-26 193 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等上的位置。如果不是这种情况,则需要添加一个函数来将索引转换为位置。