参数设置
提案与受理判定使用随机数(Math.random + Box–Muller 法)。当累积 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,视察迹线图,才能综合判断收敛。