一个 d 维立方体里随便挑一个点,它离中心平均有多远?两种算法:把立方体切成网格逐格算,或者随机撒点求平均。三维以内网格完胜。到了十维,它需要 2.8 亿次求值,而随机撒点只要 214 次。
竖线是真实权重。关掉之后它爬到最近的那个峰就再也不动了——另外两个峰一个样本都没有。⚠ 而 Metropolis 那条也没完全收敛:3 万步下是 55/30/15,真值 45/33/22。它对,但要等。
同一个积分、同一个 1% 精度。网格是把每一维切成 m 段,逐格求值——总共 md 次;蒙特卡洛是随机撒 N 个点求平均——误差 σ/√N,式子里没有 d。
网格那个 m 不是拍的:中点法则误差 ≈ (d−1)·E[1/r] / (24 m² I),反解出 m。这条公式在 d = 2/3/4 上拿真网格验过,实测与预测之比 0.89 ~ 1.03。
⚠ 一个该说出来的毛刺:m 只能是整数。d = 30 时那个平方根算出来正好是 7.00,卡在 7 和 8 的分界上——差一个整数,总次数就差 55 倍(7³⁰ = 2.3×10²⁵ 对 8³⁰ = 1.2×10²⁷)。所以高维那一段该读的是量级,不是那几位有效数字。
别急着站队。d = 1 时网格只要 2 次求值就精确(中点法则对折线是准的),而蒙特卡洛要 3337 次。d = 2 是 49 比 1387,d = 3 是 343 比 838。
交叉点精确落在 d = 4,把滑块拖过去,两条线会当着你的面交叉。
⚠ 我原以为「精度要求越严,交叉点会往左移」——实测 5% / 1% / 0.1% 三档全是 4。而这不是巧合:中点法则是二阶的(代价 ~ ε−d/2),蒙特卡洛是 ε−2,两者相等正好在 d/2 = 2。交叉维度 = 2 × 求积公式的阶数,和精度无关。换成四阶的辛普森公式,交叉点就搬到 d = 8。
我原本以为蒙特卡洛是一条水平线——实测是下降的。σ 从 d=1 的 0.144 到 d=30 的 0.130,几乎不动;而答案本身 I = √(d/12) 在长大,于是相对误差 σ/I 越来越小。
背后是测度集中:维度越高,立方体里几乎所有点到中心的距离都差不多。同一个「高维」,把网格法压垮,却让蒙特卡洛变轻松。
三件事。① 低维它输,见左边第二张卡。② 收敛只有 1/√N —— 精度多要一位有效数字,样本要多 100 倍;中等维度上准蒙特卡洛(Sobol 序列)能赢它。
③ 最要命的是方差本身可能爆炸。换个被积函数——比如 d 维单位球的体积——高维下球只占立方体的 2.5×10⁻⁸,撒点几乎全落在球外,朴素蒙特卡洛照样要 10¹¹ 个样本。这正是 Metropolis 1953 要解决的问题:别均匀撒点,去它该在的地方撒。