* wpylib.math.fitting.fit_func: Allow Guess argument to override

machine-generated guess.
* Add 'funcalls' data key to the leastsq complete output to conform to the
  fmin-style output.
master
Wirawan Purwanto 11 years ago
parent 2907b2ca77
commit 1421cf3bc5
  1. 14
      math/fitting/__init__.py

@ -173,7 +173,9 @@ def fit_func(Funct, Data=None, Guess=None, x=None, y=None,
if Data != None: # an alternative way to specifying x and y if Data != None: # an alternative way to specifying x and y
y = Data[0] y = Data[0]
x = Data[1:] # possibly multidimensional! x = Data[1:] # possibly multidimensional!
if hasattr(Funct, "Guess_xy"): if Guess != None:
pass
elif hasattr(Funct, "Guess_xy"):
# Try to provide an initial guess # Try to provide an initial guess
Guess = Funct.Guess_xy(x, y) Guess = Funct.Guess_xy(x, y)
elif hasattr(Funct, "Guess"): elif hasattr(Funct, "Guess"):
@ -211,6 +213,7 @@ def fit_func(Funct, Data=None, Guess=None, x=None, y=None,
print "Guess params:" print "Guess params:"
print Guess print Guess
extra_keys = {}
if method == 'leastsq': if method == 'leastsq':
# modified Levenberg-Marquardt algorithm # modified Levenberg-Marquardt algorithm
rslt = leastsq(fun_err, rslt = leastsq(fun_err,
@ -220,6 +223,10 @@ def fit_func(Funct, Data=None, Guess=None, x=None, y=None,
**opts **opts
) )
keys = ('xopt', 'cov_x', 'infodict', 'mesg', 'ier') # ier = error message code from MINPACK keys = ('xopt', 'cov_x', 'infodict', 'mesg', 'ier') # ier = error message code from MINPACK
extra_keys = {
# map the output values to the same keyword as other methods below:
'funcalls': (lambda : rslt[2]['nfev']),
}
elif method == 'fmin': elif method == 'fmin':
# Nelder-Mead Simplex algorithm # Nelder-Mead Simplex algorithm
rslt = fmin(fun_err2, rslt = fmin(fun_err2,
@ -260,9 +267,12 @@ def fit_func(Funct, Data=None, Guess=None, x=None, y=None,
print "chi square = ", last_chi_sqr / len(y) print "chi square = ", last_chi_sqr / len(y)
if outfmt == 1: if outfmt == 1:
return rslt[0] return rslt[0]
else: else: # outfmt == 0 -- full result.
rec = fit_result(dict(zip(keys, rslt))) rec = fit_result(dict(zip(keys, rslt)))
rec['chi_square'] = chi_sqr rec['chi_square'] = chi_sqr
rec['fit_method'] = method rec['fit_method'] = method
# If there are extra keys, record them here:
for (k,v) in extra_keys.iteritems():
rec[k] = v()
return rec return rec

Loading…
Cancel
Save