2. Monte Carlo方法基础:随机数生成、大数定律、蒙特卡洛积分的基本原理
Monte Carlo方法的核心思想是利用随机性解决确定性问题。在早期预警信号的参数校准中,我们经常需要从复杂的概率分布中采样,或计算高维积分——这正是Monte Carlo方法的优势所在。本章将建立三个基石:高质量的随机数生成、大数定律的理论保证、以及Monte Carlo积分的基本实现。
2.1 随机数生成:从均匀分布到任意分布
所有Monte Carlo模拟的起点都是均匀随机数。计算机生成的是伪随机数——由确定性算法产生的、统计上近似独立的序列。现代标准生成器是梅森旋转算法(Mersenne Twister, MT19937),周期长达 \(2^{19937}-1\),通过严格的统计检验。
| 随机数类型 | 生成方法 | Python实现 | 适用场景 |
|---|---|---|---|
| 均匀分布 U(0,1) | 线性同余 / 梅森旋转 | np.random.rand() |
所有Monte Carlo基础采样 |
| 正态分布 N(μ,σ²) | Box-Muller变换 / Ziggurat算法 | np.random.normal() |
噪声建模、参数扰动 |
| 指数分布 Exp(λ) | 逆变换法:\(X = -\ln(U)/\lambda\) | np.random.exponential() |
事件间隔时间、泊松过程 |
| 任意分布 | 逆变换法 / 接受-拒绝采样 | 自定义函数 | 后验分布采样、重要性采样 |
逆变换法(Inverse Transform Method)
对于累积分布函数 \(F(x)\) 可逆的分布,生成步骤为:
- 从均匀分布生成 \(U \sim U(0,1)\)
- 计算 \(X = F^{-1}(U)\)
例如指数分布:\(F(x) = 1 - e^{-\lambda x}\),逆函数为 \(X = -\ln(1-U)/\lambda\)。
import numpy as np
def inverse_transform_exponential(lambda_param, size=1000):
"""逆变换法生成指数分布样本"""
u = np.random.uniform(0, 1, size)
return -np.log(1 - u) / lambda_param
# 验证:生成10000个样本,均值应接近 1/lambda
samples = inverse_transform_exponential(2.0, 10000)
print(f"样本均值: {np.mean(samples):.4f} (理论: {1/2.0:.4f})")
2.2 大数定律:Monte Carlo收敛的理论基石
大数定律(Law of Large Numbers, LLN)保证了Monte Carlo估计的一致性:当样本量 \(N \to \infty\) 时,样本均值以概率1收敛于总体期望。
在Monte Carlo积分中,这意味着:
- 无偏性:估计量的期望等于真实积分值
- 收敛速度:误差以 \(O(1/\sqrt{N})\) 衰减,与问题维度无关——这是Monte Carlo方法相对于确定性数值积分在高维问题中的核心优势
- 误差估计:中心极限定理给出误差的渐近正态分布,可构造置信区间
2.3 Monte Carlo积分:基本原理与实现
考虑计算定积分 \(I = \int_a^b f(x) dx\)。Monte Carlo积分的基本思想是:
- 重写为期望形式: \(I = (b-a) \cdot \mathbb{E}[f(U)]\),其中 \(U \sim U(a,b)\)
- 用样本均值估计: \(\hat{I}_N = \frac{b-a}{N} \sum_{i=1}^N f(U_i)\)
- 误差分析:方差 \(\text{Var}(\hat{I}_N) = \frac{(b-a)^2}{N} \text{Var}(f(U))\)
经典示例:计算圆周率 π
单位圆面积的四分之一:\(\pi/4 = \int_0^1 \int_0^1 \mathbf{1}(x^2+y^2 \leq 1) \, dx\, dy\)
import numpy as np
def monte_carlo_pi(N):
"""用Monte Carlo方法估算圆周率"""
x = np.random.uniform(0, 1, N)
y = np.random.uniform(0, 1, N)
inside = np.sum(x**2 + y**2 <= 1)
return 4 * inside / N
# 不同样本量的估计结果
for N in [100, 1000, 10000, 100000]:
pi_est = monte_carlo_pi(N)
error = abs(pi_est - np.pi)
print(f"N={N:6d}: π ≈ {pi_est:.6f}, 误差 = {error:.6f}")
2.4 高维积分:Monte Carlo的维度优势
确定性数值积分(如梯形法则、Simpson法则)的误差随维度 \(d\) 指数增长——维度灾难(Curse of Dimensionality)。Monte Carlo积分的误差 \(O(1/\sqrt{N})\) 与维度无关,使其成为高维问题的首选方法。
| 方法 | 误差阶 | 维度依赖性 | 适用维度 |
|---|---|---|---|
| 梯形法则 | \(O(N^{-2/d})\) | 指数恶化 | d ≤ 3 |
| Simpson法则 | \(O(N^{-4/d})\) | 指数恶化 | d ≤ 5 |
| 稀疏网格 | \(O(N^{-r} (\log N)^{d-1})\) | 对数增长 | d ≤ 10 |
| Monte Carlo | \(O(N^{-1/2})\) | 与d无关 | 任意d |
| 拟Monte Carlo | \(O((\log N)^d / N)\) | 对数增长 | d ≤ 30 |
2.5 在早期预警信号中的意义
在早期预警信号的参数校准中,Monte Carlo方法用于:
- 参数后验分布采样:从参数空间中随机采样,评估不同参数组合下预警信号的性能
- 临界值校准:通过Monte Carlo模拟生成零假设下的统计量分布,确定预警阈值
- 鲁棒性评估:在参数不确定性下,量化预警信号的误报率和漏报率
np.random.seed() 固定随机种子,确保结果可复现。