跳转到主要内容

Python中的概率编程:使用PyTensor进行贝叶斯建模和概率机器学习

项目描述

PyMC logo

Build Status Coverage NumFOCUS_badge Binder Dockerhub DOIzenodo Conda Downloads

PyMC(以前称为PyMC3)是一个Python包,专注于贝叶斯统计建模,侧重于高级马尔可夫链蒙特卡洛(MCMC)和变分推断(VI)算法。其灵活性和可扩展性使其适用于大量问题。

查看PyMC 概览,或者众多示例之一!关于 PyMC 的问题,请访问我们的PyMC 讨论区论坛。

特点

  • 直观的模型指定语法,例如,x ~ N(0,1) 翻译为 x = Normal('x',0,1)

  • 强大的采样算法,如无回转采样器,允许具有成千上万个参数的复杂模型,而无需对拟合算法有太多的专业知识。

  • 变分推理:用于快速近似后验估计的ADVI,以及用于大型数据集的 mini-batch ADVI。

  • 依赖于PyTensor,它提供
    • 计算优化和动态 C 或 JAX 编译

    • NumPy 广播和高级索引

    • 线性代数运算符

    • 简单扩展性

  • 支持缺失值插补

线性回归示例

植物生长可以受多种因素影响,了解这些关系对于优化农业实践至关重要。

假设我们进行一项实验,基于不同的环境变量来预测植物的生长。

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 一起学习贝叶斯统计

音频和视频

  • 这里是一个YouTube 播放列表,收集了关于 PyMC 的多个讲座。

  • 您也可以在这里找到在PyMCon 2020上发表的所有演讲。

  • “学习贝叶斯统计”播客帮助您发现并保持对庞大的贝叶斯社区的最新了解。额外福利:它由 PyMC 核心开发者之一 Alex Andorra 主持!

安装

要安装 PyMC 到您的系统,请按照安装指南中的说明进行。

引用 PyMC

请从以下选择

  • DOIpaper 《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)

  • DOIzenodo 所有版本的DOI。

  • 特定版本的DOI显示在Zenodo和发布页面

联系方式

我们使用discourse.pymc.io作为我们的主要沟通渠道。

有关PyMC建模或使用的问题,请在我们Discourse论坛的“问题”类别下发布。您也可以在“开发”类别下建议功能。

您还可以关注这些社交媒体平台以获取更新和其他公告

要报告PyMC的问题,请使用问题跟踪器

最后,如果您需要获取有关项目的非技术信息,请发送电子邮件

许可证

Apache License,版本2.0

使用PyMC的软件

通用

  • Bambi:Python中的BAyesian Model-Building Interface(BAMBI)。

  • calibr8:用于在PyMC中作为似然使用的详细观测模型构建工具箱。

  • gumbi:构建GP模型的高级接口。

  • SunODE:快速ODE求解器,比PyMC自带的求解器快得多。

  • pymc-learn:基于pymc3_models/scikit-learn API构建的定制PyMC模型。

特定领域

  • Exoplanet:用于模拟系外行星和其他天文时间序列的凌星和/或径向速度观测的工具包。

  • beat:贝叶斯地震分析工具。

  • CausalPy:专注于准实验设置中的因果推断的包。

如果您的软件未在此列出,请与我们联系。

引用PyMC的论文

请参阅Google Scholar 此处此处 以获取持续更新的列表。

贡献者

请参阅GitHub贡献者页面。阅读我们的行为准则,以获得更好的贡献体验。

支持

PyMC是NumFOCUS旗下的一项非营利项目。如果您想从财务上支持PyMC,您可以在此捐赠。

专业咨询服务

您可以从PyMC Labs获得专业咨询服务。

赞助商

NumFOCUS

PyMCLabs

Mistplay

ODSC

感谢我们的贡献者

contributors

项目详情


发布历史 发布通知 | RSS源

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

pymc-5.17.0.tar.gz (468.5 kB 查看哈希值)

上传时间

构建分发

pymc-5.17.0-py3-none-any.whl (488.5 kB 查看哈希值)

上传时间 Python 3

由以下支持