scipy.stats.qmc.

Halton#

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

Halton 序列。

伪随机数生成器对多个维度的范德科普特序列进行泛化。Halton 序列使用二进制的范德科普特序列作为第一维度、三进制序列作为其第二维度,并使用 \(n\) 进制序列作为其 n 维。

参数:
dint

参数空间的维度。

scramblebool,可选

如果为 True,则使用欧文置乱。否则不进行置乱。默认为 True。

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

是否使用优化方案来提升抽样后的质量。请注意,这是一个后期处理步骤,不能确保保留样本的所有属性。默认为 None。

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

  • lloyd:使用改良后的 Lloyd-Max 算法扰动样本。该进程将收敛到间隔均匀的样本。

已添加到 1.10.0 版中。

seed{None、int、numpy.random.Generator}(可选)

如果seed 是 int 或 None,将使用 np.random.default_rng(seed) 创建新的 numpy.random.Generator。如果seed 已是 Generator 实例,则将使用所提供的实例。

注释

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(不包括),或者如果 endpoint=True,从l_bounds(包括)到u_bounds(包括)中绘制n 个整数。

random([n, workers])

在半开区间[0, 1) 中绘制n

reset()

将引擎重置为基本状态。