[SciPy-User] Catching warning and turning into errors for lmfit / scipy.optimize.leastsq
Troels Emtekær Linnet
tlinnet at gmail.com
Fri Apr 5 13:34:39 EDT 2013
Thanks Matt.
It was solved it by putting a minimum bound to 'decay', which in this case,
"of course" always positive.
Thanks for pointing out how the warnings are generated and handled.
Best
Troels Emtekær Linnet
2013/4/5 Matt Newville <newville at cars.uchicago.edu>
> Hi Troels,
>
> On Fri, Apr 5, 2013 at 7:18 AM, Troels Emtekær Linnet <tlinnet at gmail.com>
> wrote:
> > Dear Scipy users.
> >
> > I haven't been dealing with Warning and Errors before, and need a little
> > help catching warnings to errors.
> >
> > I am making some tests on some dataset, which get worse and worse.
> >
> > I am fitting a decay model, to some intensities.
> >
> > When the data gets really bad, I start getting some Warnings.
> > Getting decay for 8
> > Getting decay for 6
> > Getting decay for 4
> > Getting decay for 2
> > TB.py:34: RuntimeWarning: overflow encountered in exp
> > model = amp*exp(-decay*time)
> >
> > Function is:
> > def f_expdecay_lmfit(pars,time,data=None):
> > amp = pars['amp'].value
> > decay = pars['decay'].value
> > model = amp*exp(-decay*time)
> > if data is None:
> > return model
> > return (model-data)
> >
> > Call is:
> > try:
> > lmf = lmfit.minimize(f_expdecay_lmfit, par, args=(datX,
> > datY),method='leastsq')
> > fitY = f_expdecay_lmfit(par,datX)
> > except (RuntimeError, ValueError, RuntimeWarning, UnboundLocalError) as
> e:
> > print "Cannot fit expdecay for %s %s. Reason: %s"%(peak, peakname, e)
> > save_the_data_as_null_or_flagged
> >
> > My problem is, that I don't know how to catch the warnings.
> > If I get a warning, I also want to make sure, that this fit is not saved.
> >
> > I have tried to use the warning package
> > import warnings
> > warnings.simplefilter('error')
> >
> > Then I get:
> > -------------------
> > Traceback (most recent call last):
> > File "lmfit/minimizer.py", line 140, in __residual
> > out = self.userfcn(self.params, *self.userargs, **self.userkws)
> > File "/TB.py", line 33, in f_expdecay_lmfit
> > model = amp*exp(-decay*time)
> > RuntimeWarning: overflow encountered in exp
> > Traceback (most recent call last):
> > File "TB_fit.py", line 28, in <module>
> > TB.getdecay(XXL,XXL['met'])
> > File "/TB.py", line 268, in getdecay
> > lmf = lmfit.minimize(f_expdecay_lmfit, par, args=(datX,
> > datY),method='leastsq')
> > File "lmfit/minimizer.py", line 498, in minimize
> > fitter.leastsq()
> > File "lmfit/minimizer.py", line 369, in leastsq
> > lsout = scipy_leastsq(self.__residual, self.vars, **lskws)
> > File "scipy/optimize/minpack.py", line 283, in leastsq
> > gtol, maxfev, epsfcn, factor, diag)
> > minpack.error: Error occurred while calling the Python function named
> > __residual
> > --------------------------------------------
> > If I then rewrite the fitting function also.
> >
> > def f_expdecay_lmfit(pars,time,data=None):
> > amp = pars['amp'].value
> > decay = pars['decay'].value
> > try:
> > model = amp*exp(-decay*time)
> > except (RuntimeError, ValueError, RuntimeWarning, UnboundLocalError)
> as
> > e:
> > print "Cannot fit expdecay. Reason: %s"%(e)
> > if data is None:
> > return model
> > return (model-data)
> >
> > I still get:
> > ------------------------
> > Cannot fit expdecay. Reason: overflow encountered in exp
> > Traceback (most recent call last):
> > File "lmfit/minimizer.py", line 140, in __residual
> > out = self.userfcn(self.params, *self.userargs, **self.userkws)
> > File "/TB.py", line 39, in f_expdecay_lmfit
> > return (model-data)
> > UnboundLocalError: local variable 'model' referenced before assignment
> > Traceback (most recent call last):
> > File "TB_fit.py", line 28, in <module>
> > TB.getdecay(XXL,XXL['met'])
> > File "/TB.py", line 271, in getdecay
> > lmf = lmfit.minimize(f_expdecay_lmfit, par, args=(datX,
> > datY),method='leastsq')
> > File "lmfit/minimizer.py", line 498, in minimize
> > fitter.leastsq()
> > File "lmfit/minimizer.py", line 369, in leastsq
> > lsout = scipy_leastsq(self.__residual, self.vars, **lskws)
> > File "scipy/optimize/minpack.py", line 283, in leastsq
> > gtol, maxfev, epsfcn, factor, diag)
> > minpack.error: Error occurred while calling the Python function named
> > __residual
> > -----------------------
> >
> > I am not able to pass UnboundLocalError.
> >
> > I want to break out of the fitting rutine for warnings and errors, and
> save
> > that fit as null.
> >
> > Can someone help me to figure out how to fix this?
> >
> > Best
> > Troels
> >
> >
> >
> > Troels Emtekær Linnet
> > Ved kløvermarken 9, 1.th
> > 2300 København S
> > Mobil: +45 60210234
> >
> > _______________________________________________
> > SciPy-User mailing list
> > SciPy-User at scipy.org
> > http://mail.scipy.org/mailman/listinfo/scipy-user
> >
>
>
> I believe the problem you're having is that the underlying fitting
> routine really needs to have a valid array returned to it. When you
> get an RuntimeError exception because the exponentiation gives an
> overflow, the variable 'model' is not defined, and your return
> statements will cause another exception that the fitting routine can't
> handle. You may find something like this to be helpful:
>
> try:
> model = amp*exp(-decay*time)
> except (RuntimeError, ValueError, RuntimeWarning, UnboundLocalError)
> as e:
> print "Cannot fit expdecay. Reason: %s"%(e)
> return numpy.zeros_like(time)
>
> The other option is to figure why you're getting the overflows and
> prevent it. It looks like you expect "time" and "decay" to be
> positive, and so "-decay*time" to be negative. But numpy.exp()
> overflows when it's argument is > 700, which is probably a crazy value
> for you. If "time" is positive-definite, and you expect "decay" to
> be positive, you could think about placing a lower bound on "decay" of
> "-max(time)/100.", which would allow "decay" to be slightly negative,
> but not so much so as to cause the overflow. That would probably
> help avoid the problem in the first place.
>
> Hope that helps,
>
> --Matt
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20130405/5cee1029/attachment.html>
More information about the SciPy-User
mailing list