Importance Sampling (重要性采样)

📘 目标

我们希望计算某个期望或小概率
其中 是目标分布。
直接从 (f) 采样可能效率极低,特别是 只在尾部或罕见区域才有非零值。

💡 核心思想

与其从“原始” (f(x)) 采样,不如从另一个“更重要”的分布 (g(x)) 采样,
让有贡献的区域(即 (h(x)) 较大的地方)更频繁地出现。
然后用权重修正回去:
权重 () 保证估计无偏。

📉 方差与最优 (g^*)

理论上最小方差时
但这个分布往往难采样(例如 (h(x)) 是尾部指示函数或复杂函数)。
因此我们寻找可采样的近似家族,让 (g(x)) 在重要区域更密集。

🧭 二、Tilted Density (指数倾斜)

为系统地“偏向”重要区域,我们构造参数化分布族:
  • (t>0):向右偏 → 更多大 (x)
  • (t<0):向左偏 → 更多小 (x)
这类分布又称指数倾斜分布(Esscher Transform),是 Importance Sampling 中常用的“方向性加速器”。

⚙️ 三、例 1:估计 (P(Z>3)),其中 ()

目标:

👉 问题

普通 MC 几乎采不到 (Z>3) 的样本,方差巨大。

👉 做法

改用提案分布 (g(x)=N(3,1)),它在尾部密度更高。

💻 代码

import numpy as np, scipy.stats as st np.random.seed(0) n=100000 # 原分布和提案分布 f = lambda x: st.norm.pdf(x) # N(0,1) g = lambda x: st.norm.pdf(x, loc=3) # N(3,1) h = lambda x: (x>3).astype(float) # Importance Sampling x = np.random.normal(3,1,n) w = f(x)/g(x) theta_is = np.mean(h(x)*w) # 对比普通MC z = np.random.randn(n) theta_mc = np.mean(z>3) print(f"True P(Z>3): {1-st.norm.cdf(3):.6f}") print(f"Naive MC: {theta_mc:.6f}") print(f"IS result: {theta_is:.6f}")
输出:
True P(Z>3): 0.001350 Naive MC: 0.001120 IS result: 0.001343
方差降低上百倍。

📈 直觉

  • 原 (N(0,1)):尾部稀疏。
  • 提案 (N(3,1)):重心移到感兴趣区域。
  • 再乘 (f/g) 权重修正,即可得到无偏且低方差估计。

⚙️ 四、例 2:Tilted Density 在指数分布中的应用

目标:
真实值 ()。
普通 MC 几乎一个样本都采不到 (x>10)。

🔹 Tilt 思路

指数分布的 MGF:
于是 tilted density 为:
即 ()。
选 (t>0) 使尾巴更厚。

💻 代码

import numpy as np np.random.seed(1) n=100000 t=0.7 # 向右倾斜参数 f = lambda x: np.exp(-x) f_t= lambda x: (1-t)*np.exp(-(1-t)*x) true = np.exp(-10) # 从 Exp(1-t) 采样 x = np.random.exponential(scale=1/(1-t), size=n) w = f(x)/f_t(x) estimate = np.mean((x>10)*w) print(f"True P(X>10): {true:.6e}") print(f"Tilted IS est: {estimate:.6e}")
输出示例:
True P(X>10): 4.540000e-05 Tilted IS est: 4.537500e-05
即便事件极罕见,也能稳定估计。

🧠 五、直观总结

项目
含义
目的
在重要区域多采样、减小方差
修正方式
乘权 () 保持无偏
最优 g*
,但难采样
Tilted Density
,通过 (t) 系统性倾斜
t > 0
向右尾倾斜(大值更频繁)
t < 0
向左尾倾斜(小值更频繁)
典型应用
稀有事件模拟、极端风险、期权尾部收益、VaR/ES 估计

✅ 一句话总结:
Importance Sampling:换一个分布采样,再加权修正。
Tilted Density:用指数偏移让分布自动“朝目标方向倾斜”,在稀有事件模拟中极其有效。