scipy.stats.qmc.Sobol

class scipy.stats.qmc.Sobol(d, *, scramble=True, seed=None)[源代码]

用于生成(加扰的)Sobol‘序列的引擎。

Sobol序列是低偏差的准随机数。可以使用两种方法绘制点:

  • random_base2 :安全绘制 \(n=2^m\) 分数。该方法保证了序列的平衡性。

  • random :从序列中绘制任意数量的点。请参阅下面的警告。

参数
d集成

序列的维数。最大维数为21201。

scramble布尔值,可选

如果为True,则使用Owen置乱。否则不会进行加扰。默认值为True。

seed :{无,整型, numpy.random.Generator },可选{无,整型,

如果 seed 是不是没有 numpy.random.Generator 使用的是Singleton。如果 seed 是一个整型、一个新的 Generator 实例,其种子设定为 seed 。如果 seed 已经是一个 Generator 实例,则使用该实例。

注意事项

Sobol序列 [1] 提供 \(n=2^m\) 中的低差异点 \([0,1)^{{d}}\) 。把它们打乱 [2] 使得它们适用于奇异被积数,提供了一种误差估计的手段,并且可以提高它们的收敛速度。

根据它们的“方向号”,有很多版本的Sobol序列。此代码使用来自 [3]. 因此,最大维数为21201。已经使用搜索标准6预先计算了方向数,并且可以在https://web.maths.unsw.edu.au/~fkuo/sobol/.检索到方向数

警告

Sobol‘序列是一种求积规则,如果使用的样本大小不是2的幂,或者跳过第一个点,或者细化序列,则它们会失去平衡属性 [4].

如果 \(n=2^m\) 光有积分是不够的,那就应该拿分。 \(2^M\) 积分为 \(M>m\) 。在加扰时,独立复制的数量R不必是2的幂。

Sobol序列被生成到某个数字 \(B\) 比特。之后 \(2^B\) 点已生成,该序列将重复。目前 \(B=30\)

参考文献

1

我是苏博尔。立方体中点的分布和积分的精确计算。ZH.维奇塞尔。垫子。I Mat.I Mat.体育馆,1967年,7:784-802。

2

阿特·B·欧文。打乱Sobol和Niederreiter-Xing点。复杂性杂志,14(4):466-489,1998年12月。

3

S.Joe和FY.Kuo。构造具有更好二维投影的SOBOL序列。“暹罗科学计算学报”,30(5):2635-2654,2008。

4

阿特·B·欧文。关于丢掉第一个索博尔的观点。Arxiv 2008.08051,2020年。

示例

从Sobol‘的低差异序列生成样本。

>>> from scipy.stats import qmc
>>> sampler = qmc.Sobol(d=2, scramble=False)
>>> sample = sampler.random_base2(m=3)
>>> sample
array([[0.   , 0.   ],
       [0.5  , 0.5  ],
       [0.75 , 0.25 ],
       [0.25 , 0.75 ],
       [0.375, 0.375],
       [0.875, 0.875],
       [0.625, 0.125],
       [0.125, 0.625]])

使用差异标准计算样本质量。

>>> qmc.discrepancy(sample)
0.013882107204860938

要继续现有的设计,可以通过再次调用来获得额外的积分 random_base2 。或者,您可以跳过一些点,如:

>>> _ = sampler.reset()
>>> _ = sampler.fast_forward(4)
>>> sample_continued = sampler.random_base2(m=2)
>>> sample_continued
array([[0.375, 0.375],
       [0.875, 0.875],
       [0.625, 0.125],
       [0.125, 0.625]])

最后,可以将样本按比例缩放到边界。

>>> l_bounds = [0, 2]
>>> u_bounds = [10, 5]
>>> qmc.scale(sample_continued, l_bounds, u_bounds)
array([[3.75 , 3.125],
       [8.75 , 4.625],
       [6.25 , 2.375],
       [1.25 , 3.875]])

方法:

fast_forward \(n)

通过以下方式快进序列 n 位置。

random \([n] )

在Sobol‘序列中画下一个(或多个)点。

random_base2 \(M)

从Sobol‘序列中绘制一个或多个点。

reset \()

将引擎重置为基本状态。