2010-05-24 23 views
16

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

37

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) 
+0

vielen Dank Aber warum Sie die Variable x am Anfang erstellt haben – Archanimus

+0

Ah, scheint es, dass meine Botschaft zu spät ist Dank Ihnen sehr viel wieder.;) – Archanimus

+5

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

1

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.

1

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] 
0

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

Verwandte Themen