Java 线性回归

Java Linear Regression

我需要为一组点找到最合适的回归线。 例如对于这个矩阵:

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 class,但遇到了一些问题。 首先,它似乎不支持权重。其次,我认为我做错了什么,即使对于主对角线上只有 1 的矩阵,slope/intercept 结果也没有意义。

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..

谁能指出我做错了什么? 我有一种感觉,我不仅滥用了代码,而且滥用了数学。

正如评论所说,addData() 需要一个 2xN 矩阵的 x y 位置或单个 x y 位置。以下示例 returns 对角矩阵的斜率为 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等等。如果不是这种情况,您需要添加一个函数来将索引转换为位置。