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

问题描述 投票:0回答:6

我想在基于 SciPy 的模拟中使用准随机序列,特别是 Sobol。对现有的高效软件包有什么建议吗?

python random scipy
6个回答
6
投票

这个项目有什么用吗? 如果没有,相关维基百科文章提到了 NAG 和 Numerical Recipes 中的 C 和 Fortran 例程,用 Python 包装或重新实现可能应该不难。 GSL中也有C例程。


4
投票

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


3
投票

对于 Sobol 序列,请尝试 sobol_seq

一般来说,我发现的处理拟随机序列的最佳软件包是diversipy

还有一些专注于特定实现的软件包,例如 sudoku_lhs 处理 Latin HypercubesSudoku 类型 Constraint 变体。

pyDOE 至少实现了 Latin Hypercube(也许更多)。

我发现的最有趣的包是 py-design,它为 15 个左右方法的 Fortran 90 代码创建了一个包装器。不幸的是,它似乎不起作用(一些资产似乎丢失了)。


2
投票

我会使用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)

产生:

A Sobol' sequence in 2 dimensions

看看每个基本区间中恰好有 4 个点。

如果需要,

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

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

其他示例位于:http://openturns.github.io/openturns/latest/auto_reliability_sensitivity/index.html#design-of-experiments


1
投票

Chaospy 也是一个有效的选项。它允许选择多种低差异采样方法(包括“Sobol”、拉丁超立方体等) - 有关更多详细信息,请参阅文档


1
投票

在敏感性分析的背景下,SALib 库似乎很有趣 它有一个 Sobol 样本生成器并使用 SciPy。 链接在这里:https://salib.readthedocs.io/en/latest/

© www.soinside.com 2019 - 2024. All rights reserved.