我想在基于SciPy的模拟中使用准随机序列,特别是Sobol。有关现有高效套餐的任何建议吗?
答案 0 :(得分:6)
this project有用吗?如果没有,relevant Wikipedia article提到NAG和Numerical Recipes中的C和Fortran例程,这可能不难在Python中包装或重新实现。 GSL中还有C例程。
答案 1 :(得分:1)
在灵敏度分析的背景下,SALib库似乎很有趣 它有一个Sobol样本生成器并使用SciPy。 点击此处:http://jdherman.github.io/SALib/
答案 2 :(得分:1)
对于 Sobol序列,请尝试sobol_seq。
通常来说,我发现用于处理准随机序列的最佳软件包是diversipy。
也有一些软件包专注于特定的实现,例如sudoku_lhs处理 Latin Hypercubes 和 Sudoku-type Constraint 变体。
pyDOE至少实现 Latin Hypercube (可能更多)。
我找到的最有趣的包是py-design,它为15种左右方法上的Fortran 90代码创建了包装。不幸的是,它似乎不起作用(某些资产似乎丢失了)。
答案 3 :(得分:1)
Chaospy也是有效的选项。它允许选择几种低差异采样方法(包括'Sobol,拉丁超立方体等)-有关更多详细信息,see the documentation。
答案 4 :(得分:1)
我将使用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)
中提供了其他示例。
答案 5 :(得分:1)
PyTorch 现在提供了一些选项。 其中之一是加扰的 sobol 数生成器,它可以生成高达 ~1k 的更高维度的准随机数
https://pytorch.org/docs/stable/generated/torch.quasirandom.SobolEngine.html
另一种选择是使用现在有这个选项的Scipy http://scipy.github.io/devdocs/generated/scipy.stats.qmc.Sobol.html