Python / SciPy中关于低差异(例如Sobol)准随机序列的建议?

时间:2012-02-23 11:41:35

标签: python random scipy

我想在基于SciPy的模拟中使用准随机序列,特别是Sobol。有关现有高效套餐的任何建议吗?

6 个答案:

答案 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,它提供了几个低差异序列:

  • 故障序列
  • 哈尔顿序列,
  • 反向Halton序列,
  • Haselgrove序列,
  • Sobol序列。

此外,可以生成序列,以使边缘具有任意分布。这是根据逆分布函数通过概率变换完成的。

在下面的示例中,我基于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)

产生:

A Sobol' sequence in 2 dimensions

查看每个基本间隔中到底有4个点。

如果需要,sample可以轻松转换为Numpy数组,这可能更适合您的Scipy要求:

import numpy as np
array = np.array(sample)

http://openturns.github.io/openturns/master/examples/reliability_sensitivity/design_of_experiments.html

中提供了其他示例。

答案 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