研究技能
拉丁超立方抽样:包含示例的简单指南
本文介绍拉丁超立方抽样(LHS)的基本原理、操作步骤及实际应用,帮助读者理解如何通过分层抽样,让每个输入变量的取值范围得到均匀覆盖。文章以具体示例说明样本点的生成与配对方式,比较LHS、蒙特卡洛抽样和Sobol序列等方法,并展示如何使用Python中的SciPy实现抽样。同时,分析其适用场景、优势、局限及常见错误,帮助研究人员在有限计算资源下更高效地进行模拟和不确定性分析。

拉丁超立方抽样是一种选择样本点的方法,目的是确保每个输入变量都得到均匀覆盖。你需要将每个输入变量划分为若干个相等的区间,并从每个区间中选取一个点。与普通随机抽样相比,这种方法能够更好地分散样本点,因此可以减少运行耗时较长的模型所需的次数。
它解决了什么问题
假设你的计算机模型有三个输入变量,每次运行都需要一个小时。你只能负担大约50次运行,但仍然希望测试每个输入变量的完整取值范围。
随机抽样可能会让你失望。由于随机性,许多样本点可能集中在某个角落,而其他区域却没有任何样本点。这种方法有助于避免这种情况。
拉丁超立方抽样如何工作
规则如下。如果你想要n个样本点,就将每个输入变量划分为n个概率相等的区间。从每个区间中恰好选取一个点。然后随机打乱不同输入变量之间区间的配对方式。
McKay、Beckman和Conover在1979年发表于《Technometrics》期刊的一篇论文中介绍了这种方法。如今,它广泛应用于模拟、不确定性检验以及依赖计算机模型的定量研究。
五个样本点的示例
让我们对两个输入变量X和Y进行抽样,它们的取值范围都在0到1之间。我们需要5个样本点。
为每个输入变量创建5个区间。每个区间的宽度为0.2:0到0.2、0.2到0.4、0.4到0.6、0.6到0.8,以及0.8到1。
在每个区间内选择一个X值:0.12、0.31、0.55、0.78、0.93。
在每个区间内选择一个Y值:0.07、0.35、0.47、0.64、0.86。
打乱Y值的顺序,然后将它们与X值配对。
以下是一种可能的结果:
样本点 | X | Y | X区间 | Y区间 |
1 | 0.12 | 0.47 | 第1个 | 第3个 |
2 | 0.31 | 0.86 | 第2个 | 第5个 |
3 | 0.55 | 0.07 | 第3个 | 第1个 |
4 | 0.78 | 0.64 | 第4个 | 第4个 |
5 | 0.93 | 0.35 | 第5个 | 第2个 |
以下是在5乘5网格中的展示:
X1 | X2 | X3 | X4 | X5 | |
Y5 | ● | ||||
Y4 | ● | ||||
Y3 | ● | ||||
Y2 | ● | ||||
Y1 | ● |
每一行和每一列都恰好包含一个样本点。不同的随机排列会产生不同的样本,但其效果同样好。
为什么称为“拉丁超立方”?
拉丁方是一个网格,其中每个符号在每一行和每一列中都只出现一次。这种方法遵循相同的规则。超立方体则是将这一概念扩展到两个以上输入变量的情况。
拉丁超立方抽样与其他方法的比较
方法 | 样本点的选择方式 | 优势 | 不足之处 |
简单随机抽样(蒙特卡洛) | 每个样本点都是独立的 | 简单,适用于任何规模 | 可能出现空白区域和样本点聚集 |
拉丁超立方抽样 | 每个输入变量的每个区间选择一个点 | 每个输入变量都能得到均匀覆盖 | 不同变量的组合仍可能集中在一起 |
完全网格 | 每种水平组合都进行抽样 | 完整覆盖 | 10个水平和6个输入变量意味着需要运行1,000,000次 |
Sobol或Halton序列 | 使用固定且均匀分布的序列 | 通常分布更加均匀 | 在某些情况下灵活性较低 |
SciPy文档指出,使用这种方法得到的n个样本点所计算出的估计值,其方差不会高于使用少一个样本点的普通蒙特卡洛方法。此外,当每个输入变量对结果产生各自独立的影响时,这种方法的效果最好。
Oracle的Crystal Ball文档指出,在达到相同准确度的情况下,与蒙特卡洛方法相比,它需要的试验次数更少。SciPy还指出,经过扰乱的Sobol和Halton序列可能表现得更好。
它也不同于日常的数据收集方法,例如调查问卷。在这里,你选择的是模型的参数设置,而不是选择调查对象。
如何在Python中运行
SciPy只需几行代码就可以完成拉丁超立方抽样:
from scipy.stats import qmc
sampler = qmc.LatinHypercube(d=2, seed=42)
sample = sampler.random(n=5)
scaled = qmc.scale(sample, [0, 2], [10, 5])
前面的代码用于为2个输入变量选择5个样本点。最后一行代码将它们转换为实际取值范围:X从0到10,Y从2到5。
SciPy文档列出了一些实用选项。Scramble会将样本点随机放置在每个单元格内。Optimization可以改善样本点在空间中的均匀分布,但需要消耗更多计算时间。将Strength设置为2可以构建正交数组版本,但只适用于某些特定的样本数量。
想要一个符合钟形曲线的输入变量?使用该分布的逆累积分布函数转换每一列。在SciPy中,这就是ppf方法。
什么时候使用它
当每次模型运行都非常缓慢或成本较高时,可以使用这种方法。如果你有多个输入变量,并且希望测试每个变量的整个取值范围,它也是一个不错的选择。人们经常使用它进行不确定性检验以及构建代理模型。
如果你之后需要增加样本点,就应该仔细考虑。普通版本会提前固定n的数量,而额外增加样本点会破坏每个区间恰好选择一个点的规则。Sobol序列则更容易扩展。
如果你的输入变量之间存在很强的相关性,就需要格外小心。基本方法假设这些输入变量彼此独立。
局限性和常见错误
每个输入变量得到均匀覆盖,并不意味着整个空间也得到了均匀覆盖。一组沿对角线分布的样本点仍然符合拉丁超立方的规则,但空间覆盖效果却很差。这就是为什么会出现优化版本。
不存在神奇的样本数量。一些研究人员建议每个输入变量大约使用10个样本点作为起点,但这只是一条经验法则。
注意避免以下错误。不要忘记将单位区间中的数值转换为实际取值范围。对于不服从均匀分布的输入变量,不要跳过逆累积分布函数转换步骤。还要设置随机种子,以便重复获得相同的结果。
此外,使用不同的随机种子运行几次。使用类似变异系数这样的指标比较结果,以了解它们的稳定程度。
最后的思考
拉丁超立方抽样能够以较少的运行次数,让每个输入变量都得到均匀覆盖。可以先在一个小型模型上尝试。使用SciPy生成10个样本点,将它们绘制出来,再与10个普通随机样本点进行比较。
常见问题
它比随机抽样更好吗?
对于小样本和运行缓慢的模型,通常是的。它能够确保每个输入变量的取值范围都得到均匀覆盖。
我可以之后增加更多样本点吗?
不能直接增加。请提前规划样本数量,或者考虑使用Sobol序列。
它适用于其他分布吗?
适用。首先在概率范围内进行均匀抽样,然后使用该分布的逆累积分布函数转换数值。
我需要多少个样本?
这取决于你的输入变量和模型。从你的预算开始,使用几个不同的随机种子进行测试,如果结果持续变化,就增加样本点。
什么是科言猫?
科言猫 让你能够搜索超过6500万篇研究论文,并阅读人工智能生成的摘要。你可以在几分钟内找到关键研究发现、研究方法和引用文献。


