MCMC 大都市法采样器 返回
统计和贝叶斯模拟器

MCMC 大都市法采样器 — 受理率和自相关

使用大都市-哈斯廷斯法从一维任意分布采样。改变提案方差 σ,在迹线图、直方图和自相关图中同时观察受理率和链的混合情况如何变化。

参数设置
样本数 N
提案方差 σ_prop
目标分布类型

0: 单峰高斯 N(0, 1) / 1: 双峰混合 0.4·N(−2, 0.5²) + 0.6·N(2, 0.7²)

预烧期

提案与受理判定使用随机数(Math.random + Box–Muller 法)。当累积 n 个样本后,动画会自动重置并重复演示收敛过程。

暂停时,拖动滑块即可即时更新结果。

计算结果
0
样本数 n
受理率
提案步长 σ
平均误差 |μ̂−μ|
目标分布、直方图和随机游走

上=直方图(绿色)逐渐收敛到目标密度(黄色),每次提案以 接受=绿 / 拒绝=红 显示;下=链的随机游走 x_t。

理论和主要公式

大都市-哈斯廷斯法从高斯提案分布 $q$ 生成候选 $x'$,以受理概率 $\alpha$ 进行受理/拒绝。如果提案 $q$ 对称,则 $q(x|x') = q(x'|x)$ 相消,只需计算概率密度比。

提案:

$$x' \sim \mathcal{N}(x_t, \sigma_\text{prop}^2)$$

受理概率:

$$\alpha = \min\!\left(1, \frac{\tilde p(x')}{\tilde p(x_t)}\right)$$

更新规则($u \sim U(0,1)$):

$$x_{t+1} = \begin{cases} x' & (u \lt \alpha) \\ x_t & (\text{otherwise}) \end{cases}$$

$\tilde p(x)$ 可以是未正规化的密度(因为只使用比值)。一维高斯目标的最优 $\sigma_\text{prop}$ 使受理率约为 44%。

什么是 MCMC 大都市法采样器

🙋
我只想从概率分布采样,为什么要用这种叫做马尔可夫链这样复杂的方法呢?不能从随机数直接生成吗?
🎓
简单说,复杂分布尤其是正规化常数(使积分等于 1 的常数)无法计算的分布,无法直接采样。例如,贝叶斯推断中的事后分布,其分母周边似然度通常是高维积分,无法计算。大都市-哈斯廷斯法的妙处在于它"仅用比值"工作——$p(x')/p(x)$ 的比值中正规化常数相消,只需知道密度的形状。试试将模拟器中的"目标分布类型"设为 1(双峰混合),观察直方图逐渐重现两个山峰。
🙋
我把提案方差 σ_prop 设为 0.1,结果迹线变成一条直线,直方图只能画出一个山峰。这是 bug 吗?
🎓
不是 bug,这是 MCMC 的"混合(mixing)"问题的典型例子。σ_prop 太小时,每步只能走很短的距离,要跨越两个山峰之间的谷需要数千步。看受理率卡,应该是 95% 以上,但这是"几乎每次都接受,但几乎不移动"的状态。反过来 σ_prop=5 时会被大量拒绝,链卡在一个地方。受理率在 30~50% 是"恰当"的 σ_prop 的目标。
🙋
明白了!那只要选对最优的 σ_prop,就能完美采样了吗?
🎓
还有一个陷阱。相邻的样本相似,所以 N=2000 个样本实际信息量不等于 2000 个独立样本。这用"有效样本数(ESS)"表示,下面自相关图的柱子衰减越快,ESS 就越大。在 CAE 的不确定性量化中,需要先定目标精度对应的 ESS,再从中反推连锁长度。试试改变 σ_prop,看 ESS 卡怎么变化,你会获得直觉。

常见问题

这来自马尔可夫链定常分布必须是目标 p(x) 的"细致平衡条件 p(x)q(x'|x)α(x,x') = p(x')q(x|x')α(x',x)"。当提案 q 对称时 q(x'|x)=q(x|x'),只需用比值 p(x')/p(x) 决定,这是大都市法的核心,也是为什么即使不知道正规化常数也能采样的原因。
Roberts、Gelman、Gilks(1997)对高斯目标的渐近分析表明,最大化有效样本数的最优受理率在一维时为 0.44,在多维时随维数增大趋近 0.234。受理率太高说明步长太小、混合慢;太低则频繁被拒、链停滞。实务中通常以 0.2~0.5 为目标调整 σ_prop。
两个山峰间的谷的概率密度很低,提案落在谷里时概率比会极小,容易被拒绝,导致链无法"跳跃"到另一个山峰。解决方法包括:增大 σ_prop 提高跳跃概率、用多个初值并行运行、或采用平行回火法(Parallel Tempering)升温降低谷的高度。
查看迹线图,找到初始值的影响消失、链开始平稳波动的时刻,以此作为预烧期的目标。本工具默认设为 200 步,但对于复杂分布或不良初值,可能需要更长。诊断指标中常用 Gelman-Rubin 的 R̂(多链方差比)或自相关时间的数倍。

实际应用

贝叶斯推断和参数估计:从事后分布 $p(\theta|D) \propto p(D|\theta)p(\theta)$ 采样 $\theta$ 是最标准的应用。从观测数据推断物理模型参数(如材料弹性系数的事后分布)时,虽然积分无法解析计算,MCMC 仍能处理。Stan、PyMC 等主流贝叶斯库都以此为核心。

统计力学和伊辛模型:大都市法源自统计力学中从玻尔兹曼分布 $p \propto e^{-E/kT}$ 采样(Metropolis et al., 1953)。用于研究自旋系统相变、合金有序-无序转变、蛋白质折叠等平衡态物理量计算。

CAE 不确定性量化(UQ):有限元分析的输入参数(材料常数、边界条件、几何公差)有概率分布时,用 MCMC 推断输出(应力、变形)的事后分布或可靠性指标。FORM/SORM 无法捕捉的复杂失效区域或多峰分布可通过 MCMC 有效评估。现代方法常与代理模型(克里金、高斯过程)结合降低计算成本。

机器学习和概率编程:隐变量模型、混合模型、分层模型等最大似然法容易陷入局部解的复杂模型,用 MCMC 学习。主题模型(LDA)的 Collapsed Gibbs 采样器、贝叶斯神经网络权重采样、强化学习的策略评估等都有应用。

常见误解和注意事项

最常见的误解是"受理率越高越好"。模拟器中 σ_prop=0.1 时受理率超过 95%,但这只表示"几乎不动",样本质量最差。σ_prop=5 时受理率约 10%,也很糟糕因为频繁拒绝。一维目标应瞄准 40~50% 的受理率,多维时 20~30%,本工具默认 σ_prop=1.0 接近最优值。

第二个误解是"混淆 MCMC 样本数和独立样本数"。链的样本 $x_1, x_2, \ldots, x_N$ 不独立,例如自相关时间 $\tau=20$ 时,N=2000 的链实际信息量仅约 100。论文中必须同时报告 ESS 或 $\hat R$ 等诊断指标,不能只写"运行 N=10000 的 MCMC"。

第三个误解是"预烧就能保证收敛"。预烧只是"消除初值影响",不能保证到达定常分布。双山分布时如果链只到了一个山,长预烧也看不到另一个山。实务中需用多初值并行运行,检查 Gelman-Rubin 统计量 $\hat R$ 接近 1,视察迹线图,才能综合判断收敛。

使用指南

  1. 选择目标分布。可从正态分布(μ=0, σ=1)、混合正态分布或香蕉型分布中选择。
  2. 调整提案方差σ。值过小时受理率高但收敛慢;过大时受理率下降效率恶化。
  3. 设置样本总数 N 和预烧期,运行模拟后同时显示迹线图、直方图和自相关函数。

具体计算示例

对于混合正态分布(权重 0.3 平均 -3 σ=0.5、权重 0.7 平均 3 σ=0.5),用 N=10000、σ=1.2 的提案方差时,受理率约 65%,有效样本数 ESS≈3200。预烧期设为 2000 时,从 8000 个样本估计的平均值 μ̂=0.15,标准差 σ̂=2.8,自相关在滞后 50 时衰减到 0.1 以下。

实务注意事项