arrow

研究技能

拉丁超立方抽样:包含示例的简单指南

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

拉丁超立方抽样:包含示例的简单指南

拉丁超立方抽样是一种选择样本点的方法,目的是确保每个输入变量都得到均匀覆盖。你需要将每个输入变量划分为若干个相等的区间,并从每个区间中选取一个点。与普通随机抽样相比,这种方法能够更好地分散样本点,因此可以减少运行耗时较长的模型所需的次数。

它解决了什么问题

假设你的计算机模型有三个输入变量,每次运行都需要一个小时。你只能负担大约50次运行,但仍然希望测试每个输入变量的完整取值范围。

随机抽样可能会让你失望。由于随机性,许多样本点可能集中在某个角落,而其他区域却没有任何样本点。这种方法有助于避免这种情况。

拉丁超立方抽样如何工作

规则如下。如果你想要n个样本点,就将每个输入变量划分为n个概率相等的区间。从每个区间中恰好选取一个点。然后随机打乱不同输入变量之间区间的配对方式。

McKay、Beckman和Conover在1979年发表于《Technometrics》期刊的一篇论文中介绍了这种方法。如今,它广泛应用于模拟、不确定性检验以及依赖计算机模型的定量研究。

五个样本点的示例

让我们对两个输入变量X和Y进行抽样,它们的取值范围都在0到1之间。我们需要5个样本点。

  1. 为每个输入变量创建5个区间。每个区间的宽度为0.2:0到0.2、0.2到0.4、0.4到0.6、0.6到0.8,以及0.8到1。

  2. 在每个区间内选择一个X值:0.12、0.31、0.55、0.78、0.93。

  3. 在每个区间内选择一个Y值:0.07、0.35、0.47、0.64、0.86。

  4. 打乱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万篇研究论文,并阅读人工智能生成的摘要。你可以在几分钟内找到关键研究发现、研究方法和引用文献。