跳到正文
格致开物MATHWIKI

重要性抽样

重要性抽样(importance sampling)通过改变抽样分布,并给每个样本乘上相应的概率或密度比,估计目标分布下的期望。它把计算次数更多地放在对积分有贡献的区域,常用于概率计算、模拟和贝叶斯积分。改变抽样分布后直接数频率,得到的是新分布的结果;权重负责把结果换回目标分布。

以四次独立的公平硬币试验为例,令K为正面次数,目标是求至少三次正面的概率。按二项分布,精确答案为 (4+1)/16=5/16。这个小例子可以直接算完,用来逐项检查抽样和加权;同样的思想可用于无法枚举的大系统。

让目标事件更常发生

若模拟时把每次正面的概率从二分之一改成四分之三,K≥3会更常出现。但这时直接频率趋向 Prq(K≥3)=4(3/4)3(1/4)+(3/4)4=189/256, 远大于目标 5/16。下标q提醒这里已经换了分布。

对某一条具体的四次结果序列,若有k次正面,其目标概率为 p(x)=1/16,提议概率为 q(x)=(3/4)k(1/4)4−k,所以权重为 w(x)=p(x)q(x)=163k. 三次正面的每个样本给事件概率估计贡献 16/27,四次正面贡献 16/81;不到三次贡献零。较常被模拟出来的结果,单次贡献相应变小。

四次硬币试验正面次数的两组概率柱,公平硬币与正面概率四分之三的提议分布相比
横轴为K。金色提议分布把更多概率放在3与4,估计公平硬币的概率时必须按各K的概率比校正。

换分布恒等式与无偏性

设目标密度p与提议密度q相对于同一参考测度定义,待估量为 μ=∫h(x)p(x)dx,并假设 ∫|h|p<∞。若在 h(x)p(x)≠0 的区域内q几乎处处为正,则 μ=∫h(x)p(x)q(x)q(x)dx=𝔼q[h(X)w(X)]. 在q为零、且 hp=0 的地方,乘积贡献约定为零。离散分布把积分改为求和,同一推导仍成立。抽取独立同分布的 X1,…,XN∼q,得到 μ^N=1N∑i=1Nh(Xi)w(Xi),𝔼qμ^N=μ. 可积性保证上述无偏性,也允许应用独立样本的强大数定律得到一致性。若再有 ∫h2p2/q<∞,独立性给出 Varq(μ^N)=1N[∫h(x)2p(x)2q(x)dx−μ2]. 因此,提议分布是否改善计算,要看这个二阶积分及生成样本的成本,不能只看目标事件出现得是否更多。[1]

四次试验的完整方差计算

对开头的事件取 h(x)=𝟏{K≥3}。在q下,K=3与K=4的概率分别为 27/64、81/256。一次加权贡献Y的均值为 𝔼Y=27641627+812561681=14+116=516. 二阶矩和方差分别为 𝔼Y2=2764(1627)2+81256(1681)2=1381, Var⁡(Y)=1381−25256=130320736≈0.062838. 直接模拟公平硬币时,单次贡献是成功概率 5/16 的0或1,方差为 (5/16)(11/16)=55/256≈0.214844。在同样N次四硬币模拟下,两种均值估计的方差之比约为0.2925;这项收益已经包含加权后的波动,而不是只比较成功次数。

将提议的正面概率记为一般的 r∈(0,1),逐条对四个三正面序列和一个四正面序列求和,可得一次贡献的二阶矩 M(r)=164r3(1−r)+1256r4. 若r过小,目标事件罕见,偶尔出现时权重很大;若r过于接近一,四正面虽常出现,三正面的提议概率却趋近零,第一项又会发散。增加事件出现概率并不等同于降低估计方差。

提议正面概率r变化时单次加权贡献的方差,四分之三附近较低,两端较高
纵轴采用对数刻度。金色虚线是直接模拟的方差55/256;圆点标出r=3/4。

直接运行的加权模拟

代码专门计算本篇的四次试验事件。为避免把极端权重的溢出混入教学,提议参数限定在 0.05≤r≤0.95;这只是此实现的范围,数学恒等式允许更广的提议分布。返回加权均值及其独立样本标准误估计。

Python 3
import math
import random

def four_coin_importance(n, r=0.75, seed=26):
    if type(n) is not int or n < 2:
        raise ValueError("at least two simulations required")
    if not math.isfinite(r) or not 0.05 <= r <= 0.95:
        raise ValueError("this example requires 0.05 <= r <= 0.95")
    rng = random.Random(seed)
    mean, m2 = 0.0, 0.0
    for i in range(1, n + 1):
        k = sum(rng.random() < r for _ in range(4))
        contribution = 0.0
        if k >= 3:
            proposal = r ** k * (1 - r) ** (4 - k)
            contribution = (1 / 16) / proposal
        delta = contribution - mean
        mean += delta / i
        m2 += delta * (contribution - mean)
    standard_error = math.sqrt(m2 / (n - 1) / n)
    return mean, standard_error

print(four_coin_importance(20000))
print("exact probability:", 5 / 16)

循环中每次更新均值和离差平方和,不存储全部样本;时间为 O(N)、额外空间为 O(1)。返回的标准误也是随机估计,尤其不能把一次运行中的小标准误视为支撑与尾部条件已被验证。若使用相关的链样本,需要另做相关误差分析。

未知归一化常数与使用边界

若只知道 p(x)=p~(x)/Z,Z未知,不能直接把 p~/q 当作已归一化权重代入无偏估计式。常用的自归一化重要性抽样是 μ~N=∑ih(Xi)w~i∑iw~i,w~i=p~(Xi)q(Xi). 这里需要比普通估计式更强的支撑条件:在整个p为正的区域,q都应几乎处处为正。再假设 0<Z<∞、∫|h|p<∞,则分母样本平均趋向Z,分子样本平均趋向Zμ,故在分母非零时可计算的比值估计一致;有限样本下一般有偏,因为期望不能穿过一个随机比值。[1]

例如目标在0、1各放二分之一概率,只想计算取值为1的概率。若提议只产生1,普通加权贡献恒为二分之一,仍准确覆盖了本积分的非零部分;但把同样的权重再作自归一化,分子与分母完全相同,结果恒为一。问题在于分母没有覆盖整个目标分布,不能恢复归一化常数。

变式。 在硬币例中将r设为1,只会模拟到四正面。即使对这个结果乘上目标概率 1/16,仍永远不会看到三正面的四条序列,平均只能得到 1/16。丢失的 1/4 正是提议支撑未覆盖的贡献。相反,若取r=1/2,权重恒为一,方法退回直接模拟,其方差就恢复为 55/256。

拒绝抽样保留或丢弃候选并产生目标样本;重要性抽样保留提议样本,通过权重估计目标积分。加权样本本身并未因此变成独立的目标分布样本。

参考资料

  1. ↑ 1.0 1.1 Art B. Owen:Monte Carlo theory, methods and examples,第9章 Importance sampling,§9.1,换分布恒等式、支撑条件与方差;§9.2,自归一化估计。访问日期:2026年10月26日。