首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Apache 3中计算PolynomialCurveFitter的R-平方

在Apache 3中计算PolynomialCurveFitter的R-平方
EN

Stack Overflow用户
提问于 2018-03-18 15:21:18
回答 1查看 1.1K关注 0票数 2

Apache commons-math3 (version 3.6.1)类如OLSMultipleLinearRegressionSimpleRegression提供了计算RSquare (即calculateRSquared()getRSquare() )的方法。但我无法找到任何这样的方法用于PolynomialCurveFitter

现在我正像下面这样做。有什么普通的数学方法能做到这一点吗?

代码语言:javascript
复制
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));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-19 06:20:49

这已经在apache-共用邮件列表中得到了回答。交叉张贴答案

OLSMultipleLinearRegression,SimpleRegression提供了一个返回calculateRSquared()、getRSquare()的方法。但我无法找到任何这样的方法用于PolynomialCurveFitter? 现在我自己做,如下所示: 有什么普通的数学方法能做到这一点吗?

"PolynomialCurveFitter“是最小二乘优化器的语法糖/包装器之一。在(不可变)实例中不维护任何状态。

PolynomialFunction getPolynomialFitter(Listpointlist) { final PolynomialCurveFitter fitter = PolynomialCurveFitter.create(2);final WeightedObservedPoints obs =新WeightedObservedPoints();for (列表点: pointlist) { obs.add(point.get(0),point.get(1));} double[] fit = fitter.fit(obs.toList());System.out.printf(“\n系数%f,%f,%f",fit,fit1,fit2);fit PolynomialFunction fit=新的PolynomialCurveFitter(Fit);返回fit;}

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

私有双getRSquare(PolynomialFunction fitter,List pointList) {最终double[]系数= fitter.getCoefficients();double[] predictedValues =新doublepointList.size();double residualSumOfSquares = 0;final descriptiveStatistics DescriptiveStatistics = new DescriptiveStatistics();for (int i=0;i< pointList.size();i++) {i++=预测(系数,PolynomialFunction(I)(0));双en20#=#(I)(1);double t=((-),2);en27# t;descriptiveStatistics.addValue(actualVal);} final double avgActualValues = descriptiveStatistics.getMean();double totalSumOfSquares = 0;for (int i=0;i

此处没有显示“预测”方法,但请注意,您在上面称为“适合者”的参数实际上是一个多项式函数:

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49349580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档