scipy.stats.qmc.

LatinHypercube#

class scipy.stats.qmc.LatinHypercube(d, *, scramble=True, strength=1, optimization=None, seed=None)[源代码]#

拉丁超立方采样 (LHS)。

拉丁超立方采样 [1] 会在 \(n\) 中生成 \([0,1)^{d}\) 个点。每个单变量边缘分布都是分层的,在 \([j/n, (j+1)/n)\) 中放置恰好一个点,\(j=0,1,...,n-1\) 时适用。当 \(n << d\) 时,它们仍然适用。

参数:
dint

参数域的维度。

scramblebool,可选

为 False 时,将在多维网格的单元格内居中采样。否则,将在网格的单元格内随机放置采样。

说明

设置 scramble=False 并不能保证确定性输出。为此,请使用 seed 参数。

默认值为 True。

在版本 1.10.0 中添加。

optimization{None, “random-cd”, “lloyd”}, 可选

是否使用优化方案来提高采样后的质量。请注意,这是一个后期处理步骤,不能保证所有样本性质都得到保留。默认值为 None。

  • random-cd: 用于降低中心离差的坐标随机置换。基于中心离差确定最佳样本将不断更新。基于中心离差的采样显示出比使用其他离差度量对 2D 和 3D 子投影更好的空间填充鲁棒性。

  • lloyd: 使用修改后的 Lloyd-Max 算法扰动样本。该过程收敛到间隔相等的样本。

在版本 1.8.0 中添加。

在版本 1.10.0 中更改: 添加 lloyd

strength{1, 2}, 可选

LHS 的强度。 strength=1 产生一个普通的 LHS,而 strength=2 产生一个基于强度 2 的正交阵列 LHS [7][8]。在这种情况下,只能采样 n=p**2 个点,其中 p 是一个素数。它还约束 d <= p + 1。默认值为 1。

在版本 1.8.0 中添加。

seed{None、int、numpy.random.Generator}, 可选

如果 seed 是 int 或 None,则使用 np.random.default_rng(seed) 创建一个新的 numpy.random.Generator。如果 seed 已经是 Generator 实例,则使用所提供的实例。

注释

当 LHS 用于对函数 \(f\) 进行积分时 \(n\) 时,LHS 在近似加法的被积函数上非常有效 [2]。有了 \(n\) 个点的 LHS,积分的方差总是低于 \(n-1\) 个点的普通 MC [3]。有一个针对积分均值和方差的 LHS 中心极限定理 [4],但由于随机性不一定适用于优化的 LHS。

如果 \(A\) 的每个 n 行 t 列子矩阵中,所有 \(p^t\) 种可能的不同行出现相同次数,则称 \(A\) 为强度 \(t\) 的正交阵列。 \(A\) 的元素在集合 \(\{0, 1, ..., p-1\}\),称为符号。 \(p\) 必须是素数是为了允许模运算。增加强度可在样本的子投影中增加一些对称性。强度为 2 时,样本沿 2D 子投影的对角线对称。这可能令人不希望,但另一方面,样本离散度得到改善。

强度 1(普通 LHS)优于强度 0(MC),而强度 2 是优于强度 1 的一个有用的增量。增加到强度 3 是一个较小的增量,而 Sobol’、Halton 等扰动 QMC 则性能更高 [7]

要创建强度为 2 的 LHS,正交阵列 \(A\) 通过对符号集合应用随机、双射映射到自身。例如,在第 0 列,所有 0 可能变为 2;在第 1 列,所有 0 可能变为 1,等等。然后,对于每个列 \(i\) 和符号 \(j\),我们在子数组中添加大小为 \(p\) 的普通一维 LHS,其中 \(A^i = j\)。最后将结果矩阵除以 \(p\)

参考资源

[1]

Mckay 等,“分析计算机代码输出时,用于选择输入变量值的三种方法的比较”。测量技术,1979 年。

[2]

M. Stein,“使用拉丁超立方体抽样的模拟的大样本属性”。测量技术 29,第 2 期:143-151,1987 年。

[3]

A. B. Owen,“扰动网格正交积分的蒙特卡罗方差”。SIAM 数值分析杂志 34,第 5 期:1884-1910,1997 年

[4]

Loh,W.-L.“关于拉丁超立方体抽样”。统计年鉴 24,第 5 期:2058-2080,1996 年。

[5]

Fang 等,“用于计算机实验的设计和建模”。计算机科学与数据分析系列,2006 年。

[6]

Damblin 等, “空间填充设计的数值研究:拉丁超立方体样本的优化和子投影属性”,《模拟杂志》,2013 年。

[7] (1,2)

A.B. 欧文, “用于计算机实验、积分和可视化的正交阵列”,《统计学报》,1992 年。

[8]

B. 唐, “基于正交阵列的拉丁超立方体”。《美国统计协会杂志》,1993 年。

[9]

苏珊·K·西霍尔姆等,“拉丁超立方体抽样以及蒙特卡罗流行病模型的敏感性分析”。《生医计算机国际杂志》,23(1-2),97-112,DOI:10.1016/0020-7101(88)90067-0,1988 年。

示例

[9] 中,拉丁超立方体抽样策略被用于对参数空间进行抽样,以研究流行病模型每个参数的重要性。此类分析也称为敏感性分析。

由于问题的维数很高(6),因此覆盖该空间在计算上很昂贵。当实验成本昂贵时,QMC 可以进行如果使用网格则无法进行的分析。

该模型的六个参数分别代表生病概率、退出概率以及四个接触概率,作者假设所有参数都服从均匀分布并生成了 50 个样本。

使用 scipy.stats.qmc.LatinHypercube 复制该协议,第一步是在单位超立方体中创建样本

>>> from scipy.stats import qmc
>>> sampler = qmc.LatinHypercube(d=6)
>>> sample = sampler.random(n=50)

然后可以将该样本缩放到适当的边界内

>>> l_bounds = [0.000125, 0.01, 0.0025, 0.05, 0.47, 0.7]
>>> u_bounds = [0.000375, 0.03, 0.0075, 0.15, 0.87, 0.9]
>>> sample_scaled = qmc.scale(sample, l_bounds, u_bounds)

此类样本被用于运行模型 50 次,并且构建了多项式响应面。这使得作者能够研究在所有其他参数的各种可能性范围内,每个参数的相对重要性。在这个计算机实验中,与网格抽样相比,他们展示了在保持响应面误差低于 2% 所需的样本数量减少了 14 倍。

以下显示了其他示例,展示了构建甚至更好覆盖空间的 LHS 的替代方法。

将基本 LHS 用作基准。

>>> sampler = qmc.LatinHypercube(d=2)
>>> sample = sampler.random(n=5)
>>> qmc.discrepancy(sample)
0.0196...  # random

使用 优化 关键字参数生成在更高的计算成本下具有更低差异的 LHS。

>>> sampler = qmc.LatinHypercube(d=2, optimization="random-cd")
>>> sample = sampler.random(n=5)
>>> qmc.discrepancy(sample)
0.0176...  # random

使用 强度 关键字参数生成基于强度为 2 的正交阵列 LHS。在这种情况下,样本点的数量必须是素数的平方。

>>> sampler = qmc.LatinHypercube(d=2, strength=2)
>>> sample = sampler.random(n=9)
>>> qmc.discrepancy(sample)
0.00526...  # random

可以对选项进行组合,生成基于优化居中正交阵列的 LHS。优化后,结果不保证具有强度 2。

方法

fast_forward(n)

将序列快进 n 个位置。

integers(l_bounds, *[, u_bounds, n, ...])

l_bounds(包含)到 u_bounds(不包含),或如果 endpoint = True,则从 l_bounds(包含)到 u_bounds(包含)中抽取 n 个整数。

random([n, workers])

在半开区间 [0, 1) 中抽取 n

重置()

将引擎重置为基本状态。