python - guia - Ajuste de puntos de datos a una distribución acumulativa
qgis manual (1)
Estoy tratando de adaptar una distribución gamma a mis puntos de datos, y puedo hacerlo utilizando el código que se encuentra a continuación.
import scipy.stats as ss
import numpy as np
dataPoints = np.arange(0,1000,0.2)
fit_alpha,fit_loc,fit_beta = ss.rv_continuous.fit(ss.gamma, dataPoints, floc=0)
Quiero reconstruir una distribución más grande utilizando muchas de estas distribuciones gamma pequeñas (la distribución más grande es irrelevante para la pregunta, solo justificando por qué estoy tratando de ajustar un PDF en lugar de un PDF).
Para lograrlo, quiero adaptar una distribución acumulativa, en lugar de un pdf, a mis datos de distribución más pequeños. —Más precisamente, quiero ajustar los datos a solo una parte de la distribución acumulativa .
Por ejemplo, quiero ajustar los datos solo hasta que la función de probabilidad acumulada (con una cierta escala y forma) alcance 0.6.
¿Alguna idea sobre el uso de fit()
para este propósito?
Entiendo que está intentando reconstruir por partes su cdf con varias distribuciones gamma pequeñas, cada una con un parámetro de escala y forma diferente que captura las regiones "locales" de su distribución.
Probablemente tenga sentido si su distribución empírica es multimodal / difícil de resumir en una distribución paramétrica "global".
No sé si tiene razones específicas para ajustar específicamente varias distribuciones gamma, pero en caso de que su objetivo sea tratar de ajustar una distribución que sea relativamente suave y que capture bien su cdf empírico, quizás pueda echar un vistazo a la Estimación de la densidad del núcleo. Esencialmente es una forma no paramétrica de ajustar una distribución a sus datos.
http://scikit-learn.org/stable/modules/density.html http://en.wikipedia.org/wiki/Kernel_density_estimation
Por ejemplo, puede probar un kernel gaussiano y cambiar el parámetro de ancho de banda para controlar qué tan suave es su ajuste. Un ancho de banda demasiado pequeño conduce a un resultado no suave ("sobre ajustado") [alta varianza, bajo sesgo]. Un ancho de banda que es demasiado grande da como resultado un resultado muy suave pero con un alto sesgo.
from sklearn.neighbors.kde import KernelDensity
kde = KernelDensity(kernel=''gaussian'', bandwidth=0.2).fit(dataPoints)
Una buena manera de seleccionar un parámetro de ancho de banda que equilibre el sesgo - la compensación de la varianza es utilizar la validación cruzada. Esencialmente, la idea de alto nivel es dividir sus datos, ejecutar análisis en el conjunto de entrenamiento y ''validar'' en el conjunto de prueba, esto evitará que se adapte a los datos.
Afortunadamente, sklearn también implementa un buen ejemplo de cómo elegir el mejor ancho de banda de un kernel de Guassian mediante Validación cruzada, del cual puede tomar prestado algo de código de:
http://scikit-learn.org/stable/auto_examples/neighbors/plot_digits_kde_sampling.html
¡Espero que esto ayude!