蒙特卡洛 · 用随机性做计算
当维度太高、区域太复杂,确定性方法全线崩溃时,故意「掷骰子」反而能算。这一章从「扔飞镖估 π」讲清蒙特卡洛的原理,说明它 1/√N 的慢收敛为什么在高维里反而无敌(维度灾难),以及它在金融、物理、渲染里的地位。
蒙特卡洛 · 用随机性做计算
第二件利器反直觉:故意引入随机性来做确定的计算。这就是蒙特卡洛方法——名字来自摩纳哥的赌场。听起来像玄学,却是金融、物理、图形学、统计里最重要的工具之一。
扔飞镖估 π
先看最经典的例子:怎么用随机数估计 ? 往一个 的正方形里随机扔飞镖,数一数落在 圆内(到原点距离 )的比例。因为这个 圆面积是 ,落入比例应当趋近 ,于是:
import numpy as np
rng = np.random.default_rng(0)
n = 1_000_000
x, y = rng.random(n), rng.random(n) # 均匀撒 100 万个点
inside = (x**2 + y**2 <= 1).sum() # 落在 1/4 圆内的
print(4 * inside / n) # 3.141708 ≈ π没有解析几何、没有积分公式,纯靠随机撒点数比例,就把 估到了小数点后两三位。这就是蒙特卡洛的精髓:把「算一个量」转化为「对随机样本求平均」。
慢收敛:误差只按 1/√N 降
蒙特卡洛有个绕不开的软肋——收敛慢。它的误差按 下降:
意味着:精度每提高 10 倍,样本量得增加 100 倍。 想从 2 位有效数字到 3 位,样本要涨 100 倍;这在低维问题上,远远打不过前面梯形、Simpson 那种 、 的确定性方法。所以一维、二维的积分,别用蒙特卡洛——它慢且糙。那它的价值在哪?答案藏在「维度」这个词里。
杀手锏:高维,维度灾难
蒙特卡洛真正无可替代的地方,是高维。它 的收敛率有个惊人的性质:与维度无关。
而确定性的网格方法恰恰栽在维度上。想在 维空间上用网格积分,每维取 10 个点,总点数是 —— 就要 个点, 直接 ,彻底算不动。 这就是著名的维度灾难(curse of dimensionality)。
蒙特卡洛的收敛率 完全不看维度 ——不管是 3 维还是 300 维,同样数量的样本给出同样量级的误差。于是在高维里,格局彻底反转:网格法指数级爆炸、根本不可行,而蒙特卡洛稳稳地照跑不误。「低维用确定性方法,高维用蒙特卡洛」 就是这么来的。这也是为什么:
- 金融:期权定价常涉及几十上百个标的 / 时间步的高维积分 → 蒙特卡洛。
- 物理:统计力学、粒子输运的高维相空间积分 → 蒙特卡洛。
- 贝叶斯统计:高维后验分布采样 → 马尔可夫链蒙特卡洛(MCMC)。
- 图形学:光线追踪对光路空间积分(路径追踪)→ 蒙特卡洛渲染。
一个更实用的形态:蒙特卡洛积分
把估 的思路一般化,就是蒙特卡洛积分:要算 ,就在区域里均匀采 个点,用样本均值 × 区域体积来估:
# 估计 ∫₀¹∫₀¹ e^{-(x²+y²)} dx dy
rng = np.random.default_rng(1)
n = 1_000_000
x, y = rng.random(n), rng.random(n)
vals = np.exp(-(x**2 + y**2))
print(vals.mean()) # ≈ 0.5577 (区域体积为 1,直接就是均值)区域再怪、维度再高,只要能采样、能求值,蒙特卡洛就能给出估计——这种「不挑形状、不惧维度」的普适性,是它的立身之本。
小结与下一章
蒙特卡洛用随机采样做计算(扔飞镖估 是原型),核心是「把求一个量转成对随机样本求平均」。它误差按 慢收敛,低维打不过确定性方法;但收敛率与维度无关,于是在高维里反杀网格法的维度灾难,成为金融、物理、贝叶斯、渲染的支柱。
第三件、也是最后一件利器,是几乎渗透进一切现代应用(尤其机器学习)的最优化——怎么找到让一个函数最小的那个点。👉 最优化:梯度下降与找到最小值。
参考文献
- [1] Metropolis & Ulam.「The Monte Carlo Method.」1949. —— 蒙特卡洛开山之作。
- [2] Robert & Casella.《Monte Carlo Statistical Methods》—— MCMC 与统计采样。
- [3] Pharr, Jakob & Humphreys.《Physically Based Rendering》—— 蒙特卡洛渲染。