Générer des nombres aléatoires à partir d'une distribution gamma avec Python peut être fait par plusieurs méthodes :
En utilisant numpy.random.gamma()
La façon la plus populaire est d'utiliser la bibliothèque NumPy et sa fonction intégrée, numpy.random.gamma(). Cette fonction prend deux paramètres - shape et scale - qui sont utilisés pour définir la forme de la distribution Gamma qui sera générée. De plus, vous pouvez également définir un paramètre size pour générer plusieurs nombres aléatoires à la fois.
import numpy as np
shape = 3.0
scale = 1.0
nb_random_points = 10000
data = np.random.gamma(shape, scale, nb_random_points)
donne
array([3.14118269, 5.10012155, 1.90110229, ..., 1.66629833, 0.51727531,
0.37046791])
import matplotlib.pyplot as plt
import numpy as np
plt.hist(data, 100, density=True)
plt.title('How to generate random numbers \n from a gamma distribution with python ?')
plt.savefig("gamma_distribution_random_numbers_01.png", bbox_inches='tight',dpi=200, facecolor='white')
plt.show()
Simuler une distribution Gamma en utilisant le module stats de scipy
Alternativement, vous pouvez simuler une distribution Gamma avec Python en utilisant le module stats de scipy et sa méthode appelée gamma(). Cette méthode accepte trois paramètres - forme, échelle et taille - et fonctionne de manière similaire à la méthode numpy mentionnée précédemment.
import matplotlib.pyplot as plt
import numpy as np
import scipy.special as sps
plt.hist(data, 100, density=True)
X = np.linspace(0,16,100)
PDF = ( 1.0 / ( sps.gamma(shape) * scale**shape) ) * X**(shape-1) * np.exp(-X/scale)
plt.plot(X,PDF)
plt.title('How to generate random numbers \n from a gamma distribution with python ?')
plt.savefig("gamma_distribution_random_numbers_02.png", bbox_inches='tight',dpi=200, facecolor='white')
plt.show()
Générer des nombres aléatoires en utilisant la fonction de distribution cumulative.
Pour calculer la fonction de distribution cumulative (CDF) d'une fonction gamma, une solution consiste à utiliser scipy stats :
from scipy.stats import gamma
plt.hist(data, 100, density=True)
X = np.linspace(0,16,1000)
CDF = gamma.cdf(X, shape, 0, scale)
plt.plot(X,CDF)
plt.title('How to generate random numbers \n from a gamma distribution with python ?')
plt.xlim(0,16)
plt.savefig("gamma_distribution_random_numbers_03.png", bbox_inches='tight',dpi=200, facecolor='white')
plt.show()
Générer des nombres aléatoires à l'aide de la fonction de distribution cumulative (CDF) consiste à attribuer une probabilité à chaque résultat, puis à utiliser la CDF pour déterminer quelle valeur est choisie. Pour générer un tel nombre, un utilisateur doit d'abord définir la probabilité de chaque résultat, généralement sous la forme d'une plage de 0 à 1 :
from scipy.optimize import minimize
x = np.random.random_sample((10000,))
y = np.zeros(x.shape)
def diff(x,a):
yt = gamma.cdf(x, shape, 0, scale)
return (yt - a )**2
for idx,x_value in enumerate(x):
res = minimize(diff, 2, args=(x_value), method='Nelder-Mead', tol=1e-6)
y[idx] = res.x[0]
Maintenant, créons un histogramme de nombres aléatoires en utilisant matplotlib :
plt.hist(y, 100, density=True)
X = np.linspace(0,16,1000)
X = np.linspace(0,16,100)
PDF = ( 1.0 / ( sps.gamma(shape) * scale**shape) ) * X**(shape-1) * np.exp(-X/scale)
plt.plot(X,PDF)
plt.savefig("gamma_distribution_random_numbers_04.png", bbox_inches='tight',dpi=200, facecolor='white')
plt.show()
Références
Liens | Site |
---|---|
Random Generator | numpy.org |
Gamma distribution | wikipedia |
numpy.random.gamma | numpy.org |
scipy.special.gammainc | docs.scipy.org |
How to numerically compute the inverse function in python using scipy ? | moonbooks.org |
cipy.stats.gamma | docs.scipy.org |