PyMC (anteriormente PyMC3) es un paquete de Python para modelado estadístico bayesiano que se centra en algoritmos avanzados de cadena de Markov Monte Carlo (MCMC) y de inferencia variacional (VI). Su flexibilidad y extensibilidad lo hacen aplicable a un gran conjunto de problemas.
¡Consulte la descripción general de PyMC o uno de los muchos ejemplos! Si tiene preguntas sobre PyMC, diríjase a nuestro foro PyMC Discourse.
x ~ N(0,1)
se traduce en x = Normal('x',0,1)
El crecimiento de las plantas puede verse influenciado por múltiples factores, y comprender estas relaciones es crucial para optimizar las prácticas agrícolas.
Imaginemos que realizamos un experimento para predecir el crecimiento de una planta en función de diferentes variables ambientales.
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 )
Del resumen, podemos ver que la media de los parámetros inferidos está muy cerca de los parámetros fijos.
parámetros | significar | Dakota del Sur | hdi_3% | hdi_97% | mcse_mean | mcse_sd | ess_bulk | cola_ess | r_sombrero |
---|---|---|---|---|---|---|---|---|---|
betas [horas de luz solar] | 4.972 | 0.054 | 4.866 | 5.066 | 0.001 | 0.001 | 3003 | 1257 | 1 |
betas[cantidad de agua] | 19.963 | 0.051 | 19.872 | 20.062 | 0.001 | 0.001 | 3112 | 1658 | 1 |
betas [nitrógeno del suelo] | 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" )
Los nuevos datos condicionados a parámetros inferidos tendrían el siguiente aspecto:
Producción | significar | Dakota del Sur | hdi_3% | hdi_97% |
---|---|---|---|---|
crecimiento de las plantas[0] | 14.229 | 0.515 | 13.325 | 15.272 |
crecimiento de las plantas[1] | 24.418 | 0.511 | 23.428 | 25.326 |
crecimiento de las plantas[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" )
Los nuevos datos, según el escenario anterior, se verían así:
Producción | significar | Dakota del Sur | hdi_3% | hdi_97% |
---|---|---|---|---|
crecimiento de las plantas[0] | 12.149 | 0.515 | 11.193 | 13.135 |
crecimiento de las plantas[1] | 29.809 | 0.508 | 28.832 | 30.717 |
crecimiento de las plantas[2] | -0,131 | 0.507 | -1.121 | 0,791 |
Para instalar PyMC en su sistema, siga las instrucciones de la guía de instalación.
Por favor elija entre lo siguiente:
Estamos utilizando discurso.pymc.io como nuestro principal canal de comunicación.
Para hacer una pregunta sobre el modelado o el uso de PyMC, le recomendamos que la publique en nuestro foro de Discurso en la categoría "Preguntas". También puede sugerir una función en la categoría "Desarrollo".
También puede seguirnos en estas plataformas de redes sociales para obtener actualizaciones y otros anuncios:
Para informar un problema con PyMC, utilice el rastreador de problemas.
Finalmente, si necesitas ponerte en contacto para información no técnica sobre el proyecto, envíanos un correo electrónico.
Licencia Apache, Versión 2.0
Por favor contáctenos si su software no aparece aquí.
Consulte Google Scholar aquí y aquí para obtener una lista actualizada continuamente.
Consulte la página del colaborador de GitHub. Lea también nuestras pautas del Código de conducta para una mejor experiencia de contribución.
PyMC es un proyecto sin fines de lucro bajo el paraguas de NumFOCUS. Si quieres apoyar económicamente a PyMC, puedes donar aquí.
Puede obtener soporte de consultoría profesional de PyMC Labs.