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 年。
[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。重置
()将引擎重置为基本状态。