PyMC (anteriormente PyMC3) é um pacote Python para modelagem estatística bayesiana com foco em algoritmos avançados de cadeia de Markov Monte Carlo (MCMC) e inferência variacional (VI). Sua flexibilidade e extensibilidade o tornam aplicável a um grande conjunto de problemas.
Confira a visão geral do PyMC ou um dos muitos exemplos! Para perguntas sobre o PyMC, acesse nosso fórum de discurso do PyMC.
x ~ N(0,1)
se traduz em x = Normal('x',0,1)
O crescimento das plantas pode ser influenciado por múltiplos factores, e a compreensão destas relações é crucial para optimizar as práticas agrícolas.
Imagine que conduzimos um experimento para prever o crescimento de uma planta com base em diferentes variáveis ambientais.
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 )
Pelo resumo, podemos perceber que a média dos parâmetros inferidos está muito próxima dos parâmetros fixos
Parâmetros | significar | SD | hdi_3% | hdi_97% | mcse_mean | mcse_sd | ess_bulk | esse_tail | r_hat |
---|---|---|---|---|---|---|---|---|---|
betas[horas de luz solar] | 4.972 | 0,054 | 4.866 | 5.066 | 0,001 | 0,001 | 3003 | 1257 | 1 |
betas[quantidade de água] | 19.963 | 0,051 | 19.872 | 20.062 | 0,001 | 0,001 | 3112 | 1658 | 1 |
betas[nitrogênio do solo] | 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" )
Os novos dados condicionados aos parâmetros inferidos seriam assim:
Saída | significar | SD | hdi_3% | hdi_97% |
---|---|---|---|---|
crescimento das plantas[0] | 14.229 | 0,515 | 13.325 | 15.272 |
crescimento das plantas[1] | 24.418 | 0,511 | 23.428 | 25.326 |
crescimento das 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" )
Os novos dados, no cenário acima, seriam assim:
Saída | significar | SD | hdi_3% | hdi_97% |
---|---|---|---|---|
crescimento das plantas[0] | 12.149 | 0,515 | 11.193 | 13.135 |
crescimento das plantas[1] | 29.809 | 0,508 | 28.832 | 30.717 |
crescimento das plantas[2] | -0,131 | 0,507 | -1.121 | 0,791 |
Para instalar o PyMC em seu sistema, siga as instruções do guia de instalação.
Escolha entre os seguintes:
Estamos usando discurso.pymc.io como nosso principal canal de comunicação.
Para fazer perguntas sobre modelagem ou uso do PyMC, encorajamos a postagem em nosso fórum do Discourse na categoria “Perguntas”. Você também pode sugerir recurso na categoria “Desenvolvimento”.
Você também pode nos seguir nestas plataformas de mídia social para atualizações e outros anúncios:
Para relatar um problema com o PyMC, use o rastreador de problemas.
Por fim, caso necessite entrar em contato para obter informações não técnicas sobre o projeto, envie-nos um e-mail.
Licença Apache, versão 2.0
Entre em contato conosco se o seu software não estiver listado aqui.
Consulte o Google Scholar aqui e aqui para obter uma lista continuamente atualizada.
Consulte a página do contribuidor do GitHub. Leia também nossas diretrizes do Código de Conduta para uma melhor experiência de contribuição.
PyMC é um projeto sem fins lucrativos sob a égide do NumFOCUS. Se quiser apoiar financeiramente o PyMC, você pode doar aqui.
Você pode obter suporte de consultoria profissional do PyMC Labs.