📘 目标
我们希望计算某个期望或小概率
其中 是目标分布。
直接从 (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:用指数偏移让分布自动“朝目标方向倾斜”,在稀有事件模拟中极其有效。