scipy.stats.rv_histogram.

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) und floc und fscale (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, 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_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

FitError

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

Wenn eine CensoredData-Instanz an data ü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, loc und scale) 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 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, 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. norm beispielsweise 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)