2010-05-24 28 views
16

Quelqu'un peut-il m'aider à ajuster une distribution gamma en python? Eh bien, j'ai quelques données: coordonnées X et Y, et je veux trouver les paramètres gamma qui correspondent à cette distribution ... Dans le Scipy doc, il s'avère qu'une méthode d'ajustement existe réellement, mais je ne sais pas comment use it: s .. D'abord, dans quel format doit se trouver l'argument "data", et comment puis-je fournir le second argument (les paramètres) puisque c'est ce que je recherche?Ajuster une distribution gamma avec (python) Scipy

Répondre

37

générer des données 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] 

nous adaptent ici les données à la distribution 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) 
+0

Merci beaucoup Mais pourquoi avez-vous créé la variable x au début – Archanimus

+0

Ah, il semble que mon message est trop tard Merci beaucoup encore une fois,.) – Archanimus

+5

scipy.stats utilise likelih maximale estimation d'ood pour l'ajustement ainsi vous devez passer les données brutes et pas pdf/pmf (x, y) – ianalis

1

Si vous voulez un long exemple, y compris une discussion sur l'estimation ou la fixation du support de la distribution, alors vous pouvez le trouver dans https://github.com/scipy/scipy/issues/1359 et le message de la liste de diffusion liée.

La prise en charge préliminaire de la correction des paramètres, tels que l'emplacement, lors de l'ajustement a été ajoutée à la version de ligne réseau de scipy.

1

Je n'étais pas satisfait de la fonction ss.gamma.rvs car elle peut générer des nombres négatifs, ce que la distribution gamma est censée ne pas avoir. J'ai donc ajusté l'échantillon par la valeur attendue = mean (data) et variance = var (data) (voir wikipedia pour les détails) et écrit une fonction qui peut fournir des échantillons aléatoires d'une distribution gamma sans scipy (que j'ai trouvé difficile à installer correctement, sur 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] 
0

1): la variable "données" pourrait être sous la forme d'une liste de python ou tuple, ou un numpy.ndarray, ce qui pourrait être obtenu en utilisant:

data=numpy.array(data) 

où la 2ème donnée dans la ligne ci-dessus devrait être une liste ou un tuple, contenant vos données. 2: la variable "paramètre" est une première estimation que vous pouvez éventuellement fournir à la fonction d'ajustement comme point de départ pour le processus d'ajustement, de sorte qu'elle peut être omise.

3: une note sur la réponse de @ mondano. L'utilisation des moments (moyenne et variances) pour calculer les paramètres gamma est raisonnablement bonne pour les grands paramètres de forme (alpha> 10), mais pourrait donner des résultats médiocres pour les faibles valeurs alpha (voir Méthodes statistiques dans les scineces atmosphériques by Wilks , et THOM, HCS, 1958: Une note sur la distribution gamma Mon. Wea Rev., 86, 117-122

L'utilisation d'estimateurs de vraisemblance maximale, comme celle implémentée dans le module scipy, est considérée comme un meilleur choix .! dans ce cas