[ 
https://issues.apache.org/jira/browse/MATH-519?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gilles updated MATH-519:
------------------------

    Attachment: GaussianFitter.java

I guess that the clean solution would be to be able to specify constraints such 
that the optimizer won't try invalid parameters.

An ugly workaround would be that the "CurveFitter" internally catches all 
"RuntimeException"s generated by the function, and consider the residuals to be 
infinite. But this would violate the stated policy that CM does not catch 
"MathUserException"s (and could have nasty side-effects when the exception is 
really unexpected).

I've tried another workaround in "GaussianFitter" (see attached file) whereby 
an invalid parameter is turned into the function returning "NaN" 
("POSITIVE_INFINITY" also works).
Let me know if you see any issues with this solution or if would be an adequate 
solution for this problem.


> GaussianFitter Unexpectedly Throws NotStrictlyPositiveException
> ---------------------------------------------------------------
>
>                 Key: MATH-519
>                 URL: https://issues.apache.org/jira/browse/MATH-519
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 3.0
>            Reporter: Ole Ersoy
>             Fix For: 3.0
>
>         Attachments: GaussianFitter.java, GaussianFitter2Test.java
>
>   Original Estimate: 4h
>  Remaining Estimate: 4h
>
> Running the following:
>       double[] observations = 
>       { 
>                       1.1143831578403364E-29, 
>                        4.95281403484594E-28, 
>                        1.1171347211930288E-26, 
>                        1.7044813962636277E-25, 
>                        1.9784716574832164E-24, 
>                        1.8630236407866774E-23, 
>                        1.4820532905097742E-22, 
>                        1.0241963854632831E-21, 
>                        6.275077366673128E-21, 
>                        3.461808994532493E-20, 
>                        1.7407124684715706E-19, 
>                        8.056687953553974E-19, 
>                        3.460193945992071E-18, 
>                        1.3883326374011525E-17, 
>                        5.233894983671116E-17, 
>                        1.8630791465263745E-16, 
>                        6.288759227922111E-16, 
>                        2.0204433920597856E-15, 
>                        6.198768938576155E-15, 
>                        1.821419346860626E-14, 
>                        5.139176445538471E-14, 
>                        1.3956427429045787E-13, 
>                        3.655705706448139E-13, 
>                        9.253753324779779E-13, 
>                        2.267636001476696E-12, 
>                        5.3880460095836855E-12, 
>                        1.2431632654852931E-11 
>       };
>   
>       GaussianFitter g = 
>               new GaussianFitter(new LevenbergMarquardtOptimizer());
>       
>       for (int index = 0; index < 27; index++)
>       {
>               g.addObservedPoint(index, observations[index]);
>       }
>               g.fit();
> Results in:
> org.apache.commons.math.exception.NotStrictlyPositiveException: -1.277 is 
> smaller than, or equal to, the minimum (0)
>       at 
> org.apache.commons.math.analysis.function.Gaussian$Parametric.validateParameters(Gaussian.java:184)
>       at 
> org.apache.commons.math.analysis.function.Gaussian$Parametric.value(Gaussian.java:129)
> I'm guessing the initial guess for sigma is off.  

-- 
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to