【问题标题】:OLS Multiple Linear Regression with commons-math使用 commons-math 进行 OLS 多元线性回归
【发布时间】:2016-05-19 10:05:03
【问题描述】:

目前我依赖于 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 行)

我需要更改哪些内容才能更正该测试用例?

【问题讨论】:

    标签: java apache-commons-math


    【解决方案1】:

    这是 Commons Math 3.x 中的一个错误。当模型中没有截距时,只要设计矩阵不是奇异的,观察数等于回归数的数量应该是可以的。在您的示例中,我认为您的意思是第三个 x 行是 {0,0,1,0} (否则设计矩阵是奇异的)。通过对您的数据进行此更改以及在Hipparchus fix 中应用的代码补丁,您的测试将成功。此错误在 Commons Math 中被跟踪为 MATH-1392

    【讨论】:

      【解决方案2】:

      样本数必须大​​于变量数。显然你的测试用例不正确。您必须至少再添加一个样本。 如果你改变了

      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} };
      

      它应该工作。 (虽然我没有测试过)。

      【讨论】:

        【解决方案3】:

        我猜 x 的第三行应该是 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 更改为

        双[] y = { 1, 2, 3, 4, 10 };

        最后一个元素是其他元素的总和,那么它就起作用了。

        【讨论】:

          猜你喜欢
          • 2016-05-03
          • 2018-08-11
          • 2013-07-14
          • 2016-04-19
          • 1970-01-01
          • 2018-07-31
          • 2018-06-10
          • 2011-11-19
          • 1970-01-01
          相关资源
          最近更新 更多