pymc:基于 Python 的贝叶斯统计建模项目

Bayesian Modeling and Probabilistic Programming in Python

Branch14Tags134
This repository is empty

.. image:: https://cdn.rawgit.com/pymc-devs/pymc/main/docs/logos/svg/PyMC_banner.svg :height: 100px :alt: PyMC logo :align: center

|Build Status| |Coverage| |NumFOCUS_badge| |Binder| |Dockerhub| |DOIzenodo| |Conda Downloads|

PyMC(前身为 PyMC3)是一个用于贝叶斯统计建模的 Python 软件包,专注于高级马尔可夫链蒙特卡洛(MCMC)和变分推断(VI)算法。其灵活性和可扩展性使其适用于一系列广泛的问题。

查看 PyMC 概述,或众多 示例 中的一个!有关 PyMC 的问题,请前往我们的 PyMC Discourse 论坛。

特性

  • 直观的模型指定语法,例如,x ~ N(0,1) 可转换为 x = Normal('x',0,1)
  • 强大的采样算法,如 No U-Turn Sampler,允许拟合具有数千个参数的复杂模型,而无需具备大量关于拟合算法的专业知识。
  • 变分推断ADVI 用于快速近似后验估计,以及用于大型数据集的小批量 ADVI。
  • 依赖于 PyTensor,其提供:
    • 计算优化和动态 C 或 JAX 编译
    • NumPy 广播和高级索引
    • 线性代数运算符
    • 简单的可扩展性
  • 对缺失值插补的透明支持

线性回归示例

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

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

.. code-block:: python

import pymc as pm

从正态分布中抽取样本

seed = 42 x_dist = pm.Normal.dist(shape=(100, 3)) x_data = pm.draw(x_dist, random_seed=seed)

自变量:

日照时长:植物每日接受阳光照射的小时数。

浇水量:每日给植物的浇水量(以毫升为单位)。

土壤氮含量:土壤中氮含量的百分比。

因变量:

植物生长量(y):在特定时期内植物高度的增长量(以厘米为单位)。

为数据的所有维度定义坐标值

coords={ "trial": range(100), "features": ["sunlight hours", "water amount", "soil nitrogen"], }

定义生成模型

with pm.Model(coords=coords) as generative_model: x = pm.Data("x", x_data, dims=["trial", "features"])

# 模型参数
betas = pm.Normal("betas", dims="features")
sigma = pm.HalfNormal("sigma")

# 线性模型
mu = x @ betas

# 似然
# 假设我们测量的是每株植物与基准线的偏差
plant_growth = pm.Normal("plant growth", mu, sigma, dims="trial")

通过固定参数从模型生成数据

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) # 从先验预测分布中采样。 synthetic_y = idata.prior["plant growth"].sel(draw=0, chain=0)

根据观测数据推断参数

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)

从摘要中可以看出,推断参数的均值与固定参数非常接近

===================== ====== ===== ======== ========= =========== ========= ========== ========== ======= Params mean sd hdi_3% hdi_97% mcse_mean mcse_sd ess_bulk ess_tail r_hat ===================== ====== ===== ======== ========= =========== ========= ========== ========== ======= betas[sunlight hours] 4.972 0.054 4.866 5.066 0.001 0.001 3003 1257 1 betas[water amount] 19.963 0.051 19.872 20.062 0.001 0.001 3112 1658 1 betas[soil nitrogen] 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 ===================== ====== ===== ======== ========= =========== ========= ========== ========== =======

.. code-block:: python

基于推断参数模拟新数据

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")

基于推断参数得到的新数据如下:

================ ======== ======= ======== ========= Output mean sd hdi_3% hdi_97% ================ ======== ======= ======== ========= plant growth[0] 14.229 0.515 13.325 15.272 plant growth[1] 24.418 0.511 23.428 25.326 plant growth[2] -6.747 0.511 -7.740 -5.797 ================ ======== ======= ======== =========

.. code-block:: python

在第一个 beta 为零的场景下模拟新数据

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")

上述场景下的新数据如下:

================ ======== ======= ======== ========= Output mean sd hdi_3% hdi_97% ================ ======== ======= ======== ========= plant growth[0] 12.149 0.515 11.193 13.135 plant growth[1] 29.809 0.508 28.832 30.717 plant growth[2] -0.131 0.507 -1.121 0.791 ================ ======== ======= ======== =========

入门指南

如果您已了解贝叶斯统计:

通过书籍结合 PyMC 学习贝叶斯统计

另请参见我们网站上关于使用 PyMC 的书籍部分 https://www.pymc.io/projects/docs/en/stable/learn/books.html

音频与视频

安装

要在您的系统上安装 PyMC,请遵循安装指南 https://www.pymc.io/projects/docs/en/latest/installation.html 中的说明。

引用 PyMC

请从以下选项中选择:

  • |DOIpaper| PyMC: A Modern and Comprehensive Probabilistic Programming Framework in 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)

    • BibTex 格式

      .. code:: bibtex

      @article{pymc2023, title = {{PyMC}: A Modern and Comprehensive Probabilistic Programming Framework in {P}ython}, author = {Oriol Abril-Pla and Virgile Andreani and Colin Carroll and Larry Dong and Christopher J. Fonnesbeck and Maxim Kochurov and Ravin Kumar and Junpeng Lao and Christian C. Luhmann and Osvaldo A. Martin and Michael Osthege and Ricardo Vieira and Thomas Wiecki and Robert Zinkov }, journal = {{PeerJ} Computer Science}, volume = {9}, number = {e1516}, doi = {10.7717/peerj-cs.1516}, year = {2023} }

  • |DOIzenodo| 所有版本的 DOI。

  • 特定版本的 DOI 可在 Zenodo 以及“发布”页面 https://github.com/pymc-devs/pymc/releases 上找到。

.. |DOIpaper| image:: https://img.shields.io/badge/DOI-10.7717%2Fpeerj--cs.1516-blue.svg :target: https://doi.org/10.7717/peerj-cs.1516 .. |DOIzenodo| image:: https://zenodo.org/badge/DOI/10.5281/zenodo.4603970.svg :target: https://doi.org/10.5281/zenodo.4603970

联系方式

我们将 discourse.pymc.io 作为主要沟通渠道。

若您有关于 PyMC 建模或使用方面的问题,建议您在我们的 Discourse 论坛的 “Questions” 分类 下发布。您也可以在 “Development” 分类 中提出功能建议。关于项目的非技术信息咨询也欢迎在 Discourse 上进行,我们也会在 Discourse 内部发布一般公告或与治理相关的流程信息。

您也可以通过以下社交媒体平台关注我们,获取更新和其他公告:

如要报告 PyMC 的问题,请使用 issue tracker

许可证

Apache License, Version 2.0 <https://github.com/pymc-devs/pymc/blob/main/LICENSE>__

使用 PyMC 的软件

通用目的

  • Bambi: Python 中的贝叶斯模型构建接口(BAMBI)。
  • calibr8: 用于构建详细观测模型的工具箱,可用作 PyMC 中的似然函数。
  • gumbi: 用于构建高斯过程(GP)模型的高级接口。
  • SunODE: 快速常微分方程(ODE)求解器,比 PyMC 自带的求解器快得多。
  • pymc-learn: 基于 pymc3_models/scikit-learn API 构建的自定义 PyMC 模型

特定领域

  • Exoplanet: 用于建模系外行星凌日和/或径向速度观测以及其他天文时间序列的工具包。
  • beat: 贝叶斯地震分析工具(Bayesian Earthquake Analysis Tool)。
  • CausalPy: 专注于准实验环境下因果推断的软件包。
  • PyMC-Marketing: 用于营销组合建模、客户生命周期价值等的贝叶斯营销工具箱。

另请参阅我们网站上的 生态系统页面。如果您的软件未在此列出,请与我们联系。

引用 PyMC 的论文

可通过 Google Scholar 的 此链接此链接 查看持续更新的列表。

贡献者

GitHub 贡献者页面 展示了为本仓库添加内容的人员,其中包含了 PyMC 项目的大部分贡献者,但并非全部。其他贡献者可能向 pymc-devs GitHub 组织的其他仓库贡献了内容,或者通过 GitHub 之外的其他项目空间(如 我们的 Discourse 论坛)进行了贡献。

如果您有兴趣参与贡献,请阅读我们的《行为准则》和《贡献指南》。

支持

PyMC 是 NumFOCUS 旗下的非营利项目。如果您想为 PyMC 提供资金支持,可通过 此链接 进行捐赠。

专业咨询支持

您可以从 PyMC Labs 获取专业咨询支持。

赞助商

|NumFOCUS|

|PyMCLabs|

|OpenWoundResearch|

感谢我们的贡献者

|contributors|

.. |Binder| image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/pymc-devs/pymc/main?filepath=%2Fdocs%2Fsource%2Fnotebooks .. |Build Status| image:: https://github.com/pymc-devs/pymc/workflows/tests/badge.svg :target: https://github.com/pymc-devs/pymc/actions?query=workflow%3Atests+branch%3Amain .. |Coverage| image:: https://codecov.io/gh/pymc-devs/pymc/branch/main/graph/badge.svg :target: https://codecov.io/gh/pymc-devs/pymc .. |Dockerhub| image:: https://img.shields.io/docker/automated/pymc/pymc.svg :target: https://hub.docker.com/r/pymc/pymc .. |NumFOCUS_badge| image:: https://img.shields.io/badge/powered by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A :target: http://www.numfocus.org/ .. |NumFOCUS| image:: https://github.com/pymc-devs/brand/blob/main/sponsors/sponsor_logos/sponsor_numfocus.png?raw=true :target: http://www.numfocus.org/ .. |PyMCLabs| image:: https://github.com/pymc-devs/brand/blob/main/sponsors/sponsor_logos/sponsor_pymc_labs.png?raw=true :target: https://pymc-labs.com .. |OpenWoundResearch| image:: https://github.com/pymc-devs/brand/blob/main/sponsors/sponsor_logos/owr/sponsor_owr.png?raw=true :target: https://www.openwoundresearch.com/ .. |contributors| image:: https://contrib.rocks/image?repo=pymc-devs/pymc :target: https://github.com/pymc-devs/pymc/graphs/contributors .. |Conda Downloads| image:: https://anaconda.org/conda-forge/pymc/badges/downloads.svg :target: https://anaconda.org/conda-forge/pymc