使用Apache Maths 3.6.1进行多项式回归

时间:2018-03-12 15:05:24

标签: java apache regression non-linear-regression

有人可以告诉我如何使用Apache Maths进行多项式回归3.6.1

以下是我用于测试的数据点

60735214881.391304  1520254800000.000000
60697824142.469570  1520258400000.000000
60651182200.208694  1520262000000.000000
60684367132.939130  1520265600000.000000
60676588613.008700  1520269200000.000000
60641816564.869570  1520272800000.000000
60604714824.233510  1520276400000.000000
60580042814.330440  1520280000000.000000
60536134542.469570  1520283600000.000000
60566323732.034780  1520287200000.000000
60578775249.252174  1520290800000.000000
60547382844.104350  1520294400000.000000
60536776546.802160  1520298000000.000000
60474342718.330440  1520301600000.000000
60452725477.286960  1520305200000.000000
60486821569.669560  1520308800000.000000
60247997139.995674  1520312400000.000000
60248432181.426090  1520316000000.000000
60217476247.373920  1520319600000.000000
60170744493.634780  1520323200000.000000

我的代码如下所示

private void polynomialFitter(List<List<Double>> pointlist) {
        final PolynomialCurveFitter fitter = PolynomialCurveFitter.create(2);
        final WeightedObservedPoints obs = new WeightedObservedPoints();
        for (List<Double> point : pointlist) {
            obs.add(point.get(1), point.get(0));
        }
        double[] fit = fitter.fit(obs.toList());
        System.out.printf("\nCoefficient %f, %f, %f", fit[0], fit[1], fit[2]);
    }

系数报告为

Coefficient 12.910025, 0.000000, 0.000000

但这些似乎并不完全正确。如果我使用相同的数据集 Online Polynimal Regressionarchanoid online regression - 都报告与654623237474.68250993904929103762, 28.75921919628759991574, -0.00000000023885199278

相同的值

有人能让我知道出了什么问题吗?我见过这个question,但这对我没有帮助。

2 个答案:

答案 0 :(得分:0)

这已在apache-commons邮件列表

中得到解答
  

多项式回归与曲线拟合不同。去做   在Commons Math中进行多项式回归,使用   OLSMultipleLinearRegression类,使用,X,X ^ 2等作为   自变量(如上面的第二个参考所示)。

示例代码如下所示

private OLSMultipleLinearRegression getMultipleLinearRegression(List<List<Double>> pointlist) {
    OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
    double y[] = new double[pointlist.size()];
    double x[][] = new double[pointlist.size()][2];
    int c = 0;
    for (List<Double> point : pointlist) {
        y[c] = point.get(0);
        x[c][0] = point.get(1);
        x[c][1] = Math.pow(point.get(1), 2);
        regression.newSampleData(y, x);
        c++;
    }
    System.out.printf("\tR2 = %f", regression.calculateRSquared());
    return regression;
}

答案 1 :(得分:0)

使用Commons Math 3.6.1,当使用PolynomialCurveFitter和tuk的OLSMultipleLinearRegression建议将立方拟合到数据时,我得到几乎相同的参数。

曲线可以在数据范围内提供正确的插值,但是您必须小心外推。

PolynomialCurveFitter代码是OLSMultipleLinearRegression代码行数的一半。

相关问题