使用 commons-math 的 OLS 多元线性回归
OLS Multiple Linear Regression with commons-math
目前我依赖于 commons-math 2.1,但我想将它升级到 commons-math 3.6。不幸的是,有些测试用例不再有效。我知道是什么导致了我的问题,但我不知道如何相应地更改测试用例以像以前一样测试正确的行为。
我有以下测试代码:
@Test
public void testIdentityMatrix() {
double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 } };
double[] y = { 1, 2, 3, 4 };
OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
regression.setNoIntercept(true);
regression.newSampleData(y, x);
double[] b = regression.estimateRegressionParameters();
for (int i = 0; i < y.length; i++)
{
assertEquals(b[i], y[i], 0.001);
}
}
升级到 commons-math 3.6 后,OLSMultipleLinearRegression 检查给定矩阵 x 和向量 y 的有效内容。此验证失败并显示消息:
not enough data (4 rows) for this many predictors (4 predictors)
我需要更改什么才能更正该测试用例?
样本数必须大于变量数。显然你的测试用例不正确。您将不得不添加至少一个样本。
如果你改变
double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 } };
至
double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 }, {1,0,0,0} };
应该可以。 (虽然我没测试)
这是 Commons Math 中的一个错误 3.x。当模型中没有截距时,只要设计矩阵不是奇异的,观测值的数量等于回归量的数量应该就可以了。在您的示例中,我认为您的意思是第三行 x 为 {0,0,1,0}(否则设计矩阵是奇异的)。对您的数据进行此更改,并在 Commons Math Hipparchus fix your test succeeds. This bug is being tracked as MATH-1392 中应用代码补丁。
我猜 x 的第 3 行应该是 0010 而不是 0001?
但是,如果将 x 更改为
double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 ), { 0,
0, 0, 1 }, {1,1,1,1} };
并将 y 更改为
double[] y = { 1, 2, 3, 4, 10 };
最后一个元素是其他元素的和,那么就可以了。
目前我依赖于 commons-math 2.1,但我想将它升级到 commons-math 3.6。不幸的是,有些测试用例不再有效。我知道是什么导致了我的问题,但我不知道如何相应地更改测试用例以像以前一样测试正确的行为。
我有以下测试代码:
@Test
public void testIdentityMatrix() {
double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 } };
double[] y = { 1, 2, 3, 4 };
OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
regression.setNoIntercept(true);
regression.newSampleData(y, x);
double[] b = regression.estimateRegressionParameters();
for (int i = 0; i < y.length; i++)
{
assertEquals(b[i], y[i], 0.001);
}
}
升级到 commons-math 3.6 后,OLSMultipleLinearRegression 检查给定矩阵 x 和向量 y 的有效内容。此验证失败并显示消息:
not enough data (4 rows) for this many predictors (4 predictors)
我需要更改什么才能更正该测试用例?
样本数必须大于变量数。显然你的测试用例不正确。您将不得不添加至少一个样本。 如果你改变
double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 } };
至
double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 }, {1,0,0,0} };
应该可以。 (虽然我没测试)
这是 Commons Math 中的一个错误 3.x。当模型中没有截距时,只要设计矩阵不是奇异的,观测值的数量等于回归量的数量应该就可以了。在您的示例中,我认为您的意思是第三行 x 为 {0,0,1,0}(否则设计矩阵是奇异的)。对您的数据进行此更改,并在 Commons Math Hipparchus fix your test succeeds. This bug is being tracked as MATH-1392 中应用代码补丁。
我猜 x 的第 3 行应该是 0010 而不是 0001?
但是,如果将 x 更改为
double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 ), { 0, 0, 0, 1 }, {1,1,1,1} };
并将 y 更改为
double[] y = { 1, 2, 3, 4, 10 };
最后一个元素是其他元素的和,那么就可以了。