PyMC (anciennement PyMC3) est un package Python pour la modélisation statistique bayésienne axé sur les algorithmes avancés de Monte Carlo à chaîne de Markov (MCMC) et d'inférence variationnelle (VI). Sa flexibilité et son extensibilité le rendent applicable à un large éventail de problèmes.
Consultez la présentation de PyMC ou l’un des nombreux exemples ! Pour toute question sur PyMC, rendez-vous sur notre forum PyMC Discourse.
x ~ N(0,1)
se traduit par x = Normal('x',0,1)
La croissance des plantes peut être influencée par de multiples facteurs, et comprendre ces relations est crucial pour optimiser les pratiques agricoles.
Imaginons que nous menions une expérience pour prédire la croissance d’une plante en fonction de différentes variables environnementales.
import pymc as pm
# Taking draws from a normal distribution
seed = 42
x_dist = pm . Normal . dist ( shape = ( 100 , 3 ))
x_data = pm . draw ( x_dist , random_seed = seed )
# Independent Variables:
# Sunlight Hours: Number of hours the plant is exposed to sunlight daily.
# Water Amount: Daily water amount given to the plant (in milliliters).
# Soil Nitrogen Content: Percentage of nitrogen content in the soil.
# Dependent Variable:
# Plant Growth (y): Measured as the increase in plant height (in centimeters) over a certain period.
# Define coordinate values for all dimensions of the data
coords = {
"trial" : range ( 100 ),
"features" : [ "sunlight hours" , "water amount" , "soil nitrogen" ],
}
# Define generative model
with pm . Model ( coords = coords ) as generative_model :
x = pm . Data ( "x" , x_data , dims = [ "trial" , "features" ])
# Model parameters
betas = pm . Normal ( "betas" , dims = "features" )
sigma = pm . HalfNormal ( "sigma" )
# Linear model
mu = x @ betas
# Likelihood
# Assuming we measure deviation of each plant from baseline
plant_growth = pm . Normal ( "plant growth" , mu , sigma , dims = "trial" )
# Generating data from model by fixing parameters
fixed_parameters = {
"betas" : [ 5 , 20 , 2 ],
"sigma" : 0.5 ,
}
with pm . do ( generative_model , fixed_parameters ) as synthetic_model :
idata = pm . sample_prior_predictive ( random_seed = seed ) # Sample from prior predictive distribution.
synthetic_y = idata . prior [ "plant growth" ]. sel ( draw = 0 , chain = 0 )
# Infer parameters conditioned on observed data
with pm . observe ( generative_model , { "plant growth" : synthetic_y }) as inference_model :
idata = pm . sample ( random_seed = seed )
summary = pm . stats . summary ( idata , var_names = [ "betas" , "sigma" ])
print ( summary )
Du résumé, nous pouvons voir que la moyenne des paramètres déduits est très proche des paramètres fixes
Paramètres | signifier | SD | hdi_3% | hdi_97% | mcse_mean | mcse_sd | ess_bulk | ess_tail | r_chapeau |
---|---|---|---|---|---|---|---|---|---|
bêtas [heures d'ensoleillement] | 4.972 | 0,054 | 4.866 | 5.066 | 0,001 | 0,001 | 3003 | 1257 | 1 |
bêtas[quantité d'eau] | 19.963 | 0,051 | 19.872 | 20.062 | 0,001 | 0,001 | 3112 | 1658 | 1 |
bêtas [azote du sol] | 1.994 | 0,055 | 1.899 | 2.107 | 0,001 | 0,001 | 3221 | 1559 | 1 |
sigma | 0,511 | 0,037 | 0,438 | 0,575 | 0,001 | 0 | 2945 | 1522 | 1 |
# Simulate new data conditioned on inferred parameters
new_x_data = pm . draw (
pm . Normal . dist ( shape = ( 3 , 3 )),
random_seed = seed ,
)
new_coords = coords | { "trial" : [ 0 , 1 , 2 ]}
with inference_model :
pm . set_data ({ "x" : new_x_data }, coords = new_coords )
pm . sample_posterior_predictive (
idata ,
predictions = True ,
extend_inferencedata = True ,
random_seed = seed ,
)
pm . stats . summary ( idata . predictions , kind = "stats" )
Les nouvelles données conditionnées aux paramètres déduits ressembleraient à :
Sortir | signifier | SD | hdi_3% | hdi_97% |
---|---|---|---|---|
croissance des plantes[0] | 14.229 | 0,515 | 13.325 | 15.272 |
croissance des plantes[1] | 24.418 | 0,511 | 23.428 | 25.326 |
croissance des plantes[2] | -6.747 | 0,511 | -7.740 | -5.797 |
# Simulate new data, under a scenario where the first beta is zero
with pm . do (
inference_model ,
{ inference_model [ "betas" ]: inference_model [ "betas" ] * [ 0 , 1 , 1 ]},
) as plant_growth_model :
new_predictions = pm . sample_posterior_predictive (
idata ,
predictions = True ,
random_seed = seed ,
)
pm . stats . summary ( new_predictions , kind = "stats" )
Les nouvelles données, dans le scénario ci-dessus, ressembleraient à :
Sortir | signifier | SD | hdi_3% | hdi_97% |
---|---|---|---|---|
croissance des plantes[0] | 12.149 | 0,515 | 11.193 | 13.135 |
croissance des plantes[1] | 29.809 | 0,508 | 28.832 | 30.717 |
croissance des plantes[2] | -0,131 | 0,507 | -1.121 | 0,791 |
Pour installer PyMC sur votre système, suivez les instructions du guide d'installation.
Veuillez choisir parmi les éléments suivants :
Nous utilisons discourse.pymc.io comme principal canal de communication.
Pour poser une question concernant la modélisation ou l'utilisation de PyMC, nous vous encourageons à la publier sur notre forum Discourse dans la catégorie « Questions ». Vous pouvez également suggérer une fonctionnalité dans la catégorie « Développement ».
Vous pouvez également nous suivre sur ces plateformes de réseaux sociaux pour des mises à jour et d'autres annonces :
Pour signaler un problème avec PyMC, veuillez utiliser le suivi des problèmes.
Enfin, si vous avez besoin de nous contacter pour obtenir des informations non techniques sur le projet, envoyez-nous un e-mail.
Licence Apache, version 2.0
Veuillez nous contacter si votre logiciel n'est pas répertorié ici.
Voir Google Scholar ici et ici pour une liste continuellement mise à jour.
Consultez la page des contributeurs GitHub. Lisez également nos lignes directrices du code de conduite pour une meilleure expérience de contribution.
PyMC est un projet à but non lucratif sous l'égide de NumFOCUS. Si vous souhaitez soutenir financièrement PyMC, vous pouvez faire un don ici.
Vous pouvez bénéficier d’une assistance consultative professionnelle auprès de PyMC Labs.