使用最小二乘法与Commons Math和拟合

Ber*_*own 5 java math apache-commons-math

我试图用公共数学来计算多项式中的常数.它看起来像例程存在但我得到了这个错误.有谁看到这个问题?

我试图将这个问题转换为commons-math:https: //math.stackexchange.com/questions/121212/how-to-find-curve-equation-from-data

从绘制数据(Wolfram | Alpha链接),它看起来不是线性的.所以最好用多项式拟合.我假设您想要拟合数据:

XY 1 4 2 8 3 13 4 18 5 24 ..使用二次多项式y = ax2 + bx + c.

而wolfram alpha提供了很好的实用性.我希望我能得到像沃尔夫拉姆一样的答案.

http://www.wolframalpha.com/input/?i=fit+4%2C+8%2C+13%2C

例如,通过输入该数据,我得到:4.5 x-0.666667(线性)

这是代码和错误:

import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;
import org.apache.commons.math3.stat.regression.SimpleRegression;
final OLSMultipleLinearRegression regression2 = new OLSMultipleLinearRegression();
double[] y = {
        4.0, 
        8, 
        13,                 
};      
double[][] x2 = 
    {
        { 1.0, 1, 1  },
        { 1.0, 2, 4  },
        { 0.0, 3, 9  },             
    };
regression2.newSampleData(y, x2);
regression2.setNoIntercept(true);
regression2.newSampleData(y, x2);       
double[] beta = regression2.estimateRegressionParameters();
for (double d : beta) {
    System.out.println("D: " + d);
}
Run Code Online (Sandbox Code Playgroud)

线程"main"中的异常org.apache.commons.math3.exception.MathIllegalArgumentException:org.apache.commons.math3.stat.regression.AbstractMultipleLinearRegression.validateSampleData中的这么多预测变量(3个预测变量)的数据不足(3行) AbstractMultipleLinearRegression.java:236)位于org.berlin.bot.algo.BruteForceSort.main(BruteForceSort.java:108)的org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression.newSampleData(OLSMultipleLinearRegression.java:70)

Ber*_*own 0

罗库克是对的。我提供了一个额外的行(测试用例),它生成了与 Wolfram/alpha 相同的答案。

D:0.24999999999999822 D:3.4500000000000033 D:0.24999999999999914

或 0.25x^2 + 3.45x + 0.25

final OLSMultipleLinearRegression regression2 = new OLSMultipleLinearRegression();
        double[] y = {
                4, 
                8, 
                13,         
                18
        };              
        double[][] x2 = 
            {
                { 1, 1, 1  },
                { 1, 2, 4  },
                { 1, 3, 9  },                                                               
                { 1, 4, 16  },
            };

        regression2.newSampleData(y, x2);
        regression2.setNoIntercept(true);
        regression2.newSampleData(y, x2);       
        double[] beta = regression2.estimateRegressionParameters();
        for (double d : beta) {
            System.out.println("D: " + d);
        }
Run Code Online (Sandbox Code Playgroud)