fit#
- rv_histogram.fit(data, *args, **kwds)[Quelle]#
Gibt Schätzungen für Form (falls zutreffend), Lage und Skalenparameter aus Daten zurück. Die Standard-Schätzmethode ist die Maximum-Likelihood-Schätzung (MLE), aber auch die Momentenmethode (MM) ist verfügbar.
Startschätzungen für die Anpassung werden durch Eingabeargumente gegeben; für alle Argumente, für die keine Startschätzungen angegeben wurden, wird
self._fitstart(data)aufgerufen, um diese zu generieren.Man kann einige Parameter auf bestimmte Werte fixieren, indem man Schlüsselwortargumente
f0,f1, ...,fn(für Formparameter) undflocundfscale(für Lage- bzw. Skalenparameter) übergibt.- Parameter:
- dataarray_like oder
CensoredData-Instanz Daten, die zur Schätzung der Verteilungsparameter verwendet werden.
- arg1, arg2, arg3,…floats, optional
Startwert(e) für alle formcharakterisierenden Argumente (die nicht angegeben werden, werden durch einen Aufruf von
_fitstart(data)bestimmt). Kein Standardwert.- **kwdsfloats, optional
loc: Anfangsschätzung für den Lageparameter der Verteilung.
scale: Anfangsschätzung für den Skalenparameter der Verteilung.
Spezielle Schlüsselwortargumente werden als Fixierung bestimmter Parameter erkannt
f0…fn : fixiert die jeweiligen Formparameter. Alternativ können zu fixierende Formparameter nach Namen angegeben werden. Wenn beispielsweise
self.shapes == "a, b"ist, sindfaundfix_aäquivalent zuf0undfbundfix_bsind äquivalent zuf1.floc : fixiert den Lageparameter auf den angegebenen Wert.
fscale : fixiert den Skalenparameter auf den angegebenen Wert.
optimizer : Der zu verwendende Optimierer. Der Optimierer muss
funcund die Startposition als erste beiden Argumente sowieargs(für zusätzliche Argumente, die an die zu optimierende Funktion übergeben werden) unddispübernehmen. Die Methodefitruft den Optimierer mitdisp=0auf, um die Ausgabe zu unterdrücken. Der Optimierer muss die geschätzten Parameter zurückgeben.method : Die zu verwendende Methode. Der Standardwert ist „MLE“ (Maximum Likelihood Estimate); „MM“ (Method of Moments) ist ebenfalls verfügbar.
- dataarray_like oder
- Rückgabe:
- parameter_tupleTuple von Floats
Schätzungen für alle Formparameter (falls zutreffend), gefolgt von denen für Lage und Skala. Für die meisten Zufallsvariablen werden Schätzungen der Formparameter zurückgegeben, aber es gibt Ausnahmen (z.B.
norm).
- Löst aus:
- TypeError, ValueError
Wenn eine Eingabe ungültig ist
FitErrorWenn die Anpassung fehlschlägt oder die erzeugte Anpassung ungültig wäre
Hinweise
Bei
method="MLE"(Standard) wird die Anpassung durch Minimierung der negativen Log-Likelihood-Funktion berechnet. Für Beobachtungen außerhalb des Trägers der Verteilung wird eine große, endliche Strafe (anstelle einer unendlichen negativen Log-Likelihood) angewendet.Bei
method="MM"wird die Anpassung durch Minimierung der L2-Norm der relativen Fehler zwischen den ersten *k* rohen (um Null zentrierten) Datenmomenten und den entsprechenden Verteilungsmomenten berechnet, wobei *k* die Anzahl der nicht-fixierten Parameter ist. Genauer gesagt, die Zielfunktion ist(((data_moments - dist_moments) / np.maximum(np.abs(data_moments), 1e-8))**2).sum()
wobei die Konstante
1e-8Division durch Null im Falle verschwindender Datenmomente vermeidet. Typischerweise kann diese Fehlernorm auf Null reduziert werden. Beachten Sie, dass die Standard-Momentenmethode Parameter liefern kann, für die einige Daten außerhalb des Trägers der angepassten Verteilung liegen; diese Implementierung tut nichts, um dies zu verhindern.Für beide Methoden wird keine Garantie gegeben, dass die zurückgegebene Antwort global optimal ist; sie kann nur lokal optimal sein, oder die Optimierung kann vollständig fehlschlagen. Wenn die Daten
np.nan,np.infoder-np.infenthalten, löst die MethodefiteinenRuntimeErroraus.Wenn eine
CensoredData-Instanz andataübergeben wird, wird die Log-Likelihood-Funktion definiert als\[\begin{split}l(\pmb{\theta}; k) & = \sum \log(f(k_u; \pmb{\theta})) + \sum \log(F(k_l; \pmb{\theta})) \\ & + \sum \log(1 - F(k_r; \pmb{\theta})) \\ & + \sum \log(F(k_{\text{high}, i}; \pmb{\theta}) - F(k_{\text{low}, i}; \pmb{\theta}))\end{split}\]wobei \(f\) und \(F\) die Wahrscheinlichkeitsdichtefunktion (pdf) und die kumulative Verteilungsfunktion (cdf) der zu fittenden Funktion sind, \(\pmb{\theta}\) ist der Parametervektor, \(u\) sind die Indizes von unzensierten Beobachtungen, \(l\) sind die Indizes von links-zensierten Beobachtungen, \(r\) sind die Indizes von rechts-zensierten Beobachtungen, die Indizes „low“/„high“ bezeichnen die Endpunkte von Intervall-zensierten Beobachtungen, und \(i\) sind die Indizes von Intervall-zensierten Beobachtungen.
Beispiele
Generieren Sie einige Daten zum Fitten: Ziehen Sie Zufallsvariaten aus der
beta-Verteilung>>> import numpy as np >>> from scipy.stats import beta >>> a, b = 1., 2. >>> rng = np.random.default_rng() >>> x = beta.rvs(a, b, size=1000, random_state=rng)
Jetzt können wir alle vier Parameter (
a,b,locundscale) fitten>>> a1, b1, loc1, scale1 = beta.fit(x) >>> a1, b1, loc1, scale1 (1.0198945204435628, 1.9484708982737828, 4.372241314917588e-05, 0.9979078845964814)
Das Fitten kann auch mit einem benutzerdefinierten Optimierer erfolgen
>>> from scipy.optimize import minimize >>> def custom_optimizer(func, x0, args=(), disp=0): ... res = minimize(func, x0, args, method="slsqp", options={"disp": disp}) ... if res.success: ... return res.x ... raise RuntimeError('optimization routine failed') >>> a1, b1, loc1, scale1 = beta.fit(x, method="MLE", optimizer=custom_optimizer) >>> a1, b1, loc1, scale1 (1.0198821087258905, 1.948484145914738, 4.3705304486881485e-05, 0.9979104663953395)
Wir können auch Vorwissen über den Datensatz nutzen: halten wir
locundscalefixiert>>> a1, b1, loc1, scale1 = beta.fit(x, floc=0, fscale=1) >>> loc1, scale1 (0, 1)
Wir können auch Formparameter fixieren, indem wir
f-Schlüsselwörter verwenden. Um den nullten Formparameteragleich 1 zu halten, verwenden Sief0=1oder, gleichwertig,fa=1>>> a1, b1, loc1, scale1 = beta.fit(x, fa=1, floc=0, fscale=1) >>> a1 1
Nicht alle Verteilungen geben Schätzungen für die Formparameter zurück.
normbeispielsweise gibt nur Schätzungen für Lage und Skala zurück>>> from scipy.stats import norm >>> x = norm.rvs(a, b, size=1000, random_state=123) >>> loc1, scale1 = norm.fit(x) >>> loc1, scale1 (0.92087172783841631, 2.0015750750324668)