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
\()将引擎重置为基本状态。