我需要为一组点找到最佳拟合回归线。 例如,对于这个矩阵:
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 :(得分: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,依此类推。如果不是这种情况,则需要添加一个函数来将索引转换为位置。