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 nppython
import pymc as pm
import arviz as az
import numpy as npBuild 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)
undefinedaz.summary(idata)
az.plot_posterior(idata)
undefinedModel 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 azpython
import arviz as azCheck 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}")
undefinedprint(f"Divergences: {idata.sample_stats.diverging.sum().values}")
undefinedPredictive 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
undefinedpython
undefinedFit 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)
undefinedcomparison = az.compare({'model1': idata1, 'model2': idata2})
print(comparison)
undefinedPredictions
预测
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)
undefinedy_pred_mean = post_pred.posterior_predictive['y'].mean(dim=['chain', 'draw'])
y_pred_hdi = az.hdi(post_pred.posterior_predictive)
undefinedBest Practices
最佳实践
- Standardize predictors for better sampling
- Use weakly informative priors (not flat)
- Non-centered parameterization for hierarchical models
- Check diagnostics before interpretation (R-hat, ESS)
- Prior predictive checks before fitting
- Posterior predictive checks after fitting
- 标准化预测变量以提升采样效果
- 使用弱信息先验(而非平坦先验)
- 分层模型采用非中心化参数化
- 解释结果前检查诊断指标(R-hat、ESS)
- 拟合前进行先验预测检验
- 拟合后进行后验预测检验
Troubleshooting
问题排查
- Divergences → Increase , use non-centered
target_accept=0.95 - Low ESS → More draws, reparameterize
- High R-hat → Run longer chains
- 出现发散 → 提高,使用非中心化参数化
target_accept=0.95 - ESS值低 → 增加采样次数,重新参数化
- R-hat值高 → 延长链长