分层抽样模拟器 返回
统计·蒙特卡洛

分层抽样模拟器

这是一个免费工具,用于体验「分层抽样」如何以零成本提升蒙特卡洛积分的精度。将区间 [0,1] 分割为若干层,从各层均匀取样,随机数的「聚集」现象会消失,推定值的标准误差随之下降。你可以实时改变层数、总样本数、被积分函数,观察与普通蒙特卡洛的差异。

参数设置
层的数量 S
区间 [0,1] 等分割的小区间(层)数量。当 S=1 时等同于普通蒙特卡洛
总样本数 n
用于积分估计的随机点总数。将大约均匀分配到各层
随机数种子
伪随机数的种子。相同的值会产生完全相同的结果
被积函数 f(x)
在区间 [0,1] 上进行积分 I = ∫₀¹ f(x) dx 的目标函数
计算结果
普通MC估计值
分层估计值
精确值
普通MC标准误差
分层标准误差
方差降低率 (%)
层边界与样本配置 — f(x) 曲线上的覆盖

区间 [0,1] 被竖线分割成若干层,各层内都必定有样本点(青色)。这样就不会出现普通MC中「点聚集」或「某层为空」的现象,这正是分层的核心要点。

估计值收敛 — 估计值随样本数增长的变化
标准误差 vs 层数
理论·核心公式

$$\hat I_{strat}=\sum_{k=1}^{S} w_k\,\bar f_k,\qquad w_k=\frac{1}{S}$$

分层估计量。将区间 [0,1] 分成 S 个等宽的层,各层样本均值 f̄_k 按层宽 w_k 加权求和。等宽时 w_k = 1/S。

$$\operatorname{Var}(\hat I_{strat})=\sum_k \frac{w_k^2\,\sigma_k^2}{m_k}\le \operatorname{Var}(\hat I_{plain})$$

分层估计量的方差。σ_k² 为第 k 层内 f 的方差,m_k 为分配给该层的样本数。分层方差绝不会超过普通MC的方差。

分层的收益随着层数 S 增大而增大,函数 f 在层间的变化越剧烈效果越显著。

什么是分层抽样

🙋
蒙特卡洛法求积分就是撒大量随机数然后取平均啊。那「分层抽样」有什么不同呢?
🎓
简单说就是「整理随机数的撒放方式,白白地提升精度」的方法。普通蒙特卡洛在 [0,1] 中完全随机撒点。但完全随机会导致点偶然聚集,或者某些区间被完全遗漏。分层抽样提前把区间分成若干个等宽的「层」,然后确保各层都要放入一定数量的点。这样「某处完全没点」的情况就不会发生,能无遗漏地覆盖被积分函数的全貌。
🙋
把点整列起来了的话,那就不是随机数了吧。这样真的还能正确算出积分吗?
🎓
这是个好问题。其实是在层的内部使用真正的随机数。比如10层的情况,第1层在 [0,0.1] 范围内取均匀随机数,第2层在 [0.1,0.2] 范围内取均匀随机数,以此类推。然后各层的平均值用层宽加权后求和,得到估计量 Î_strat = Σ w_k f̄_k。这和普通MC一样是指向真正积分值的「无偏估计量」,目标不偏离。变化的只是波动的大小。上面的函数曲线图里可以看到,竖线分割的每个层内都有点分布,这就是分层的核心。
🙋
目标中心相同,只是波动减少啦。那为什么分层就能减少波动呢?
🎓
关键是「方差分解」。总的波动可以分解成两部分:『层与层之间的波动』和『层内部的波动』。完全随机的蒙特卡洛会直接受到『层间波动』的影响——点可能偏向左边或右边。但分层抽样因为各层都要取样,所以『层间波动』这部分影响就干干净净地消失了,剩下的只是『层内波动』。函数在层间变化越剧烈,层间波动就越大,分层消除掉的也就越多。
🙋
那把层数增加的话,误差就越来越小喽?上面的「层数」滑块往上拨,标准误差确实在不断下降呢。
🎓
完全正确。层越细,每层的宽度就越窄,层内就几乎可以把函数看作常数,层内波动 σ_k² 也随之变小,标准误差单调下降。极端的话,1层分1个点,几乎就是规则网格的配置,误差最小。但实践中有个限制:如果层数超过总样本数,有些层就会得不到点,配分方案就崩溃了。所以必须保证每层至少有一个点。
🙋
一维的话层数增加就没问题了,那是不是什么问题都用这个最好啊?有什么陷阱吗?
🎓
最大的陷阱就是「维度诅咒」。一维时只需分成10层,但10维时每维都分10层的话,层数就变成 10 的 10 次方,即100亿层。不可能给每层都放点啊。所以高维情况下要用「拉丁超立方体采样(LHS)」——分层抽样的高维聪明版本,在各维都等分的同时,巧妙地随机组合各层,避免爆炸。本工具是一维积分,能直接感受分层抽样最纯粹的效果。在实务中,可靠性分析和金融风险情景生成都在用这种思想。

常见问题

分层抽样(分层抽取)是减少蒙特卡洛估计方差(波动)的一种方法。它将要抽样的区间 [0,1] 预先分割成不重叠的多个小区间(层),为各层分配一定数量的样本。与普通蒙特卡洛法不同,普通蒙特卡洛的随机数可能会偶然聚集或某些区间被完全遗漏,而分层抽样保证「每个层都必须包含样本」,因此能无遗漏地捕捉被积分函数的全貌,降低估计的标准误差。
总方差可分解为「层内波动」和「层间波动」(方差分解公式)。分层抽样从各层确实取样,能完全消除层间波动对估计的影响,剩余的仅为层内波动。函数 f 在层间变化越大,层间波动越大,分层消除这种波动的效果就越显著。反之,如果 f 在层内基本恒定,来自该层的样本就会非常有效。即使不采用最优配分而仅均匀配分,分层抽样的方差也不会超过普通蒙特卡洛的方差。
原则上,层数越多,每层宽度越窄,层内波动越小,因此标准误差单调下降。极端情况下,分割到每层一个样本时,配置接近规则网格,误差最小。但实际中,如果层数超过总样本数,会有些层无法获得样本,配分方案就会崩溃。高维情况下还存在「维度诅咒」:层数会按维度指数爆炸。本工具处理的是一维问题,层数越多越有利,但必须确保每层至少获得一个样本。
分层抽样是一类方法的统称,即沿各维度(或目标空间)将其分层,并从各层取样。一维情况下就是直接等分区间。高维时若填满所有层的格点会造成层数爆炸,所以拉丁超立方体采样(LHS)是分层抽样的巧妙高维版本:在各维度等分的同时,「确保每个维度的每层恰好使用一次」,通过随机组合层来避免爆炸。本工具处理的是一维积分,能直接体验最基础的分层抽样本身。

实际应用

CAE·概率论设计(蒙特卡洛有限元):在结构分析和流体分析中考虑材料性质、荷载、尺寸等的变异性时,从这些参数的概率分布中生成大量样本来反复运行分析。由于每次分析代价高,采用分层抽样把输入空间分层、从各层确保取样的方式,能在保持相同置信区间宽度的条件下大幅减少所需的分析次数。特别是当响应对输入单调变化时,分层的效果最为明显。

金融工程·风险情景生成:用蒙特卡洛法评估投资组合的损益分布或 VaR(风险价值)时,将股票回报等风险因子的分布分层,从各层均匀生成场景。完全随机的情况下「极端下跌情景」可能会意外稀少,但分层能确保对尾部区域的覆盖,使尾部风险的估计更加稳定。

民意调查·统计调查的样本设计:分层抽样本来就源自统计调查的样本抽取。把总体按年龄、地区、职业等特征分层,从各层抽取规定人数,防止某些层因偶然因素被完全遗漏而导致估计偏差。「分层抽取法」是调查统计学的基础中的基础,本工具的数值积分版本正是从其数学核心在一维提炼出来的。

渲染·计算机图形学:逼真的渲染(光线追踪)在像素内采样和光源方向采样时都用蒙特卡洛积分。纯粹随机会产生噪声(颗粒感),所以标准做法是把像素分成小格子,从各格子各取一个样本,这种「抖动采样」其实就是分层抽样的应用,能用更少样本得到光滑的图像。

常见误解与注意事项

最大的误解是「分层抽样改变估计值本身=引入偏差」。实际上恰恰相反:分层估计量 Î_strat 和普通MC估计量一样,都是指向真正积分值的无偏估计。各层的样本均值是该层积分的无偏估计,按层宽正确加权求和的限度内,分层不会引入偏差。只有波动的宽度会改变。这个模拟器中,普通MC和分层估计都指向真正的精确值(比如 f(x)=x² 时是 1/3),变化的仅是「波动的大小」,而非目标的偏离。

其次,「均匀配分总是最优的」这个思想不对。本工具用的是「按各层平均分配」的均匀配分,实现简单,且必定不劣于普通MC。但理论上分散最小化的是「Neyman配分」:层内波动 σ_k 越大的层,分配的样本越多。也就是说,函数变化剧烈的层要重点密集采样。当实务中需要最后的精度优化时,可考虑Neyman配分或自适应分层。但均匀配分决不会产生害处。

最后,「分层在任何维度都能直接用」是误解。一维时区间分 S 段就行,但 d 维时若要填满所有层的格点,层数会是 S 的 d 次方,爆炸式增长。10维各分10层就是100亿层,不现实。为了避免这个「维度诅咒」,高维下使用拉丁超立方体采样(LHS)或准随机数列(准蒙特卡洛法)。分层抽样的直接有效性在本工具这样的低维问题上最为明显。维度越高,分层设计的工程性越强,绝非直来直往。

使用指南

  1. 设置「层数」参数(默认4~20),确定积分区域的等分层数
  2. 指定「样本数」(默认1000~10000),设定各层的抽取样本数
  3. 输入「种子值」确保随机数的可重现性,然后点击模拟运行按钮
  4. 对比普通MC估计值和分层估计值,查看标准误差和方差降低率(%)的差异

具体计算例

∫[0,1]x^2 dx(精确值=0.333)的积分测试:层数8、样本数5000的情况,普通MC的标准误差为0.0087,而分层抽样降低至0.0032。方差降低率达86.5%。同样样本数下,分层方法使置信区间宽度缩小到原来的1/2.7。在金融风险评估的VaR计算(积分维数5)中,分层实现了精度相同但计算时间节省15分钟。

实务中的注意