【问题标题】:Calculate R-Square for PolynomialCurveFitter in Apache commons-math3在 Apache commons-math3 中计算 PolynomialCurveFitter 的 R 方
【发布时间】:2018-08-27 05:21:06
【问题描述】:

Apache commons-math3(版本3.6.1)类如OLSMultipleLinearRegressionSimpleRegression 提供了一种计算RSquare(即分别为calculateRSquared()getRSquare())的方法。但是我找不到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);
}
final PolynomialFunction polynomial = getPolynomialFitter(trainData);
System.out.printf("\nPolynimailCurveFitter R-Square %f", getRSquare(polynomial, trainData));

【问题讨论】:

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


    【解决方案1】:

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

    OLSMultipleLinearRegression、SimpleRegression 提供了一种方法 返回计算RSquared(), 获取 R 方()。但我找不到任何这样的方法 多项式曲线拟合器?

    现在我自己在做如下:-

    普通数学中有没有这样的方法可以做到这一点?

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

    这里没有展示“predict”方法,但是注意参数 你在上面所说的“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

    但是,它们可能仍然不是您想要的……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 2018-03-24
      • 2013-03-28
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      相关资源
      最近更新 更多