pymc

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese
<!-- Adapted from: claude-scientific-skills/scientific-skills/pymc -->
<!-- 改编自:claude-scientific-skills/scientific-skills/pymc -->

PyMC Bayesian Modeling

PyMC贝叶斯建模

Probabilistic programming with MCMC - build and fit Bayesian models.
基于MCMC的概率编程——构建并拟合贝叶斯模型。

When to Use

适用场景

  • Bayesian regression and classification
  • Hierarchical/multilevel models
  • Uncertainty quantification
  • Prior/posterior predictive checks
  • Model comparison (LOO, WAIC)
  • 贝叶斯回归与分类
  • 分层/多水平模型
  • 不确定性量化
  • 先验/后验预测检验
  • 模型比较(LOO、WAIC)

Quick Start

快速入门

python
import pymc as pm
import arviz as az
import numpy as np
python
import pymc as pm
import arviz as az
import numpy as np

Build model

构建模型

with pm.Model() as model: # Priors alpha = pm.Normal('alpha', mu=0, sigma=1) beta = pm.Normal('beta', mu=0, sigma=1) sigma = pm.HalfNormal('sigma', sigma=1)
# Likelihood
mu = alpha + beta * X
y_obs = pm.Normal('y_obs', mu=mu, sigma=sigma, observed=y)

# Sample
idata = pm.sample(2000, tune=1000, chains=4)
with pm.Model() as model: # 先验分布 alpha = pm.Normal('alpha', mu=0, sigma=1) beta = pm.Normal('beta', mu=0, sigma=1) sigma = pm.HalfNormal('sigma', sigma=1)
# 似然函数
mu = alpha + beta * X
y_obs = pm.Normal('y_obs', mu=mu, sigma=sigma, observed=y)

# 采样
idata = pm.sample(2000, tune=1000, chains=4)

Analyze

分析结果

az.summary(idata) az.plot_posterior(idata)
undefined
az.summary(idata) az.plot_posterior(idata)
undefined

Model Building

模型构建

python
coords = {'predictors': ['var1', 'var2', 'var3']}

with pm.Model(coords=coords) as model:
    # Priors with dimensions
    alpha = pm.Normal('alpha', mu=0, sigma=1)
    beta = pm.Normal('beta', mu=0, sigma=1, dims='predictors')
    sigma = pm.HalfNormal('sigma', sigma=1)

    # Linear model
    mu = alpha + pm.math.dot(X, beta)

    # Likelihood
    y_obs = pm.Normal('y_obs', mu=mu, sigma=sigma, observed=y)
python
coords = {'predictors': ['var1', 'var2', 'var3']}

with pm.Model(coords=coords) as model:
    # 带维度的先验分布
    alpha = pm.Normal('alpha', mu=0, sigma=1)
    beta = pm.Normal('beta', mu=0, sigma=1, dims='predictors')
    sigma = pm.HalfNormal('sigma', sigma=1)

    # 线性模型
    mu = alpha + pm.math.dot(X, beta)

    # 似然函数
    y_obs = pm.Normal('y_obs', mu=mu, sigma=sigma, observed=y)

Common Models

常见模型

Linear Regression

线性回归

python
with pm.Model() as linear_model:
    alpha = pm.Normal('alpha', mu=0, sigma=10)
    beta = pm.Normal('beta', mu=0, sigma=10, shape=n_features)
    sigma = pm.HalfNormal('sigma', sigma=1)

    mu = alpha + pm.math.dot(X, beta)
    y = pm.Normal('y', mu=mu, sigma=sigma, observed=y_obs)
python
with pm.Model() as linear_model:
    alpha = pm.Normal('alpha', mu=0, sigma=10)
    beta = pm.Normal('beta', mu=0, sigma=10, shape=n_features)
    sigma = pm.HalfNormal('sigma', sigma=1)

    mu = alpha + pm.math.dot(X, beta)
    y = pm.Normal('y', mu=mu, sigma=sigma, observed=y_obs)

Logistic Regression

逻辑回归

python
with pm.Model() as logistic_model:
    alpha = pm.Normal('alpha', mu=0, sigma=10)
    beta = pm.Normal('beta', mu=0, sigma=10, shape=n_features)

    logit_p = alpha + pm.math.dot(X, beta)
    y = pm.Bernoulli('y', logit_p=logit_p, observed=y_obs)
python
with pm.Model() as logistic_model:
    alpha = pm.Normal('alpha', mu=0, sigma=10)
    beta = pm.Normal('beta', mu=0, sigma=10, shape=n_features)

    logit_p = alpha + pm.math.dot(X, beta)
    y = pm.Bernoulli('y', logit_p=logit_p, observed=y_obs)

Hierarchical Model

分层模型

python
with pm.Model(coords={'groups': group_names}) as hierarchical:
    # Hyperpriors
    mu_alpha = pm.Normal('mu_alpha', mu=0, sigma=10)
    sigma_alpha = pm.HalfNormal('sigma_alpha', sigma=1)

    # Group-level (non-centered parameterization)
    alpha_offset = pm.Normal('alpha_offset', mu=0, sigma=1, dims='groups')
    alpha = pm.Deterministic('alpha', mu_alpha + sigma_alpha * alpha_offset)

    # Likelihood
    sigma = pm.HalfNormal('sigma', sigma=1)
    y = pm.Normal('y', mu=alpha[group_idx], sigma=sigma, observed=y_obs)
python
with pm.Model(coords={'groups': group_names}) as hierarchical:
    # 超先验分布
    mu_alpha = pm.Normal('mu_alpha', mu=0, sigma=10)
    sigma_alpha = pm.HalfNormal('sigma_alpha', sigma=1)

    # 组级别(非中心化参数化)
    alpha_offset = pm.Normal('alpha_offset', mu=0, sigma=1, dims='groups')
    alpha = pm.Deterministic('alpha', mu_alpha + sigma_alpha * alpha_offset)

    # 似然函数
    sigma = pm.HalfNormal('sigma', sigma=1)
    y = pm.Normal('y', mu=alpha[group_idx], sigma=sigma, observed=y_obs)

Sampling

采样

python
with model:
    # MCMC (default NUTS)
    idata = pm.sample(
        draws=2000,
        tune=1000,
        chains=4,
        target_accept=0.9,
        random_seed=42
    )

    # Variational inference (faster, approximate)
    approx = pm.fit(n=20000, method='advi')
python
with model:
    # MCMC(默认NUTS算法)
    idata = pm.sample(
        draws=2000,
        tune=1000,
        chains=4,
        target_accept=0.9,
        random_seed=42
    )

    # 变分推断(更快,近似结果)
    approx = pm.fit(n=20000, method='advi')

Diagnostics

诊断

python
import arviz as az
python
import arviz as az

Check convergence

检查收敛性

print(az.summary(idata, var_names=['alpha', 'beta', 'sigma']))
print(az.summary(idata, var_names=['alpha', 'beta', 'sigma']))

R-hat should be < 1.01

R-hat值应小于1.01

ESS should be > 400

ESS值应大于400

Trace plots

轨迹图

az.plot_trace(idata)
az.plot_trace(idata)

Check divergences

检查发散情况

print(f"Divergences: {idata.sample_stats.diverging.sum().values}")
undefined
print(f"Divergences: {idata.sample_stats.diverging.sum().values}")
undefined

Predictive Checks

预测检验

python
with model:
    # Prior predictive (before fitting)
    prior_pred = pm.sample_prior_predictive(1000)
    az.plot_ppc(prior_pred, group='prior')

    # Posterior predictive (after fitting)
    pm.sample_posterior_predictive(idata, extend_inferencedata=True)
    az.plot_ppc(idata)
python
with model:
    # 先验预测(拟合前)
    prior_pred = pm.sample_prior_predictive(1000)
    az.plot_ppc(prior_pred, group='prior')

    # 后验预测(拟合后)
    pm.sample_posterior_predictive(idata, extend_inferencedata=True)
    az.plot_ppc(idata)

Model Comparison

模型比较

python
undefined
python
undefined

Fit models with log_likelihood

拟合包含log_likelihood的模型

with model1: idata1 = pm.sample(idata_kwargs={'log_likelihood': True})
with model2: idata2 = pm.sample(idata_kwargs={'log_likelihood': True})
with model1: idata1 = pm.sample(idata_kwargs={'log_likelihood': True})
with model2: idata2 = pm.sample(idata_kwargs={'log_likelihood': True})

Compare using LOO

使用LOO进行比较

comparison = az.compare({'model1': idata1, 'model2': idata2}) print(comparison)
undefined
comparison = az.compare({'model1': idata1, 'model2': idata2}) print(comparison)
undefined

Predictions

预测

python
with model:
    pm.set_data({'X': X_new})
    post_pred = pm.sample_posterior_predictive(idata)
python
with model:
    pm.set_data({'X': X_new})
    post_pred = pm.sample_posterior_predictive(idata)

Extract intervals

提取区间

y_pred_mean = post_pred.posterior_predictive['y'].mean(dim=['chain', 'draw']) y_pred_hdi = az.hdi(post_pred.posterior_predictive)
undefined
y_pred_mean = post_pred.posterior_predictive['y'].mean(dim=['chain', 'draw']) y_pred_hdi = az.hdi(post_pred.posterior_predictive)
undefined

Best Practices

最佳实践

  1. Standardize predictors for better sampling
  2. Use weakly informative priors (not flat)
  3. Non-centered parameterization for hierarchical models
  4. Check diagnostics before interpretation (R-hat, ESS)
  5. Prior predictive checks before fitting
  6. Posterior predictive checks after fitting
  1. 标准化预测变量以提升采样效果
  2. 使用弱信息先验(而非平坦先验)
  3. 分层模型采用非中心化参数化
  4. 解释结果前检查诊断指标(R-hat、ESS)
  5. 拟合前进行先验预测检验
  6. 拟合后进行后验预测检验

Troubleshooting

问题排查

  • Divergences → Increase
    target_accept=0.95
    , use non-centered
  • Low ESS → More draws, reparameterize
  • High R-hat → Run longer chains
  • 出现发散 → 提高
    target_accept=0.95
    ,使用非中心化参数化
  • ESS值低 → 增加采样次数,重新参数化
  • R-hat值高 → 延长链长

Resources

参考资源