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等等。如果不是这种情况,您需要添加一个函数来将索引转换为位置。
我需要为一组点找到最合适的回归线。 例如对于这个矩阵:
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等等。如果不是这种情况,您需要添加一个函数来将索引转换为位置。