目前我对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的有效内容。此验证失败,并显示以下消息:
对于这么多预测变量(4个预测变量),没有足够的数据(4行)
我需要更改以更正该测试用例?
答案 0 :(得分:2)
这是Commons Math 3.x中的一个错误。当模型中没有截距时,只要设计矩阵不是单数,观测数等于回归数就应该没问题。在你的例子中,我认为你的意思是第三行是{0,0,1,0}(否则设计矩阵是单数)。通过对您的数据进行此更改以及Hipparchus fix中应用的代码修补程序,您的测试成功。这个错误在Commons Math中被跟踪为MATH-1392。
答案 1 :(得分:0)
样本数必须大于变量数。显然你的测试用例不正确。您必须添加至少一个样本。 如果你改变了
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} };
它应该有用。 (虽然我没有测试过。)
答案 2 :(得分:0)
我猜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};
最后一个元素是其他元素的总和,然后就可以了。