scipy.stats.rv_continuous.

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) und floc und fscale (für Lage- und Skalenparameter) übergibt.

Parameter:
dataarray_like oder CensoredData Instanz

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, sind fa und fix_a äquivalent zu f0, und fb und fix_b sind äquivalent zu f1.

  • floc : Fixiert den Lageparameter auf den angegebenen Wert.

  • fscale : Fixiert den Skalenparameter auf den angegebenen Wert.

  • optimizer : Der zu verwendende Optimierer. Der Optimierer muss func und die Startposition als erste beiden Argumente sowie args (für zusätzliche Argumente, die an die zu optimierende Funktion übergeben werden) und disp übernehmen. Die Methode fit ruft den Optimierer mit disp=0 auf, 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.

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

FitError

Wenn 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-8 eine 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.inf oder -np.inf enthalten, löst die Methode fit einen RuntimeError aus.

Beim Übergeben einer CensoredData Instanz an data wird 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, loc und scale) 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 loc und scale fixiert

>>> 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 Formparameter a gleich 1 zu halten, verwenden Sie f0=1 oder äquivalent 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. norm zum 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)