Marx MaxEN
菜单

MCMC 接受率高就好吗?用三种步长对照同一个后验

摘要:随机游走 Metropolis 的提议步长会改变有限链的探索方式。本指南用具有解析参照的一维后验,比较三种步长的轨迹、接受率、均值与分散程度,解释为什么拒绝后的状态必须保留、舍去前段不等于收敛,并提供全部状态、实际程序和下载复做包。

一条链有很高的接受率,并不意味着它已经充分探索了后验;如果每次只移动一点点,状态可能长期停留在局部。相反,大步提议可能经常被拒绝。要判断有限链的计算表现,需要把统计目标、轨迹和估计结果一起看,而不是只盯着接受比例。

配套 MCMC 案例特意选择能够解析计算的后验,让目标均值和标准差成为参照。它沿用计量教学指南中的模拟模型,提供实际运行的三条设置、每一步状态、接受标记、图与代码,便于独立复做。

为什么先用一个简单后验?

数据由 y=1+2x+ε 生成,x 与 ε 为独立标准正态,各观测独立,种子 42,样本量 30。推断时固定截距为 1、误差标准差为 1,斜率先验为 N(0,5²)。这里只估计一个斜率,既不估计截距,也不估计方差,因此它不是完整的一般贝叶斯回归。

在这些条件下,斜率后验仍为正态,可以直接计算均值、标准差和分位数。这个参照并不是要求抽样均值恰好等于解析值,而是帮助分辨有限抽样的偏差、波动和探索不足。换成没有解析结果的真实模型时,不能沿用“看起来接近”这一种检查。

可以提出这样的练习任务:

保持同一模拟数据、先验和后验目标,使用初值 0,分别运行提议标准差 0.01、0.35、3 的随机游走 Metropolis,各 5000 次。保留全部状态与接受标记;拒绝后仍记录当前状态。统一舍去前 1000 个状态后,对照轨迹、均值、分散程度和解析后验。不要只凭接受率宣布收敛,也不要把三种设置拼成一个后验样本。

提议改变探索,不改变目标

本例使用对称正态随机游走提议,因此接受步骤只需要未归一化后验的比率。步长改变的是候选状态离当前位置有多远,而不是先验或似然。拒绝时,链应继续记录当前位置;如果只保留被接受的点,就删除了停留时间,改变了样本表示的分布。

三种设置使用相同种子,是便于教学对照的三次运行,不是独立多链诊断。每种设置的接受率按全部 5000 次计算,均值、标准差和经验分位数则按舍去前 1000 后的 4000 个状态计算。把这两个分母混用,会让摘要与状态文件对不上。

这次计算显示了什么?

提议标准差 0.01 的接受率约 97%,但保留状态均值约 1.696,与解析均值约 1.853 有明显距离。标准差 3 的接受率约 9.6%,经常拒绝并停留;虽然均值较接近参照,保留状态的分散程度仍有差异。0.35 的均值和标准差较接近解析目标,但一次运行仍不足以证明收敛。

舍去前 1000 是本次统一比较安排,不是自动 warmup 或收敛保证。有限链的经验分位数在探索不足时可能不可靠,不能因为表格有“2.5%–97.5%”就直接当成可信后验区间。正式工作需要适当初始化的独立多链与有效样本量等诊断,可参考 Stan 后验分析说明。本例没有将三种步长运行冒充这些诊断。

从状态文件复做与继续练习

完整复做包包含自写 Python、30 行模拟数据、15000 行状态记录、三设置摘要、解析后验、图、实际输出及依赖说明。解压到新目录并保留参考成果,按 README 准备依赖后运行 python analyze.py。分析本身离线,默认覆写包内 results/ 的同名输出。

复做时检查完成标记,每个步长 5000 行、保留 4000 行,以及拒绝后的状态是否与前一状态一致;不要把图片字节相同当作数值复做条件。再保持种子不变增加迭代次数,比较目标不变时的探索;改变 seed 会同时改变模拟数据与提议随机数,应分开理解这两种练习。所有结果都属于这个一维模拟目标,不代表真实研究的后验或课堂效果。