我想在基于 SciPy 的模拟中使用准随机序列,特别是 Sobol。对现有的高效软件包有什么建议吗?
PyTorch 现在提供了一些选项。 其中之一是加扰 Sobol 数生成器,它可以生成高达 ~1k 的更高维度的准随机数
https://pytorch.org/docs/stable/ generated/torch.quasirandom.SobolEngine.html
另一种选择是使用现在有此选项的 Scipy https://docs.scipy.org/doc/scipy/reference/ generated/scipy.stats.qmc.Sobol.html
对于 Sobol 序列,请尝试 sobol_seq。
一般来说,我发现的处理拟随机序列的最佳软件包是diversipy。
还有一些专注于特定实现的软件包,例如 sudoku_lhs 处理 Latin Hypercubes 和 Sudoku 类型 Constraint 变体。
pyDOE 至少实现了 Latin Hypercube(也许更多)。
我发现的最有趣的包是 py-design,它为 15 个左右方法的 Fortran 90 代码创建了一个包装器。不幸的是,它似乎不起作用(一些资产似乎丢失了)。
我会使用OpenTURNS,它提供了几个低差异序列:
此外,可以生成序列使得边缘具有任意分布。这是通过基于逆分布函数的概率变换来完成的。
在下面的示例中,我基于
LowDiscrepancyExperiment
类生成二维 Sobol' 序列。边际在 [-1, 1] 区间内均匀分布(这是 OT 中的默认均匀分布)。我建议使用等于 2 的幂的样本大小,因为 Sobol' 序列基于以 2 为基数的整数分解。 generate
方法返回 ot.Sample
。
import openturns as ot
dim = 2
distribution = ot.ComposedDistribution([ot.Uniform()]*dim)
bounds = distribution.getRange()
sequence = ot.SobolSequence(dim)
samplesize = 2**5 # Sobol' sequences are in base 2
experiment = ot.LowDiscrepancyExperiment(sequence, distribution,
samplesize, False)
sample = experiment.generate()
print(samplesize[:5])
之前的样本大小为 32。前 5 个元素是:
y0 y1
0 0 0
1 0.5 -0.5
2 -0.5 0.5
3 -0.25 -0.25
4 0.75 0.75
OT 中的 Sobol' 序列可以生成任意大小的样本,维度高达 1111。
再做一点工作,我们就可以绘制设计图了。
import openturns.viewer as otv
fig = otv.PlotDesign(sample, bounds, 2**2, 2**1);
fig.set_size_inches(6, 6)
产生:
看看每个基本区间中恰好有 4 个点。
如果需要,
sample
可以轻松转换为Numpy数组,这可能更适合您的Scipy要求:
import numpy as np
array = np.array(sample)
在敏感性分析的背景下,SALib 库似乎很有趣 它有一个 Sobol 样本生成器并使用 SciPy。 链接在这里:https://salib.readthedocs.io/en/latest/