在Apache commons-math3中计算PolynomialCurveFitter的R-Square

时间:2018-03-18 15:21:18

标签: java java-8 regression apache-commons apache-commons-math

Apache commons-math3(版本3.6.1)类OLSMultipleLinearRegressionSimpleRegression提供了一种计算RSquare的方法(即calculateRSquared(),{{ 1}}分别)。但我无法为getRSquare()找到任何此类方法?

现在我自己就像下面这样做。有没有这样的方法在common-math中这样做?

PolynomialCurveFitter

1 个答案:

答案 0 :(得分:0)

这已在apache-commons mailing list中得到解答。交叉发布答案

  

OLSMultipleLinearRegression,SimpleRegression提供了一种方法   返回calculateRSquared(),   getRSquare()。但我无法找到任何这样的方法   PolynomialCurveFitter?

     

现在我自己就像下面这样做: -

     

有没有这样的方法在common-math中这样做?

“PolynomialCurveFitter”是语法糖/包装器之一 围绕最小二乘优化器。 在(不可变)实例中没有维护状态。

private PolynomialFunction getPolynomialFitter(List<List<Double>>pointlist) {

final PolynomialCurveFitter fitter = PolynomialCurveFitter.create(2);

final WeightedObservedPoints obs = new WeightedObservedPoints();
for (List<Double> point : pointlist) {
    obs.add(point.get(0), point.get(1));
}

double[] fit = fitter.fit(obs.toList());
System.out.printf("\nCoefficient %f, %f, %f", fit[0], fit[1], fit[2]); 

final PolynomialFunction fitted = new PolynomialFunction(fit);
return fitted;
}

这确实是一个预期的用例。

private double getRSquare(PolynomialFunction fitter, List<List<Double>> pointList) {

final double[] coefficients = fitter.getCoefficients();
double[] predictedValues = new double[pointList.size()];
double residualSumOfSquares = 0;
final DescriptiveStatistics descriptiveStatistics = new DescriptiveStatistics();

for (int i=0; i< pointList.size(); i++) {
    predictedValues[i] = predict(coefficients, pointList.get(i).get(0));

    double actualVal = pointList.get(i).get(1);
    double t = Math.pow((predictedValues[i] - actualVal), 2);
    residualSumOfSquares  += t;
    descriptiveStatistics.addValue(actualVal);
}
final double avgActualValues = descriptiveStatistics.getMean();
double totalSumOfSquares = 0;
for (int i=0; i<pointList.size(); i++) {
    totalSumOfSquares += Math.pow( (predictedValues[i] - avgActualValues),2);

}
return 1.0 - (residualSumOfSquares/totalSumOfSquares);
}

此处未显示“预测”方法,但请注意参数 你在上面称之为“fitter”,实际上是一个多项式 功能:

http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math4/analysis/polynomials/PolynomialFunction.html

因此:    predictedValues[i] = fitter.value(pointList.get(i).get(0));

但是否则,是的,来电者有责任选择他的 评估模型的质量。

您可以直接使用最小二乘法类;然后 “评估”对象将允许检索各种度量 适合:

http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math4/fitting/leastsquares/LeastSquaresProblem.Evaluation.html

然而,它们可能仍然不是你想要的......