scipy.stats.qmc.

Halton#

class scipy.stats.qmc.Halton(d, *, scramble=True, optimization=None, rng=None)[源代码]#

Halton 序列。

伪随机数生成器,它将 Van der Corput 序列推广到多个维度。 Halton 序列对第一维使用以 2 为底的 Van der Corput 序列,对第二维使用以 3 为底的序列,对其 n 维使用以 \(n\) 为底的序列。

参数:
dint

参数空间的维度。

scramblebool,可选

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

optimization{None, “random-cd”, “lloyd”}, 可选

是否使用优化方案来提高采样后的质量。 请注意,这是一个后处理步骤,不能保证样本的所有属性都得到保留。 默认值为 None。

  • random-cd: 坐标的随机排列以降低中心差异。 基于中心差异的最佳样本会不断更新。 与使用其他差异度量相比,基于中心差异的采样在 2D 和 3D 子投影方面显示出更好的空间填充鲁棒性。

  • lloyd: 使用修改后的 Lloyd-Max 算法扰动样本。 该过程会收敛到等间距的样本。

在 1.10.0 版本中添加。

rngnumpy.random.Generator, 可选

伪随机数生成器状态。 当 rng 为 None 时,将使用来自操作系统的熵创建一个新的 numpy.random.Generator。 除 numpy.random.Generator 以外的类型将传递给 numpy.random.default_rng 以实例化 Generator

在版本 1.15.0 中更改:作为从使用 numpy.random.RandomStatenumpy.random.GeneratorSPEC-007 过渡的一部分,此关键字已从 seed 更改为 rng。 在过渡期间,这两个关键字将继续工作,尽管一次只能指定一个。 在过渡期之后,使用 seed 关键字的函数调用将发出警告。 在弃用期之后,将删除 seed 关键字。

说明

对于维度适中的情况,Halton 序列具有严重的条纹伪像。 这些可以通过扰乱来改善。 扰乱还支持基于复制的误差估计,并将适用性扩展到无界积分。

参考文献

[1]

Halton,“关于评估多维积分时某些拟随机点序列的效率”,Numerische Mathematik,1960。

[2]

A. B. Owen。“R 中的随机化 Halton 算法”,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]])

方法

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()

将引擎重置为基本状态。