Java线性回归

时间:2016-02-26 20:45:08

标签: java regression linear

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

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

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

1 个答案:

答案 0 :(得分:1)

正如评论所说,addData()期望x y位置的2xN矩阵或单个x y位置。以下示例按预期返回对角矩阵的斜率:

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,依此类推。如果不是这种情况,则需要添加一个函数来将索引转换为位置。