MCMC

🧩 Markov Chain Monte Carlo(MCMC)总结

一、核心思想

当目标分布太复杂、无法直接采样时,MCMC通过构造一个马尔可夫链,使其在长时间运行后稳定在目标分布上。
从这个链上取样,就相当于从目标分布 () 中采样。
换句话说,
MCMC 不是直接“生成样本”,而是设计一个“随机游走过程”,
让它长期停留在高概率区域
停留时间比例反映了目标分布的形状。

二、基本构造

MCMC 的关键是让随机过程满足:
其中 ( ) 是从状态 (y) 到 (x) 的转移概率。
为了让 (p(x)) 成为平稳分布,我们设计链使其满足:
这称为 Detailed Balance(细致平衡条件)

三、Metropolis–Hastings 算法(MCMC 的核心例子)

目标:采样 ( ) (不需要知道归一化常数)
算法流程:
  1. 选择一个任意初始点 ( )
  1. 提议一个新点 ( )
  1. 计算接受概率:
  1. 以概率 ( ) 接受新点,否则留在原地
  1. 重复以上步骤
当 (q) 是对称分布(如正态分布)时,公式简化为:

四、为什么这样设计能得到目标分布?

Metropolis–Hastings 的接受率使得:
这正好满足 detailed balance
从而保证 (p(x)) 是马尔可夫链的平稳分布。
随着链不断迭代,它会收敛到 (p(x))。

五、直觉理解

  • 想象在一个地形图上行走,地形的高度代表 (p(x))。
  • 你在地形上“随机走动”:有时往高处走、有时往低处走。
  • 如果新点比旧点“高”(更可能),几乎总是接受;
    • 如果更低,就以一定概率接受。
  • 久而久之,你在高地(高概率区域)停留时间更久。
  • 所以,你走过的位置分布 ≈ 目标分布。

六、为什么不用反函数采样或拒绝采样?

方法
思路
局限
Inverse CDF
计算 (),直接采样
多数分布 () 无解析解,尤其是高维
拒绝采样
用易采样的 () 包住 (p(x)),按比例接受
高维时效率极低,拒绝率接近 100%
MCMC
构造满足平稳分布的马尔可夫链
依赖上一步、样本相关,但高维高效

七、关键概念

名称
含义
Markov Chain
当前状态仅依赖上一步
Stationary Distribution
收敛后分布保持不变
Detailed Balance
从 A→B 与 B→A 的流量平衡
Burn-in
前期未收敛样本丢弃
Thinning
间隔取样,减少相关性
Ergodicity
长期运行后收敛到唯一平稳分布

八、示例代码(采样标准正态)

import numpy as np import matplotlib.pyplot as plt def p(x): return np.exp(-0.5 * x**2) # 目标分布 ∝ e^{-x^2/2} samples = [0] for _ in range(10000): x = samples[-1] x_new = np.random.normal(x, 1.0) alpha = min(1, p(x_new)/p(x)) if np.random.rand() < alpha: samples.append(x_new) else: samples.append(x) plt.hist(samples[1000:], bins=50, density=True, alpha=0.6) x = np.linspace(-4,4,200) plt.plot(x, 1/np.sqrt(2*np.pi)*np.exp(-x**2/2), 'r--') plt.title("MCMC Sampling (Metropolis)") plt.show()
结果:直方图与标准正态密度几乎重合。