You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ce...@apache.org on 2012/05/02 07:50:59 UTC

svn commit: r1332924 - in /commons/proper/math/trunk/src/test: java/org/apache/commons/math3/optimization/general/ resources/org/apache/commons/math3/optimization/general/

Author: celestin
Date: Wed May  2 05:50:59 2012
New Revision: 1332924

URL: http://svn.apache.org/viewvc?rev=1332924&view=rev
Log:
Standard unit test of least-squares optimizers based on NIST's Statistical Reference Datasets (StRD).

Added:
    commons/proper/math/trunk/src/test/resources/org/apache/commons/math3/optimization/general/Lanczos1.dat
Modified:
    commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/AbstractLeastSquaresOptimizerAbstractTest.java
    commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/GaussNewtonOptimizerTest.java
    commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/StatisticalReferenceDatasetFactory.java

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/AbstractLeastSquaresOptimizerAbstractTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/AbstractLeastSquaresOptimizerAbstractTest.java?rev=1332924&r1=1332923&r2=1332924&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/AbstractLeastSquaresOptimizerAbstractTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/AbstractLeastSquaresOptimizerAbstractTest.java Wed May  2 05:50:59 2012
@@ -17,6 +17,7 @@
 package org.apache.commons.math3.optimization.general;
 
 import java.awt.geom.Point2D;
+import java.io.IOException;
 import java.io.Serializable;
 import java.util.Arrays;
 
@@ -466,6 +467,43 @@ public abstract class AbstractLeastSquar
         {-0.048837, -0.077056}, {-0.127729, -0.075338}, {-0.221271, -0.067526}
     };
 
+    public void doTestStRD(final StatisticalReferenceDataset dataset,
+        final double errParams, final double errParamsSd) {
+        final AbstractLeastSquaresOptimizer optimizer = createOptimizer();
+        final double[] w = new double[dataset.getNumObservations()];
+        Arrays.fill(w, 1.0);
+
+        final double[][] data = dataset.getData();
+        final double[] initial = dataset.getStartingPoint(0);
+        final DifferentiableMultivariateVectorFunction problem;
+        problem = dataset.getLeastSquaresProblem();
+        final PointVectorValuePair optimum;
+        optimum = optimizer.optimize(100, problem, data[1], w, initial);
+
+        final double[] actual = optimum.getPoint();
+        final double[] actualSig = optimizer.guessParametersErrors();
+        for (int i = 0; i < actual.length; i++) {
+            double expected = dataset.getParameter(i);
+            double delta = FastMath.abs(errParams * expected);
+            Assert.assertEquals(dataset.getName() + ", param #" + i,
+                                expected, actual[i], delta);
+            expected = dataset.getParameterStandardDeviation(i);
+            delta = FastMath.abs(errParamsSd * expected);
+            Assert.assertEquals(dataset.getName() + ", sd of param #" + i,
+                                expected, actualSig[i], delta);
+        }
+    }
+
+    @Test
+    public void testKirby2() throws IOException {
+        doTestStRD(StatisticalReferenceDatasetFactory.createKirby2(), 1E-7, 1E-7);
+    }
+
+    @Test
+    public void testHahn1() throws IOException {
+        doTestStRD(StatisticalReferenceDatasetFactory.createHahn1(), 1E-7, 1E-4);
+    }
+
     static class LinearProblem implements DifferentiableMultivariateVectorFunction, Serializable {
 
         private static final long serialVersionUID = 703247177355019415L;

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/GaussNewtonOptimizerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/GaussNewtonOptimizerTest.java?rev=1332924&r1=1332923&r2=1332924&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/GaussNewtonOptimizerTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/GaussNewtonOptimizerTest.java Wed May  2 05:50:59 2012
@@ -17,6 +17,8 @@
 
 package org.apache.commons.math3.optimization.general;
 
+import java.io.IOException;
+
 import org.apache.commons.math3.exception.ConvergenceException;
 import org.apache.commons.math3.exception.TooManyEvaluationsException;
 import org.apache.commons.math3.optimization.SimpleVectorValueChecker;
@@ -131,8 +133,19 @@ public class GaussNewtonOptimizerTest
     @Test(expected=ConvergenceException.class)
     public void testCircleFittingBadInit() {
         /*
-         * This test does not converge with this optimizer
+         * This test does not converge with this optimizer.
          */
         super.testCircleFittingBadInit();
     }
+
+    @Override
+    @Test(expected = ConvergenceException.class)
+    public void testHahn1()
+        throws IOException {
+        /*
+         * TODO This test leads to a singular problem with the Gauss-Newton
+         * optimizer. This should be inquired.
+         */
+        super.testHahn1();
+    }
 }

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/StatisticalReferenceDatasetFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/StatisticalReferenceDatasetFactory.java?rev=1332924&r1=1332923&r2=1332924&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/StatisticalReferenceDatasetFactory.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/optimization/general/StatisticalReferenceDatasetFactory.java Wed May  2 05:50:59 2012
@@ -152,6 +152,41 @@ public class StatisticalReferenceDataset
         return dataset;
     }
 
+    public static StatisticalReferenceDataset createLanczos1()
+        throws IOException {
+        final BufferedReader in =
+            createBufferedReaderFromResource("Lanczos1.dat");
+        StatisticalReferenceDataset dataset = null;
+        try {
+            dataset = new StatisticalReferenceDataset(in) {
+
+                @Override
+                public double getModelValue(final double x, final double[] a) {
+                    System.out.println(a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]);
+                    return a[0] * FastMath.exp(-a[3] * x) +
+                           a[1] * FastMath.exp(-a[4] * x) +
+                           a[2] * FastMath.exp(-a[5] * x);
+                }
+
+                @Override
+                public double[] getModelDerivatives(final double x,
+                    final double[] a) {
+                    final double[] dy = new double[6];
+                    dy[0] = FastMath.exp(-x * a[3]);
+                    dy[1] = FastMath.exp(-x * a[4]);
+                    dy[2] = FastMath.exp(-x * a[5]);
+                    dy[3] = -x * a[0] * dy[0];
+                    dy[4] = -x * a[1] * dy[1];
+                    dy[5] = -x * a[2] * dy[2];
+                    return dy;
+                }
+            };
+        } finally {
+            in.close();
+        }
+        return dataset;
+    }
+
     /**
      * Returns an array with all available reference datasets.
      *

Added: commons/proper/math/trunk/src/test/resources/org/apache/commons/math3/optimization/general/Lanczos1.dat
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/resources/org/apache/commons/math3/optimization/general/Lanczos1.dat?rev=1332924&view=auto
==============================================================================
--- commons/proper/math/trunk/src/test/resources/org/apache/commons/math3/optimization/general/Lanczos1.dat (added)
+++ commons/proper/math/trunk/src/test/resources/org/apache/commons/math3/optimization/general/Lanczos1.dat Wed May  2 05:50:59 2012
@@ -0,0 +1,84 @@
+NIST/ITL StRD
+Dataset Name:  Lanczos1          (Lanczos1.dat)
+
+File Format:   ASCII
+               Starting Values   (lines 41 to 46)
+               Certified Values  (lines 41 to 51)
+               Data              (lines 61 to 84)
+
+Procedure:     Nonlinear Least Squares Regression
+
+Description:   These data are taken from an example discussed in
+               Lanczos (1956).  The data were generated to 14-digits
+               of accuracy using
+               f(x) = 0.0951*exp(-x) + 0.8607*exp(-3*x) 
+                                     + 1.5576*exp(-5*x).
+
+
+Reference:     Lanczos, C. (1956).
+               Applied Analysis.
+               Englewood Cliffs, NJ:  Prentice Hall, pp. 272-280.
+
+
+
+
+Data:          1 Response  (y)
+               1 Predictor (x)
+               24 Observations
+               Average Level of Difficulty
+               Generated Data
+
+Model:         Exponential Class
+               6 Parameters (b1 to b6)
+
+               y = b1*exp(-b2*x) + b3*exp(-b4*x) + b5*exp(-b6*x)  +  e
+
+
+ 
+          Starting values                  Certified Values
+ 
+        Start 1     Start 2           Parameter     Standard Deviation
+  b1 =   1.2         0.5           9.5100000027E-02  5.3347304234E-11
+  b2 =   0.3         0.7           1.0000000001E+00  2.7473038179E-10
+  b3 =   5.6         3.6           8.6070000013E-01  1.3576062225E-10
+  b4 =   5.5         4.2           3.0000000002E+00  3.3308253069E-10
+  b5 =   6.5         4             1.5575999998E+00  1.8815731448E-10
+  b6 =   7.6         6.3           5.0000000001E+00  1.1057500538E-10
+
+Residual Sum of Squares:                    1.4307867721E-25
+Residual Standard Deviation:                8.9156129349E-14
+Degrees of Freedom:                                18
+Number of Observations:                            24
+
+
+
+
+
+
+
+
+Data:   y                   x
+       2.513400000000E+00  0.000000000000E+00
+       2.044333373291E+00  5.000000000000E-02
+       1.668404436564E+00  1.000000000000E-01
+       1.366418021208E+00  1.500000000000E-01
+       1.123232487372E+00  2.000000000000E-01
+       9.268897180037E-01  2.500000000000E-01
+       7.679338563728E-01  3.000000000000E-01
+       6.388775523106E-01  3.500000000000E-01
+       5.337835317402E-01  4.000000000000E-01
+       4.479363617347E-01  4.500000000000E-01
+       3.775847884350E-01  5.000000000000E-01
+       3.197393199326E-01  5.500000000000E-01
+       2.720130773746E-01  6.000000000000E-01
+       2.324965529032E-01  6.500000000000E-01
+       1.996589546065E-01  7.000000000000E-01
+       1.722704126914E-01  7.500000000000E-01
+       1.493405660168E-01  8.000000000000E-01
+       1.300700206922E-01  8.500000000000E-01
+       1.138119324644E-01  9.000000000000E-01
+       1.000415587559E-01  9.500000000000E-01
+       8.833209084540E-02  1.000000000000E+00
+       7.833544019350E-02  1.050000000000E+00
+       6.976693743449E-02  1.100000000000E+00
+       6.239312536719E-02  1.150000000000E+00