Repository: commons-math Updated Branches: refs/heads/master c768ed307 -> 0a499402d
MATH-1206 New API methods in "LeastSquaresProblem.Evaluation" class. Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/0a499402 Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/0a499402 Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/0a499402 Branch: refs/heads/master Commit: 0a499402d707bc8cf775d7f9b3840780a7401f7d Parents: c768ed3 Author: Gilles <er...@apache.org> Authored: Thu Apr 9 14:37:42 2015 +0200 Committer: Gilles <er...@apache.org> Committed: Thu Apr 9 14:37:42 2015 +0200 ---------------------------------------------------------------------- src/changes/changes.xml | 3 +++ .../leastsquares/AbstractEvaluation.java | 20 ++++++++++++------ .../leastsquares/LeastSquaresProblem.java | 22 ++++++++++++++++++-- .../math4/fitting/leastsquares/OptimumImpl.java | 10 +++++++++ .../leastsquares/EvaluationRmsCheckerTest.java | 8 +++++++ .../LevenbergMarquardtOptimizerTest.java | 19 +++++++++++++++++ 6 files changed, 74 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/0a499402/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 485458b..d20a18b 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -54,6 +54,9 @@ If the output is not quite correct, check for invisible trailing spaces! </release> <release version="4.0" date="XXXX-XX-XX" description=""> + <action dev="erans" type="update" issue="MATH-1206"> + Added new API methods in "LeastSquares.Evaluation" (package "o.a.c.m.fitting.leastsquares"). + </action> <action dev="erans" type="update" issue="MATH-1210"> "QRDecomposition": include information about the condition that triggers a "SingularMatrixException". http://git-wip-us.apache.org/repos/asf/commons-math/blob/0a499402/src/main/java/org/apache/commons/math4/fitting/leastsquares/AbstractEvaluation.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math4/fitting/leastsquares/AbstractEvaluation.java b/src/main/java/org/apache/commons/math4/fitting/leastsquares/AbstractEvaluation.java index 2326b38..29e5065 100644 --- a/src/main/java/org/apache/commons/math4/fitting/leastsquares/AbstractEvaluation.java +++ b/src/main/java/org/apache/commons/math4/fitting/leastsquares/AbstractEvaluation.java @@ -40,8 +40,8 @@ public abstract class AbstractEvaluation implements Evaluation { /** * Constructor. * - * @param observationSize the number of observation. Needed for {@link - * #getRMS()}. + * @param observationSize the number of observations. + * Needed for {@link #getRMS()} and {@link #getReducedChiSquare()}. */ AbstractEvaluation(final int observationSize) { this.observationSize = observationSize; @@ -74,14 +74,22 @@ public abstract class AbstractEvaluation implements Evaluation { /** {@inheritDoc} */ public double getRMS() { - final double cost = this.getCost(); - return FastMath.sqrt(cost * cost / this.observationSize); + return FastMath.sqrt(getReducedChiSquare(1)); } /** {@inheritDoc} */ public double getCost() { - final ArrayRealVector r = new ArrayRealVector(this.getResiduals()); - return FastMath.sqrt(r.dotProduct(r)); + return FastMath.sqrt(getChiSquare()); } + /** {@inheritDoc} */ + public double getChiSquare() { + final ArrayRealVector r = new ArrayRealVector(getResiduals()); + return r.dotProduct(r); + } + + /** {@inheritDoc} */ + public double getReducedChiSquare(int numberOfFittedParameters) { + return getChiSquare() / (observationSize - numberOfFittedParameters + 1); + } } http://git-wip-us.apache.org/repos/asf/commons-math/blob/0a499402/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresProblem.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresProblem.java b/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresProblem.java index dfc5b5e..353c925 100644 --- a/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresProblem.java +++ b/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresProblem.java @@ -86,7 +86,6 @@ public interface LeastSquaresProblem extends OptimizationProblem<LeastSquaresPro * way for the caller to specify that the result of this computation should be * considered meaningless, and thus trigger an exception. * - * * @param threshold Singularity threshold. * @return the covariance matrix. * @throws org.apache.commons.math4.linear.SingularMatrixException @@ -100,7 +99,6 @@ public interface LeastSquaresProblem extends OptimizationProblem<LeastSquaresPro * matrix, {@code sd(a[i]) ~= sqrt(C[i][i])}, where {@code a[i]} is the optimized * value of the {@code i}-th parameter, and {@code C} is the covariance matrix. * - * * @param covarianceSingularityThreshold Singularity threshold (see {@link * #getCovariances(double) computeCovariances}). * @return an estimate of the standard deviation of the optimized parameters @@ -128,13 +126,33 @@ public interface LeastSquaresProblem extends OptimizationProblem<LeastSquaresPro /** * Get the cost. + * It is the square-root of the {@link #getChiSquare() objective function}. * * @return the cost. * @see #getResiduals() + * @see #getChiSquare() */ double getCost(); /** + * Get the sum of the squares of the residuals. + * + * @return the cost. + * @see #getResiduals() + * @see #getCost() + */ + double getChiSquare(); + + /** + * Get the reduced chi-square. + * + * @param n Number of fitted parameters. + * @return the sum of the squares of the residuals divided by the number + * of degrees of freedom. + */ + double getReducedChiSquare(int n); + + /** * Get the weighted residuals. The residual is the difference between the * observed (target) values and the model (objective function) value. There is one * residual for each element of the vector-valued function. The raw residuals are http://git-wip-us.apache.org/repos/asf/commons-math/blob/0a499402/src/main/java/org/apache/commons/math4/fitting/leastsquares/OptimumImpl.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math4/fitting/leastsquares/OptimumImpl.java b/src/main/java/org/apache/commons/math4/fitting/leastsquares/OptimumImpl.java index e01b750..ddd478d 100644 --- a/src/main/java/org/apache/commons/math4/fitting/leastsquares/OptimumImpl.java +++ b/src/main/java/org/apache/commons/math4/fitting/leastsquares/OptimumImpl.java @@ -86,6 +86,16 @@ class OptimumImpl implements Optimum { } /** {@inheritDoc} */ + public double getChiSquare() { + return value.getChiSquare(); + } + + /** {@inheritDoc} */ + public double getReducedChiSquare(int n) { + return value.getReducedChiSquare(n); + } + + /** {@inheritDoc} */ public RealVector getResiduals() { return value.getResiduals(); } http://git-wip-us.apache.org/repos/asf/commons-math/blob/0a499402/src/test/java/org/apache/commons/math4/fitting/leastsquares/EvaluationRmsCheckerTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/fitting/leastsquares/EvaluationRmsCheckerTest.java b/src/test/java/org/apache/commons/math4/fitting/leastsquares/EvaluationRmsCheckerTest.java index d98dcaa..767c04e 100644 --- a/src/test/java/org/apache/commons/math4/fitting/leastsquares/EvaluationRmsCheckerTest.java +++ b/src/test/java/org/apache/commons/math4/fitting/leastsquares/EvaluationRmsCheckerTest.java @@ -74,6 +74,14 @@ public class EvaluationRmsCheckerTest { return 0; } + public double getChiSquare() { + return 0; + } + + public double getReducedChiSquare(int n) { + return 0; + } + public RealVector getResiduals() { return null; } http://git-wip-us.apache.org/repos/asf/commons-math/blob/0a499402/src/test/java/org/apache/commons/math4/fitting/leastsquares/LevenbergMarquardtOptimizerTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/fitting/leastsquares/LevenbergMarquardtOptimizerTest.java b/src/test/java/org/apache/commons/math4/fitting/leastsquares/LevenbergMarquardtOptimizerTest.java index 73b443d..6198eb7 100644 --- a/src/test/java/org/apache/commons/math4/fitting/leastsquares/LevenbergMarquardtOptimizerTest.java +++ b/src/test/java/org/apache/commons/math4/fitting/leastsquares/LevenbergMarquardtOptimizerTest.java @@ -233,6 +233,25 @@ public class LevenbergMarquardtOptimizerTest FastMath.abs(0.1 * expectedCovarMatrix[i][j])); } } + + // Check various measures of goodness-of-fit. + final double chi2 = optimum.getChiSquare(); + final double cost = optimum.getCost(); + final double rms = optimum.getRMS(); + final double reducedChi2 = optimum.getReducedChiSquare(start.length); + + // XXX Values computed by the CM code: It would be better to compare + // with the results from another library. + final double expectedChi2 = 66.07852350839286; + final double expectedReducedChi2 = 1.2014277001525975; + final double expectedCost = 8.128869755900439; + final double expectedRms = 1.0582887010256337; + + final double tol = 1e14; + Assert.assertEquals(expectedChi2, chi2, tol); + Assert.assertEquals(expectedReducedChi2, reducedChi2, tol); + Assert.assertEquals(expectedCost, cost, tol); + Assert.assertEquals(expectedRms, rms, tol); } @Test