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 y
0<=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)
ok, aber warum ist das? Warum kann der "Func" nicht direkt ein Argument sein? – FaCoffee