[ PROMPT_NODE_27136 ]
sampling_inference
[ SKILL_DOCUMENTATION ]
# PyMC 采样与推断方法
本参考涵盖了 PyMC 中用于后验推断的采样算法和推断方法。
## MCMC 采样方法
### 主要采样函数
**`pm.sample(draws=1000, tune=1000, chains=4, **kwargs)`**
PyMC 中 MCMC 采样的主要接口。
**关键参数:**
- `draws`:每个链的采样数(默认:1000)
- `tune`:调优/预热样本数(默认:1000,将被丢弃)
- `chains`:并行链的数量(默认:4)
- `cores`:使用的 CPU 核心数(默认:所有可用核心)
- `target_accept`:步长调优的目标接受率(默认:0.8,对于困难的后验分布可增加至 0.9-0.95)
- `random_seed`:用于可重复性的随机种子
- `return_inferencedata`:返回 ArviZ InferenceData 对象(默认:True)
- `idata_kwargs`:创建 InferenceData 的额外参数(例如 `{"log_likelihood": True}` 用于模型比较)
**返回:** 包含后验样本、采样统计信息和诊断信息的 InferenceData 对象
**示例:**
python
with pm.Model() as model:
# ... 定义模型 ...
idata = pm.sample(draws=2000, tune=1000, chains=4, target_accept=0.9)
### 采样算法
PyMC 会根据模型结构自动选择合适的采样器,但您也可以手动指定算法。
#### NUTS (No-U-Turn Sampler)
连续参数的**默认算法**。高效的哈密顿蒙特卡洛(HMC)变体。
- 自动调优步长和质量矩阵
- 自适应:在调优期间探索后验几何结构
- 最适合平滑、连续的后验分布
- 在高相关性或多峰分布下可能表现不佳
**手动指定:**
python
with model:
idata = pm.sample(step=pm.NUTS(target_accept=0.95))
**何时调整:**
- 如果出现发散(divergences),增加 `target_accept` (0.9-0.99)
- 使用 `init='adapt_diag'` 进行更快的初始化(默认)
- 使用 `init='jitter+adapt_diag'` 处理困难的初始化
#### Metropolis
通用 Metropolis-Hastings 采样器。
- 适用于连续和离散变量
- 对于平滑的连续后验分布,效率低于 NUTS
- 适用于离散参数或不可微模型
- 需要手动调优
**示例:**
python
with model:
idata = pm.sample(step=pm.Metropolis())
#### Slice Sampler
用于单变量分布的切片采样。
- 无需调优
- 适用于困难的单变量后验分布
- 在高维空间中可能较慢