[ PROMPT_NODE_27132 ]
pymc-bayesian-modeling
[ SKILL_DOCUMENTATION ]
# PyMC 贝叶斯建模
## 概述
PyMC 是一个用于贝叶斯建模和概率编程的 Python 库。使用 PyMC 的现代 API(5.x+ 版本)构建、拟合、验证和比较贝叶斯模型,包括分层模型、MCMC 采样 (NUTS)、变分推理和模型比较 (LOO, WAIC)。
## 何时使用此技能
当需要进行以下操作时使用此技能:
- 构建贝叶斯模型(线性/逻辑回归、分层模型、时间序列等)
- 执行 MCMC 采样或变分推理
- 进行先验/后验预测检查
- 诊断采样问题(发散、收敛、ESS)
- 使用信息准则 (LOO, WAIC) 比较多个模型
- 通过贝叶斯方法实现不确定性量化
- 处理分层/多层数据结构
- 以原则性的方式处理缺失数据或测量误差
## 标准贝叶斯工作流
遵循此工作流来构建和验证贝叶斯模型:
### 1. 数据准备
python
import pymc as pm
import arviz as az
import numpy as np
# 加载并准备数据
X = ... # 预测变量
y = ... # 结果变量
# 标准化预测变量以获得更好的采样效果
X_mean = X.mean(axis=0)
X_std = X.std(axis=0)
X_scaled = (X - X_mean) / X_std
**关键实践:**
- 标准化连续预测变量(提高采样效率)
- 尽可能对结果进行中心化
- 显式处理缺失数据(将其视为参数)
- 使用 `coords` 命名维度以保持清晰
### 2. 模型构建
python
coords = {
'predictors': ['var1', 'var2', 'var3'],
'obs_id': np.arange(len(y))
}
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_scaled, beta)
# 似然函数
y_obs = pm.Normal('y_obs', mu=mu, sigma=sigma, observed=y, dims='obs_id')
**关键实践:**
- 使用弱信息先验(而非平坦先验)
- 对尺度参数使用 `HalfNormal` 或 `Exponential`
- 尽可能使用命名维度 (`dims`) 而非 `shape`
- 对将用于预测的更新值使用 `pm.Data()`
### 3. 先验预测检查
**在拟合前务必验证先验:**
python
with model:
prior_pred = pm.sample_prior_predictive(samples=1000, random_seed=42)
# 可视化
az.plot_ppc(prior_pred, group='prior')
**检查:**
- 先验是否合理