2016-05-13 9 views
0

Mit zwei Datensätzen, die anscheinend einem exponentiellen Trend folgen, habe ich eine Kurve in sie mit scipy.optimize.curve_fit() ausgestattet. Der Datensatz x enthält keine Null und ist 0<x<=100 gebunden, während der Datensatz y0<=y<=1 ist. Dies ist die Einbau Gleichung:Python: Fehler beim Ausführen des Bootstrap mit scipy.optimize.curve_fit

def func(x, a, c, d): 
    return a * numpy.exp(-c*x)+d 

und ich habe curve_fit wie folgt aufgerufen:

popt, pcov, infodict, errmsg, ier = curve_fit(func, x1, y1, p0 = (1, 1e-6, 1), full_output=True) 

wo x1 und y1 meine beiden Datensätze sind. Jetzt, based on this answer, wollte ich die Bootstrap Method durchführen, um sicherzustellen, dass ich die Standardfehler auf angepassten Parametern erhielt, die ich verwenden werde, um die Anpassungsgüte zu quantifizieren.

Based on the code provided in this answer, da anscheinend SciPy nichts von der Art enthält, habe ich einen Aufruf an die Bootstrap-Methode wie folgt aus:

pfit, perr = fit_bootstrap(pstart, xx, yy, func) 

wo pfit die neuen Anpassungsparameter (sind zu vergleichen mit die von curve_fit angegebenen) und perr sind die Standardfehler, nach denen ich suche. p-start in meinem Fall ist (1, 1e-6,1), xx sind die X-Werte verwendet, um die Funktionen zu plotten, und yy sind die y-Werte aus der angepassten Gleichung auf die xx Werte angewendet. Zuletzt ist die angepasste Funktion func=a*numpy.exp(-c*x)+d.

Der Anruf löst einen Fehler aus:TypeError: func() takes exactly 4 arguments (2 given). Ich verstehe, dass es bei den Argumenten keine Übereinstimmung gibt, aber ich bekomme nicht den genauen Punkt, an dem der Fehler liegt. Kann mir bitte jemand helfen?

Traceback:

TypeError         Traceback (most recent call last) 
in <module>() 
    163  return pfit_bootstrap, perr_bootstrap 
    164 
--> 165 pfit, perr = fit_bootstrap(pstart, xx, yy, func) 
    166 
    167 print("\nFit parameters and parameter errors from bootstrap method :") 

in fit_bootstrap(p0, datax, datay, function, yerr_systematic) 
    127 
    128  # Fit first time 
--> 129  pfit, perr = optimize.leastsq(errfunc, p0, args=(datax, datay), full_output=0) 
    130 
    131 

in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag) 
    375  if not isinstance(args, tuple): 
    376   args = (args,) 
--> 377  shape, dtype = _check_func('leastsq', 'func', func, x0, args, n) 
    378  m = shape[0] 
    379  if n > m: 

in _check_func(checker, argname, thefunc, x0, args, numinputs, output_shape) 
    24 def _check_func(checker, argname, thefunc, x0, args, numinputs, 
    25     output_shape=None): 
---> 26  res = atleast_1d(thefunc(*((x0[:numinputs],) + args))) 
    27  if (output_shape is not None) and (shape(res) != output_shape): 
    28   if (output_shape[0] != 1): 

in <lambda>(p, x, y) 
    124 def fit_bootstrap(p0, datax, datay, function, yerr_systematic=0.0): 
    125 
--> 126  errfunc = lambda p, x, y: function(x,p) - y 
    127 
    128  # Fit first time 

TypeError: func() takes exactly 4 arguments (2 given) 

Antwort

1

In der folgenden Zeile sollten Sie nicht die func als Argument übergeben:

pfit, perr = fit_bootstrap(pstart, xx, yy, func) 

Wenn Sie die Antwort überprüfen Sie genannt, sie Funktion mit dem Namen ff passieren . Die ff ist definiert als:

def ff(x, p): 
    return func(x,*p) 

, sobald Sie die Definition von "ff" hinzugefügt haben, können Sie den Anruf ändern:

pfit, perr = fit_bootstrap(pstart, xx, yy, ff) 
+0

ok, aber warum ist das? Warum kann der "Func" nicht direkt ein Argument sein? – FaCoffee

Verwandte Themen