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')
essayer. La distribution sera décalée en fonction du paramètre loc sans perdre de données. –