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
- 1. Anpassen einer Pareto-Verteilung mit (Python) Scipy
- 2. Anpassen von Daten mit UnivariateSpline in scipy python
- 3. Probenahme aus einer inversen Gammaverteilung in R
- 4. ANCOVA in Python mit Scipy/Numpy stats
- 5. Schwierigkeit der Anpassung der Gammaverteilung mit R
- 6. Python scipy nicht installiert
- 7. Python SciPy convolve vs fftconvolve
- 8. Lesen MatLab-Dateien in Python mit scipy
- 9. Extrapolieren mit interp2d von scipy Python
- 10. Multivariate Normaler CDF in Python mit scipy
- 11. Python - Scipy lineare Regression mit Nan-Werten
- 12. Wie mit numpy/scipy
- 13. Python (scipy) Importzeit von Textdatei
- 14. SciPy/Python-Installation auf Ubuntu
- 15. Python Scipy FFT WAV-Dateien
- 16. Falsche Rechteckwellenabtastung mit scipy
- 17. ANOVA in Python mit Pandas Datenrahmen mit Statsmodels oder Scipy?
- 18. Python (Scipy): Den Skalenparameter (Standardabweichung) einer Gaußschen Verteilung finden
- 19. Python - Bildgröße anpassen
- 20. Saisonale Anpassung in Python und Scipy
- 21. Logistische Regression mit SciPy
- 22. WPF: Anpassen einer Datamap mit einer Bindungseigenschaft
- 23. Warum hat die Gamma-Verteilung in SciPy drei Parameter?
- 24. Log von sehr kleinen Werten mit numpy/scipy in Python
- 25. Verketten Sie dünn besetzte Matrizen in Python mit SciPy/Numpy
- 26. Prüfdichte einer Scipy Sparse Matrix
- 27. Scipy Zoom mit komplexen Werten
- 28. Quantifizierung der Qualität der Kurvenanpassung mit Python SciPy
- 29. (Scikit - Python) Import: Kein Modul scipy namens
- 30. Wie importieren Scipy und Numpy in Python?
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