¿Alguien me puede ayudar a instalar una distribución gamma en python? Bueno, tengo algunos datos: coordenadas X e Y, y quiero encontrar los parámetros gamma que se ajustan a esta distribución ... En el Scipy doc, resulta que realmente existe un método de ajuste, pero no sé cómo úselo: s ... Primero, ¿en qué formato debe estar el argumento "data" y cómo puedo proporcionar el segundo argumento (los parámetros) ya que eso es lo que estoy buscando?Ajuste de una distribución gamma con (python) Scipy
Respuesta
generar algunos datos gamma:
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]
Aquí se ajusta a los datos de la distribución gamma:
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)
Si quieren un largo ejemplo incluyendo una discusión sobre la estimación o la fijación del soporte de la distribución, luego puede encontrarlo en https://github.com/scipy/scipy/issues/1359 y el mensaje de la lista de correo vinculada.
La compatibilidad preliminar para corregir parámetros, como la ubicación, durante el ajuste se ha agregado a la versión troncal de scipy.
No estaba satisfecho con la función ss.gamma.rvs ya que puede generar números negativos, algo que se supone que no tiene la distribución gamma. Así que ajusté la muestra a través del valor esperado = mean (data) y varianza = var (data) (ver wikipedia para más detalles) y escribí una función que puede producir muestras aleatorias de una distribución gamma sin scipy (que encontré difícil de instalar correctamente, en un 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): los "datos" variable podría estar en el formato de una lista de Python o tupla, o una numpy.ndarray, que se podría obtener mediante el uso de:
data=numpy.array(data)
donde los 2da datos en la línea antedicha deben ser una lista o una tupla, conteniendo sus datos.
2: la variable "parámetro" es una primera conjetura que podría proporcionar opcionalmente a la función de adaptación como punto de partida para el proceso de adaptación, por lo que podría omitirse.
3: una nota sobre la respuesta de @mondano. El uso de momentos (media y varianzas) para calcular los parámetros de gamma son razonablemente buenos para parámetros de forma grandes (alfa> 10), pero pueden dar resultados pobres para valores pequeños de alfa (Ver Métodos estadísticos en las scineces atmosféricas de Wilks , y THOM, HCS, 1958: Una nota sobre la distribución gamma.Mon. Wea. Rev., 86, 117-122.
El uso de Estimadores de máxima verosimilitud, como el implementado en el módulo scipy, se considera una mejor opción .!? en tales casos
- 1. Ajuste de una distribución pareto con (python) Scipy
- 2. Ajuste estacional en Python y Scipy
- 3. función gamma incompleta en python?
- 4. distribución normal oblicua en scipy
- 5. Pruebas de bondad de ajuste en SciPy
- 6. Ajuste de curva de 6 ° grado con numpy/scipy
- 7. Distribuciones de montaje, bondad de ajuste, valor de p. ¿Es posible hacer esto con Scipy (Python)?
- 8. Ajuste de una distribución bimodal a un conjunto de valores
- 9. Ajuste de una distribución Weibull de 3 parámetros en R
- 10. Ajuste de una distribución de poisson inflada cero en R
- 11. ajuste de curva con python
- 12. Python/Numpy/Scipy - Conversión de cadena a función matemática
- 13. agrupando datos en python con scipy/numpy
- 14. Ajuste de datos al sistema de ODE utilizando Python a través de Scipy & Numpy
- 15. Interpolación de Python/Scipy (map_coordinates)
- 16. scipy, lognormal distribution - parameters
- 17. cuándo utilizar una distribución alternativa de Python?
- 18. add2virtualenv (envoltorio virtualenv) no funciona con scipy
- 19. Prueba de Kolmogorov-Smirnov de dos muestras en Python Scipy
- 20. python: trazado de un histograma con una línea de función en la parte superior
- 21. Distribución exponencial en Python
- 22. ANCOVA en Python con estadísticas de Scipy/Numpy
- 23. Filtro Matlab() con SciPy lfilter()
- 24. ¿Generar un gráfico con cierta distribución de grados?
- 25. ¿Pueden algunos explicar este extraño comportamiento de la distribución hipergeométrica en scipy?
- 26. Cómo calcular la distribución normal acumulativa en Python
- 27. Python (NumPy, SciPy), encontrar el espacio nulo de una matriz
- 28. enfoque vectorizada a binning con numpy/scipy en Python
- 29. python pylab plot distribución normal
- 30. NSColor, 10.6 y Gamma 2,2
Gracias mucho, pero ¿por qué se crea la variable x en el principio – Archanimus
Ah, parece que mi mensaje es demasiado tarde Gracias gracias de nuevo;). – Archanimus
scipy.stats utiliza máxima likelih una buena estimación para el ajuste, por lo que debe pasar los datos brutos y no el pdf/pmf (x, y) – ianalis