PyMC (ранее PyMC3) — это пакет Python для байесовского статистического моделирования, ориентированный на усовершенствованные алгоритмы Монте-Карло для цепей Маркова (MCMC) и алгоритмы вариационного вывода (VI). Его гибкость и расширяемость делают его применимым для решения большого набора задач.
Ознакомьтесь с обзором PyMC или одним из многих примеров! Если у вас есть вопросы о PyMC, посетите наш дискуссионный форум PyMC.
x ~ N(0,1)
преобразуется в x = Normal('x',0,1)
На рост растений могут влиять множество факторов, и понимание этих взаимосвязей имеет решающее значение для оптимизации методов ведения сельского хозяйства.
Представьте, что мы проводим эксперимент, чтобы предсказать рост растения на основе различных переменных окружающей среды.
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 )
Из сводки мы видим, что средние значения выведенных параметров очень близки к фиксированным параметрам.
Параметры | иметь в виду | SD | hdi_3% | hdi_97% | mcse_mean | mcse_sd | ess_bulk | ess_tail | р_шапка |
---|---|---|---|---|---|---|---|---|---|
бета[часы солнечного света] | 4,972 | 0,054 | 4,866 | 5.066 | 0,001 | 0,001 | 3003 | 1257 | 1 |
бета[количество воды] | 19.963 | 0,051 | 19,872 | 20.062 | 0,001 | 0,001 | 3112 | 1658 г. | 1 |
бетас [почвенный азот] | 1.994 | 0,055 | 1,899 | 2.107 | 0,001 | 0,001 | 3221 | 1559 г. | 1 |
сигма | 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" )
Новые данные, обусловленные выведенными параметрами, будут выглядеть так:
Выход | иметь в виду | SD | hdi_3% | hdi_97% |
---|---|---|---|---|
рост растений[0] | 14.229 | 0,515 | 13.325 | 15.272 |
рост растений[1] | 24.418 | 0,511 | 23.428 | 25.326 |
рост растений[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" )
Новые данные в приведенном выше сценарии будут выглядеть так:
Выход | иметь в виду | SD | hdi_3% | hdi_97% |
---|---|---|---|---|
рост растений[0] | 12.149 | 0,515 | 11.193 | 13.135 |
рост растений[1] | 29.809 | 0,508 | 28.832 | 30,717 |
рост растений[2] | -0,131 | 0,507 | -1,121 | 0,791 |
Чтобы установить PyMC в вашей системе, следуйте инструкциям в руководстве по установке.
Пожалуйста, выберите из следующего:
Мы используем discourse.pymc.io в качестве основного канала связи.
Чтобы задать вопрос относительно моделирования или использования PyMC, мы рекомендуем задать его на нашем дискуссионном форуме в категории «Вопросы». Вы также можете предложить функцию в категории «Разработка».
Вы также можете следить за нами в этих социальных сетях, чтобы получать обновления и другие объявления:
Чтобы сообщить о проблеме с PyMC, воспользуйтесь системой отслеживания проблем.
Наконец, если вам нужно связаться для получения нетехнической информации о проекте, отправьте нам электронное письмо.
Лицензия Apache, версия 2.0
Пожалуйста, свяжитесь с нами, если вашего программного обеспечения нет в списке.
См. Google Scholar здесь и здесь для постоянно обновляемого списка.
См. страницу участников GitHub. Также ознакомьтесь с нашими рекомендациями по Кодексу поведения, чтобы вам было удобнее вносить свой вклад.
PyMC — это некоммерческий проект под эгидой NumFOCUS. Если вы хотите поддержать PyMC финансово, вы можете сделать пожертвование здесь.
Вы можете получить профессиональную консультационную поддержку от PyMC Labs.