Kann mir jemand bei der Anpassung einer Gamma-Verteilung in Python helfen? Nun, ich habe ein paar Daten: X- und Y-Koordinaten, und ich möchte die Gamma-Parameter finden, die zu dieser Verteilung passen ... In der Scipy doc stellt sich heraus, dass es tatsächlich eine Fit-Methode gibt, aber ich weiß nicht, wie benutze es: s .. Zuerst, in welchem Format muss das Argument "data" sein, und wie kann ich das zweite Argument (die Parameter) angeben, da das ist, was ich suche?Anpassen einer Gamma-Verteilung mit (Python) Scipy
Antwort
einige Gammadaten erzeugen:
import scipy.stats as stats
alpha = 5
loc = 100.5
beta = 22
data = stats.gamma.rvs(alpha, loc=loc, scale=beta, size=10000)
print(data)
# [ 202.36035683 297.23906376 249.53831795 ..., 271.85204096 180.75026301
# 364.60240242]
Hier passen wir die Daten an die Gamma-Verteilung:
fit_alpha, fit_loc, fit_beta=stats.gamma.fit(data)
print(fit_alpha, fit_loc, fit_beta)
# (5.0833692504230008, 100.08697963283467, 21.739518937816108)
print(alpha, loc, beta)
# (5, 100.5, 22)
Wenn Sie ein langes Beispiel mit einer Diskussion über die Schätzung oder die Festsetzung der Unterstützung der wollen Verteilung, dann können Sie es in https://github.com/scipy/scipy/issues/1359 und die verknüpfte Mailingliste Nachricht finden.
Vorläufige Unterstützung für das Korrigieren von Parametern, z. B. Position, während der Anpassung wurde der Stammversion von scipy hinzugefügt.
Ich war mit der ss.gamma.rvs-Funktion unzufrieden, da sie negative Zahlen erzeugen kann, etwas was die Gamma-Verteilung nicht haben soll. Also passte ich das Sample durch Erwartungswert = Mittelwert (Daten) und Varianz = Var (Daten) (siehe Wikipedia für Details) und schrieb eine Funktion, die zufällige Samples einer Gammaverteilung ohne scipy ergeben konnte (was ich schwierig zu installieren fand), auf einem Sidenote):
import random
import numpy
data = [6176, 11046, 670, 6146, 7945, 6864, 767, 7623, 7212, 9040, 3213, 6302, 10044, 10195, 9386, 7230, 4602, 6282, 8619, 7903, 6318, 13294, 6990, 5515, 9157]
# Fit gamma distribution through mean and average
mean_of_distribution = numpy.mean(data)
variance_of_distribution = numpy.var(data)
def gamma_random_sample(mean, variance, size):
"""Yields a list of random numbers following a gamma distribution defined by mean and variance"""
g_alpha = mean*mean/variance
g_beta = mean/variance
for i in range(size):
yield random.gammavariate(g_alpha,1/g_beta)
# force integer values to get integer sample
grs = [int(i) for i in gamma_random_sample(mean_of_distribution,variance_of_distribution,len(data))]
print("Original data: ", sorted(data))
print("Random sample: ", sorted(grs))
# Original data: [670, 767, 3213, 4602, 5515, 6146, 6176, 6282, 6302, 6318, 6864, 6990, 7212, 7230, 7623, 7903, 7945, 8619, 9040, 9157, 9386, 10044, 10195, 11046, 13294]
# Random sample: [1646, 2237, 3178, 3227, 3649, 4049, 4171, 5071, 5118, 5139, 5456, 6139, 6468, 6726, 6944, 7050, 7135, 7588, 7597, 7971, 10269, 10563, 12283, 12339, 13066]
1): "Daten" Variable in dem Format einer Liste oder Python Tupel oder ein numpy.ndarray sein könnte, die durch die Verwendung erhalten werden konnten:
data=numpy.array(data)
wo die zweite Daten in der obigen Zeile eine Liste oder ein Tupel sein sollte, die Ihre Daten enthalten.
2: Die Variable "Parameter" ist eine erste Schätzung, die Sie der Anpassungsfunktion optional als Startpunkt für den Anpassungsprozess geben könnten, damit sie weggelassen werden kann.
3: eine Anmerkung zu @ mondanos Antwort. Die Verwendung von Momenten (Mittelwert und Varianzen) zur Bestimmung der Gammaparameter ist für große Formparameter (& alpha;> 10) ziemlich gut, könnte aber für kleine Werte von Alpha schlechte Ergebnisse liefern (siehe Statistische Methoden in den Atmosphärenspektren von Wilks und THOM, HCS, 1958: Eine Anmerkung zur Gamma-Verteilung Mon. Wea. Rev., 86, 117-122.
Die Verwendung von Maximum-Likelihood-Schätzern, wie sie im scipy-Modul implementiert sind, wird als bessere Wahl angesehen .!? in solchen Fällen
vielen Dank Aber warum Sie die Variable x am Anfang erstellt haben – Archanimus
Ah, scheint es, dass meine Botschaft zu spät ist Dank Ihnen sehr viel wieder.;) – Archanimus
scipy.stats maximalen likelih verwendet ood Schätzung für die Anpassung, so müssen Sie die Rohdaten übergeben und nicht die pdf/PMF (x, y) – ianalis