拒绝采样模拟器 返回
数学与统计模拟器

拒绝采样模拟器 — 蒙特卡罗样本生成

当无法直接从目标分布 p(x) 采样时,利用易于采样的提案分布 q(x) 将其放大 M 倍以覆盖 p(x),然后以接受概率 p(x)/(M·q(x)) 提取样本。在 Beta(2,5) 或双峰混合分布上体验接受/拒绝散点、直方图和理论效率 1/M 的实时对比。

参数设置
试验次数 N
包络系数 M
目标分布

0: Beta(2,5) 单峰非对称 / 1: 双峰混合 采样困难

提案高斯宽度 σ(type=1 用)

随机数由 LCG(固定种子=42)确定。重新采样会更新种子。

计算结果
试验次数 N
接受样本数
接受率
理论最大效率 1/M
目标 p(x) 和包络 M·q(x)·接受/拒绝点

蓝色实线=目标 p(x)/绿色虚线=包络 M·q(x)/绿色圆点=接受点/红色×=拒绝点

接受样本的直方图与 p(x)

蓝色柱=接受点的直方图(正规化)/白色线=目标 p(x)

理论与主要公式

拒绝采样选择提案 q(x) 和常数 M ≥ sup p(x)/q(x),生成 X ~ q(x), U ~ U(0,1),执行接受判定 U < p(X)/(M·q(X))。

接受概率(任何试验被接受的概率):

$$P(\text{accept}) = \int \frac{p(x)}{M\,q(x)}\,q(x)\,dx = \frac{1}{M}\int p(x)\,dx = \frac{1}{M}$$

接受样本的条件分布:

$$f_{X\,|\,\text{accept}}(x) = p(x)$$

期望接受样本数:

$$\mathbb{E}[N_{\text{accept}}] = \frac{N}{M}$$

M 越大,包络越厚实越安全,但接受率按 1/M 比例下降,计算量增加。

拒绝采样模拟器是什么

🙋
计算机生成概率分布 p(x) 的样本,不就是直接生成随机数吗?为什么需要什么"拒绝"?
🎓
这是个很好的问题。均匀分布、正态分布这样的分布,因为"反函数有显式形式",所以可以直接采样。但贝叶斯统计的后验分布,正规化常数往往未知,或形状复杂得无法直接生成。拒绝采样用"覆盖策略"解决这个问题——找一个易于采样的提案 q(x) 把它按比例放大,盖住蓝色的目标 p(x),然后只捡"命中"目标的点。模拟器默认用均匀分布来覆盖 Beta(2,5) 分布。
🙋
绿色虚线是"M·q(x)",蓝色实线是目标。为什么要乘以 M?
🎓
因为必须满足"M·q(x) ≥ p(x) 对所有 x 都成立"。换句话说,你用提案放大后的曲线当"天花板",要完全盖住蓝色的山。Beta(2,5) 在 x=0.2 处最高值约 2.458,q=1(均匀),所以需要 M≥2.458。默认设 M=3.0 比较安全。试试把 M 改为 2,你会看到蓝线穿过绿色虚线,这样采出的分布就错了。
🙋
我看到"接受率"显示 33%,这恰好是"1/M"的 1/3。是巧合吗?
🎓
不是巧合,这是拒绝采样的核心定理。接受概率的积分是 ∫p(x)/(M·q(x))·q(x)dx = (1/M)∫p(x)dx = 1/M。所以 2000 次试验中,接受数约 666,比例约 33%。M 改成 5,接受率就是 20%;改成 10,就是 10%。看看卡片上"理论最大效率 1/M"和"接受率"的数值,它们应该很接近。
🙋
我把"目标分布"切到 1(双峰),接受率一下子掉下来了……
🎓
对,这是关键问题。分布的形状一旦复杂,用一个简单的提案(比如一个高斯)来覆盖就很困难,你不得不把 M 设得很大。而且提案宽度 σ 太小会漏掉两个峰,太大又浪费。这就是现实中的困境,也是为什么工业级应用会用 MCMC 或哈密尔顿蒙特卡罗——拒绝采样在高维或复杂形状时,效率会按指数下滑,那叫"维数诅咒"。但它是学习蒙特卡罗方法的经典起点,缺点也教会我们该往哪里改进。

常见问题

理论上,M = sup_x p(x)/q(x) 是最优的,能最大化接受率。对于 Beta(2,5) 与均匀提案,在 x=0.2 处比值最大为 2.458,所以 M=2.458 是最优。实现时可以对 p 和 q 求导找极值点,或用数值网格扫描来逼近上界。如果分布形状不明确,可用自适应拒绝采样 (Adaptive Rejection Sampling, ARS),它能动态调整包络。
能。设 p(x) = p̃(x)/Z,其中 Z 是未知常数。只要你知道 p̃(x) 的形式,选择 M ≥ sup p̃(x)/q(x),接受判定用 U < p̃(X)/(M·q(X)),得到的样本依然严格遵循 p(x)。这对贝叶斯推断极其关键——事后分布正规化常数就是积分难,但这不影响拒绝采样的有效性。
高维中,目标分布的概率质量集中在极窄的区域(浓度现象),而提案分布往往是全维度展开的。比值 p(x)/q(x) 的上界随维数指数增长,所以 M 必须非常大,接受率 1/M 就指数下降。一个 10 维的高斯案例,稍微移动均值就会导致 M 飙升。这就是"维数诅咒"。处理高维问题需要 MCMC、变分推断或哈密尔顿蒙特卡罗这样的进阶方法。
从贝叶斯定理推导:X ~ q,U ~ U(0,1),当 U < p(X)/(M·q(X)) 时接受。条件分布 f(X|accept) = q(x)·[p(x)/(M·q(x))] / P(accept) = q(x)·[p(x)/(M·q(x))] / (1/M) = p(x)。关键是条件 M·q(x) ≥ p(x) 保证了"在厚天花板下均匀随机打点,从下往上切片看就是 p(x)"这个几何直觉。

现实应用场景

贝叶斯统计与概率建模:后验分布 p(θ|D) ∝ p(D|θ)p(θ) 的正规化常数通常无解析形式,拒绝采样用来生成参数样本,进而估计后验均值、置信区间等。在低维模型或 MCMC 的预热阶段常见。

计算物理与分子模拟:在加权蒙特卡罗中,玻尔兹曼分布 p(x) ∝ exp(-E(x)/kT) 的采样是核心问题。能量地形简单时,拒绝采样可直接应用;复杂时转向 Metropolis 法或淬火分子动力学。

可靠性工程与 CAE:产品可靠性评估需从不确定输入(材料强度、尺寸公差)抽样,送入有限元求解。当输入分布非标准时,拒绝采样生成样本,再统计响应分布推估失效概率。

机器学习与生成模型:能量基模型、某些变分自编码器的先验采样、稀有事件估计等都会涉及。现代扩散模型的理论分析也借鉴了拒绝采样的思想。

常见误区与注意事项

最普遍的错误是"只要接受率低就放弃"。实际上接受率 1/M 低虽然意味着需要更多试验次数,但接受的样本品质依然完美无缺。问题在成本:M=10 时接受率 10%,要得到同样数量的样本,试验次数是 M=2.458 的 4 倍。所以 M 要选得尽可能紧。模拟器里拖 M 的滑块看"接受率"卡片,找到效率和保险之间的均衡点。

其次,低估提案分布 q(x) 的选择难度。q 的形状如果和 p 差太远,即使满足 M·q(x) ≥ p(x),大多数点也会落在 p 的"无人区"被浪费掉。模拟器中把"目标分布"改为 1(双峰),"提案幅度"σ 设成 0.5,会发现中央堆积、两峰缺失——这就是提案选不好的后果。最好的提案是"形状接近、尾部稍宽"。

第三,条件 M·q(x) ≥ p(x) 是硬性约束,一个点也不能破。若破了,接受概率会超过 1,样本就系统性偏离真实分布。模拟器改 M=2、保持 Beta(2,5) 时会看到蓝线穿出绿虚线,直方图的峰值会有明显低估。实现时一定用保守的估计或数值验证来设 M。

使用指南

  1. 在"目标分布"下拉菜单中选择目标分布(如 β 分布、混合高斯分布)
  2. 调整提案分布 q(x) 的幅度参数(slQwidth),设置覆盖目标 p(x) 的包络系数 M。M 越小接受率越高,但必须满足 p(x) ≤ M·q(x) 的条件
  3. 指定试验次数 N(如 10,000~100,000),运行后查看左图的"接受/拒绝散点图"(接受点为青色,拒绝点为灰色),右图直方图与目标分布的吻合度

具体计算示例

贝塔分布 p(x)=60x²(1-x)² [0,1]、提案分布 U(0,1)、M=0.375 的情况,理论最大效率 1/M ≈ 2.67(平均 2.67 次试验得 1 个样本)。N=50,000 次试验时,接受率约 37.5%,接受样本数约 18,750,与理论值偏离通常 <1%。提案分布幅度过宽会导致 M 增加、效率下降(1/M→大),过窄会漏掉目标分布的尾部。

实务中的注意