🧩 Markov Chain Monte Carlo(MCMC)总结
一、核心思想
当目标分布太复杂、无法直接采样时,MCMC通过构造一个马尔可夫链,使其在长时间运行后稳定在目标分布上。从这个链上取样,就相当于从目标分布 () 中采样。
换句话说,
MCMC 不是直接“生成样本”,而是设计一个“随机游走过程”,
让它长期停留在高概率区域,
其停留时间比例反映了目标分布的形状。
二、基本构造
MCMC 的关键是让随机过程满足:
其中 ( ) 是从状态 (y) 到 (x) 的转移概率。
为了让 (p(x)) 成为平稳分布,我们设计链使其满足:
这称为 Detailed Balance(细致平衡条件)。
三、Metropolis–Hastings 算法(MCMC 的核心例子)
目标:采样 ( ) (不需要知道归一化常数)
算法流程:
- 选择一个任意初始点 ( )
- 提议一个新点 ( )
- 计算接受概率:
- 以概率 ( ) 接受新点,否则留在原地
- 重复以上步骤
当 (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()
结果:直方图与标准正态密度几乎重合。