Halton#
- class scipy.stats.qmc.Halton(d, *, scramble=True, optimization=None, rng=None)[source]#
Halton 序列。
伪随机数生成器,它推广了多个维度的 Van der Corput 序列。Halton 序列使用 base-two Van der Corput 序列作为第一维度,base-three 作为第二维度,base-\(p\) 作为其 \(n\) 维度,其中 \(p\) 是第 \(n\) 个质数。
- 参数:
- dint
参数空间的维度。
- scramblebool, 可选
如果为 True,则使用来自 [2] 的随机扰乱。否则不进行扰乱。默认为 True。
- optimization{None, “random-cd”, “lloyd”}, 可选
是否使用优化方案来提高采样后的质量。请注意,这是一个后处理步骤,不能保证样本的所有属性都得到保留。默认为 None。
random-cd
:坐标的随机排列,以降低中心差异。基于中心差异的最佳样本会不断更新。与使用其他差异度量相比,基于中心差异的采样在 2D 和 3D 子投影方面显示出更好的空间填充鲁棒性。lloyd
:使用修改后的 Lloyd-Max 算法扰动样本。该过程收敛到等间距的样本。
1.10.0 版本中新增。
- rng
numpy.random.Generator
, 可选 伪随机数生成器状态。当 rng 为 None 时,将使用来自操作系统的熵创建一个新的
numpy.random.Generator
。除numpy.random.Generator
之外的类型将传递给numpy.random.default_rng
以实例化一个Generator
。在 1.15.0 版本中更改:作为从使用
numpy.random.RandomState
转换到numpy.random.Generator
的 SPEC-007 转换的一部分,此关键字从 seed 更改为 rng。在过渡期间,这两个关键字将继续工作,但一次只能指定一个。过渡期结束后,使用 seed 关键字的函数调用将发出警告。经过一段弃用期后,将删除 seed 关键字。
方法
fast_forward
(n)将序列快速前进 n 个位置。
integers
(l_bounds, *[, u_bounds, n, ...])从 l_bounds (包含) 到 u_bounds (不包含) 绘制 n 个整数,或者如果 endpoint=True,则从 l_bounds (包含) 到 u_bounds (包含)。
random
([n, workers])在半开区间
[0, 1)
中绘制 n 个。reset
()将引擎重置为基本状态。
注意
对于即使是适度大的维度,Halton 序列也存在严重的条纹伪影。这些可以通过扰乱来改善。扰乱还支持基于复制的误差估计,并将适用性扩展到无界积分。
参考文献
[1]Halton,“On the efficiency of certain quasi-random sequences of points in evaluating multi-dimensional integrals”,Numerische Mathematik, 1960.
[2]A. B. Owen。“A randomized Halton algorithm in R”,arXiv:1706.02808, 2017。
示例
从 Halton 的低差异序列生成样本。
>>> from scipy.stats import qmc >>> sampler = qmc.Halton(d=2, scramble=False) >>> sample = sampler.random(n=5) >>> sample array([[0. , 0. ], [0.5 , 0.33333333], [0.25 , 0.66666667], [0.75 , 0.11111111], [0.125 , 0.44444444]])
使用差异准则计算样本的质量。
>>> qmc.discrepancy(sample) 0.088893711419753
如果有人想继续现有的设计,可以通过再次调用
random
来获得额外的点。或者,您可以跳过一些点,例如>>> _ = sampler.fast_forward(5) >>> sample_continued = sampler.random(n=5) >>> sample_continued array([[0.3125 , 0.37037037], [0.8125 , 0.7037037 ], [0.1875 , 0.14814815], [0.6875 , 0.48148148], [0.4375 , 0.81481481]])
最后,样本可以缩放到边界。
>>> l_bounds = [0, 2] >>> u_bounds = [10, 5] >>> qmc.scale(sample_continued, l_bounds, u_bounds) array([[3.125 , 3.11111111], [8.125 , 4.11111111], [1.875 , 2.44444444], [6.875 , 3.44444444], [4.375 , 4.44444444]])