使用Apache Maths(Java)进行多项式回归

4

有谁可以帮我使用Apache Math库进行二次多项式回归?

以下数据应该给出这个方程:39.79 x^2 - 497.66 x + 997.45(由Excel计算,r2 = 0.9998)

// coding style from http://commons.apache.org/proper/commons-math/userguide/fitting.html    

double[] y = { 540.0, 160.0, -140.0, -360.0, -480.0, -560.0, -540.0, -440.0, -260.0, 0.0, 340.0};              
        final WeightedObservedPoints obs = new WeightedObservedPoints();
        for (double figure:y){
            obs.add(1.0, figure);
        }
        final PolynomialCurveFitter fitter = PolynomialCurveFitter.create(2);
        final double[] coeff = fitter.fit(obs.toList());
        System.out.println("coef="+Arrays.toString(coeff));

以下是先前代码提供的回归系数:

coef=[-53.73522460839947, -52.22329678670934, -52.22329678670934]

显然,我缺少了某些东西...

感谢您的帮助。

Dom

1个回答

8

你所有的数据点都在 x = 1。

obs.add(1.0, figure);!!!!

如果它们从零开始均匀间隔,则应该使用for循环和ix而不是1.0,x值应替换为1.0。


谢谢。但是根据文档,第一项是权重(“...如果没有这样的信息存在,并且所有点应该被视为相同,则将1.0作为所有点的权重是安全的”)。另外,ix是什么意思?所以我不明白你的观点。 - Dominique
1
根据文档,如果您只提供两个参数,则add(x,y)等同于add(1.0, x, y),其中第一个参数是x值而不是权重。其次,您应该担心自己完全没有x值进行回归。至于ix,我指的是如果您有均匀分布的点,代码将如下所示:for(int ix=0;ix<y.length;ix++) obs.add(ix,y[ix])。 - Zielu
2
好的。明白了。你说得完全正确。这就是:coef=[997.45,-497.66,39.79]。最后一个是x^2,中间一个是x,第一个是常数。非常感谢Zielu的耐心。我很感激。 - Dominique

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接