Apache commons-math3 (version 3.6.1)类如OLSMultipleLinearRegression、SimpleRegression提供了计算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));发布于 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
然而,他们可能仍然不是你想要的.
https://stackoverflow.com/questions/49349580
复制相似问题