fit#
- rv_continuous.fit(data, *args, **kwds)[Quelle]#
Gibt Schätzungen der Form (falls zutreffend), Lage- und Skalenparameter aus Daten zurück. Die Standard-Schätzmethode ist die Maximum-Likelihood-Schätzung (MLE), aber die Methode der Momente (MM) ist ebenfalls verfügbar.
Anfangsschätzungen für die Anpassung werden durch Eingabeargumente gegeben; für alle Argumente, für die keine Anfangsschätzungen bereitgestellt wurden, wird
self._fitstart(data)aufgerufen, um solche zu generieren.Man kann einige Parameter auf spezifische Werte fixieren, indem man die Schlüsselwortargumente
f0,f1, ...,fn(für Formparameter) undflocundfscale(für Lage- und Skalenparameter) übergibt.- Parameter:
- dataarray_like oder
CensoredDataInstanz Daten zur Schätzung der Verteilungsparameter.
- arg1, arg2, arg3,…floats, optional
Anfangswert(e) für formcharakterisierende Argumente (die nicht angegeben werden, werden durch einen Aufruf von
_fitstart(data)bestimmt). Kein Standardwert.- **kwdsfloats, optional
loc: anfängliche Schätzung des Lageparameters der Verteilung.
scale: anfängliche Schätzung des Skalenparameters der Verteilung.
Spezielle Schlüsselwortargumente werden erkannt, um bestimmte Parameter zu fixieren
f0…fn : Fixiert die entsprechenden Formparameter. Alternativ können zu fixierende Formparameter nach Namen angegeben werden. Wenn beispielsweise
self.shapes == "a, b"ist, sindfaundfix_aäquivalent zuf0, undfbundfix_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_tupleTupel von floats
Schätzungen für die Formparameter (falls zutreffend), gefolgt von denen für Lage und Skala. Für die meisten Zufallsvariablen werden Schätzungen der Formparameter zurückgegeben, es gibt jedoch 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
Mit
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 (statt einer unendlichen negativen Log-Likelihood) angewendet.Mit
method="MM"wird die Anpassung durch Minimierung der L2-Norm der relativen Fehler zwischen den ersten *k* rohen (um Null) Datenmomenten und den entsprechenden Verteilungsmomenten berechnet, wobei *k* die Anzahl der nicht fixierten Parameter ist. Genauer gesagt ist die Zielfunktion(((data_moments - dist_moments) / np.maximum(np.abs(data_moments), 1e-8))**2).sum()
wobei die Konstante
1e-8eine Division durch Null im Falle verschwindender Datenmomente vermeidet. Typischerweise kann diese Fehlernorm auf Null reduziert werden. Beachten Sie, dass die Standardmethode der Momente Parameter ergeben 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 ist 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.Beim Übergeben einer
CensoredDataInstanz andatawird die Log-Likelihood-Funktion wie folgt definiert:\[\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 Dichtefunktion (PDF) und die kumulative Verteilungsfunktion (CDF) der zu anpassenden Funktion sind, \(\pmb{\theta}\) der Parametervektor ist, \(u\) die Indizes unzensierter Beobachtungen sind, \(l\) die Indizes linkszensierter Beobachtungen sind, \(r\) die Indizes rechtszensierter Beobachtungen sind, die Indizes „low“/„high“ die Endpunkte intervallzensierter Beobachtungen bezeichnen und \(i\) die Indizes intervallzensierter Beobachtungen sind.
Beispiele
Generieren Sie einige Daten zum Anpassen: 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)
Nun können wir alle vier Parameter (
a,b,locundscale) anpassen>>> a1, b1, loc1, scale1 = beta.fit(x) >>> a1, b1, loc1, scale1 (1.0198945204435628, 1.9484708982737828, 4.372241314917588e-05, 0.9979078845964814)
Die Anpassung 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 äquivalentfa=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.
normzum Beispiel 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)