2016-09-05 3 views
1

Est-ce que quelqu'un pourrait m'expliquer comment utiliser le paramètre location avec la fonction gamma.fit dans Scipy?paramètre d'emplacement d'ajustement dans la distribution gamma avec scipy

Il me semble qu'un paramètre de localisation (μ) modifie le support de la distribution de x ≥ 0 à y = (x - μ) ≥ 0. Si μ est positif ne sont pas nous alors en train de perdre toutes les données qui ne satisfait pas x - μ ≥ 0?

Merci!

+0

essayer. La distribution sera décalée en fonction du paramètre loc sans perdre de données. –

Répondre

3

La fonction fit tient compte de toutes les données pour trouver un ajustement. L'ajout de bruit à vos données modifiera les paramètres d'ajustement et peut donner une distribution qui ne représente pas très bien les données. Nous devons donc être un peu malin lorsque nous utilisons fit. Ci-dessous figure un code qui génère des données, y1, avec loc=2 et scale=1 en utilisant numpy.

Il ajoute également du bruit aux données sur la plage de 0 à 10 pour créer y2. Le montage y1 donne d'excellents résultats, mais tenter d'adapter le bruit y2 est problématique. Le bruit que nous avons ajouté étale la distribution. Cependant, nous pouvons également maintenir un ou plusieurs paramètres constants lors de l'ajustement des données. Dans ce cas, nous passons floc=2 au fit, ce qui force l'emplacement à être maintenu à 2 lors de l'ajustement, ce qui donne de meilleurs résultats.

from scipy.stats import gamma 
import numpy as np 
import matplotlib.pyplot as plt 

x = np.arange(0,10,.1) 
y1 = np.random.gamma(shape=1, scale=1, size=1000) + 2 # sets loc = 2 
y2 = np.hstack((y1, 10*np.random.rand(100))) # add noise from 0 to 10 

# fit the distributions, get the PDF distribution using the parameters 
shape1, loc1, scale1 = gamma.fit(y1) 
g1 = gamma.pdf(x=x, a=shape1, loc=loc1, scale=scale1) 

shape2, loc2, scale2 = gamma.fit(y2) 
g2 = gamma.pdf(x=x, a=shape2, loc=loc2, scale=scale2) 

# again fit the distribution, but force loc=2 
shape3, loc3, scale3 = gamma.fit(y2, floc=2) 
g3 = gamma.pdf(x=x, a=shape3, loc=loc3, scale=scale3) 

Et faire quelques parcelles ...

# plot the distributions and fits. to lazy to do iteration today 
fig, axes = plt.subplots(1, 3, figsize=(13,4)) 
ax = axes[0] 
ax.hist(y1, bins=40, normed=True); 
ax.plot(x, g1, 'r-', linewidth=6, alpha=.6) 
ax.annotate(s='shape = %.3f\nloc = %.3f\nscale = %.3f' %(shape1, loc1, scale1), xy=(6,.2)) 
ax.set_title('gamma fit') 

ax = axes[1] 
ax.hist(y2, bins=40, normed=True); 
ax.plot(x, g2, 'r-', linewidth=6, alpha=.6) 
ax.annotate(s='shape = %.3f\nloc = %.3f\nscale = %.3f' %(shape2, loc2, scale2), xy=(6,.2)) 
ax.set_title('gamma fit with noise') 

ax = axes[2] 
ax.hist(y2, bins=40, normed=True); 
ax.plot(x, g3, 'r-', linewidth=6, alpha=.6) 
ax.annotate(s='shape = %.3f\nloc = %.3f\nscale = %.3f' %(shape3, loc3, scale3), xy=(6,.2)) 
ax.set_title('gamma fit w/ noise, location forced') 

enter image description here

+0

Merci pour la réponse James, après quelques expérimentations plus votre solution, je pense que je comprends maintenant. Superbes parcelles aussi. – emac