Python中的概率编程:使用PyTensor进行贝叶斯建模和概率机器学习
项目描述
PyMC(以前称为PyMC3)是一个Python包,专注于贝叶斯统计建模,侧重于高级马尔可夫链蒙特卡洛(MCMC)和变分推断(VI)算法。其灵活性和可扩展性使其适用于大量问题。
查看PyMC 概览,或者众多示例之一!关于 PyMC 的问题,请访问我们的PyMC 讨论区论坛。
特点
线性回归示例
植物生长可以受多种因素影响,了解这些关系对于优化农业实践至关重要。
假设我们进行一项实验,基于不同的环境变量来预测植物的生长。
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)
从摘要中我们可以看出,推断参数的均值非常接近固定参数
参数 |
均值 |
标准差 |
hdi_3% |
hdi_97% |
mcse_mean |
mcse_sd |
ess_bulk |
ess_tail |
r_hat |
---|---|---|---|---|---|---|---|---|---|
betas[阳光小时] |
4.972 |
0.054 |
4.866 |
5.066 |
0.001 |
0.001 |
3003 |
1257 |
1 |
betas[水量] |
19.963 |
0.051 |
19.872 |
20.062 |
0.001 |
0.001 |
3112 |
1658 |
1 |
betas[土壤氮含量] |
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")
基于推断参数的新数据看起来会是这样
输出 |
均值 |
标准差 |
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")
在上述情况下,新数据看起来会是这样
输出 |
均值 |
标准差 |
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 一起学习贝叶斯统计
贝叶斯分析用 Python(第三版)作者 Osvaldo Martin:优秀的入门书籍。
概率编程和黑客的贝叶斯方法:包含许多应用代码示例的精彩书籍。
Michael Lee 和 EJ Wagenmakers 的《贝叶斯认知建模》的 PyMC 端口:专注于在认知建模中使用贝叶斯统计。
音频和视频
这里是一个YouTube 播放列表,收集了关于 PyMC 的多个讲座。
您也可以在这里找到在PyMCon 2020上发表的所有演讲。
“学习贝叶斯统计”播客帮助您发现并保持对庞大的贝叶斯社区的最新了解。额外福利:它由 PyMC 核心开发者之一 Alex Andorra 主持!
安装
要安装 PyMC 到您的系统,请按照安装指南中的说明进行。
引用 PyMC
请从以下选择
《PyMC:Python中的现代和全面的概率编程框架》,Abril-Pla O,Andreani V,Carroll C,Dong L,Fonnesbeck CJ,Kochurov M,Kumar R,Lao J,Luhmann CC,Martin OA,Osthege M,Vieira R,Wiecki T,Zinkov R.(2023)
特定版本的DOI显示在Zenodo和发布页面
联系方式
我们使用discourse.pymc.io作为我们的主要沟通渠道。
有关PyMC建模或使用的问题,请在我们Discourse论坛的“问题”类别下发布。您也可以在“开发”类别下建议功能。
您还可以关注这些社交媒体平台以获取更新和其他公告
要报告PyMC的问题,请使用问题跟踪器。
最后,如果您需要获取有关项目的非技术信息,请发送电子邮件。
许可证
使用PyMC的软件
通用
Bambi:Python中的BAyesian Model-Building Interface(BAMBI)。
calibr8:用于在PyMC中作为似然使用的详细观测模型构建工具箱。
gumbi:构建GP模型的高级接口。
SunODE:快速ODE求解器,比PyMC自带的求解器快得多。
pymc-learn:基于pymc3_models/scikit-learn API构建的定制PyMC模型。
特定领域
如果您的软件未在此列出,请与我们联系。
引用PyMC的论文
贡献者
请参阅GitHub贡献者页面。阅读我们的行为准则,以获得更好的贡献体验。
支持
PyMC是NumFOCUS旗下的一项非营利项目。如果您想从财务上支持PyMC,您可以在此捐赠。
专业咨询服务
您可以从PyMC Labs获得专业咨询服务。
赞助商
感谢我们的贡献者
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
构建分发
pymc-5.17.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3b7810f770c7aeab3087e289fadc97252ad423f3aa3f42b5715648f13df2aab7 |
|
MD5 | 8b166fc5c384d75c3de3209bfcdb784f |
|
BLAKE2b-256 | e430da7b4f9d14035e153bd28bbdfb2b19ded7701e1e2f2a77cc38ea0527e0cd |
pymc-5.17.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1f6614589ab9095e79a98afb8bf173ea9810b4439591649e282708e3589c95e9 |
|
MD5 | 18f08c3f0b763bbef8d1a9c99f4dc448 |
|
BLAKE2b-256 | 8e7ecaaf95c63eda92bcc392d35716dbcd073dff58cec727790723d70e72240a |