[SciPy-User] Least-squares fittings with bounds: why is scipy not up to the task?
Matthew Newville
matt.newville at gmail.com
Thu Mar 8 17:09:49 EST 2012
Dear Eric,
On Thursday, March 8, 2012 2:29:22 PM UTC-6, Eric Emsellem wrote:
> Dear all,
>
> I know the title looks a little provocative, but this was obviously
done
> on purpose. I am very impressed by the capabilities of scipy (et al.,
> numpy etc) and have been a fan since years! But one thing (in my
> opinion) seems to be missing (see below). If it exists, then great
(and
> apologies)!
>
> What I didn't find in Scipy (or numpy or..) is *an efficient
> least-squares fitting routine which can include bounded, or fixed
> parameters*. This seems like something many people must be needing! I
am
> right now using mpfit.py (from minpack then Craig B. Markwardt for idl
> and Mark Rivers for python), which I did integrate in the package I am
> developing. It is much faster than many other routines in scipy
although
> Adam Ginsburg did mention some test-bench he conducted some time ago,
> showing that leastsq was quite efficient. It can include bounds, fixed
> parameters etc. And it works great! But this is probably not the best
> way to have such a stand-alone routine... and it is far from being
> optimised for the modern python.
>
> So:
>
> is there ANY plan for having such a module in Scipy?? I think
> (personally) that this is a MUST DO. This is typically the type of
> routines that I hear people use in e.g., idl etc. If this could be an
> optimised, fast (and easy to use) routine, all the better.
Yes, see https://github.com/newville/lmfit-py, which does everything you
ask for, and a bit more, with the possible exception of "being included in
scipy". For what its worth, I work with Mark Rivers (who's no longer
actively developing Python), and our group is full of IDL users who are
very familiar with Markwardt's implementation.
The lmfit-py version uses scipy.optimize.leastsq(), which uses MINPACK
directly, so has the advantage of not being implemented in pure IDL or
Python. It is definitely faster than mpfit.py.
With lmfit-py, one writes a python function-to-minimize that takes a list
of Parameters instead of the array of floating point variables that
scipy.optimize.leastsq() uses. Each Parameter can be freely varied of
fixed, have upper and/or lower bounds placed on them, or be written as
algebraic expressions of other Parameters. Uncertainties in varied
Parameters and correlations between Parameters are estimated using the same
"scaled covariance" method as used in scipy.optimize.curve_fit(). There
is limited support for optimization methods other than
scipy.optimize.leastsq(), but I don't find these methods to be very useful
for the kind of fitting problems I normally see, so support for them may
not be perfect.
Whether this gets included into scipy is up to the scipy developers. I'd be
happy to support this module within scipy or outside scipy.
I have no doubt that improvements could be made to lmfit.py. If you have
suggestion, I'd be happy to hear them.
Cheers,
--Matt Newville
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20120308/606c1aa1/attachment.html>
More information about the SciPy-User
mailing list