scipy.stats.qmc.

QMCEngine#

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

一种通用准蒙特卡罗抽样器类,用于子类化。

QMCEngine 是构建特定准蒙特卡罗抽样器的基类。它不能直接用作抽样器。

参数:
dint

参数空间的维数。

optimization{None, “random-cd”, “lloyd”}, optional

是否使用一种优化方案来提高抽样后的质量。请注意,这是一个后处理步骤,不能保证样本的所有属性都能得到保留。默认值为 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 实例,则使用提供的实例。

注释

按惯例,对半开区间 [0, 1) 上的样本进行分布。类实例可访问以下属性:d,用于维度;rng,用于随机数生成器(用于 seed)。

子类化

当对 QMCEngine 进行子类化以创建新的采样器时,必须重新定义 __init__random

  • __init__(d, seed=None):至少修复维度。如果采样器不利用 seed(确定性方法,如 Halton),则可以省略此参数。

  • _random(n, *, workers=1):从引擎中提取 nworkers 用于并行。例如,请参阅 Halton

子类也可以选择覆盖另外两种方法

  • reset:将引擎重置为其原始状态。

  • fast_forward:如果序列是确定性的(例如,Halton 序列),则 fast_forward(n) 会跳过先进行 n 次提取。

示例

要基于 np.random.random 创建随机采样器,我们可以执行以下操作

>>> from scipy.stats import qmc
>>> class RandomEngine(qmc.QMCEngine):
...     def __init__(self, d, seed=None):
...         super().__init__(d=d, seed=seed)
...
...
...     def _random(self, n=1, *, workers=1):
...         return self.rng.random((n, self.d))
...
...
...     def reset(self):
...         super().__init__(d=self.d, seed=self.rng_seed)
...         return self
...
...
...     def fast_forward(self, n):
...         self.random(n)
...         return self

在子类化 QMCEngine 以定义我们希望使用的采样策略后,我们可以创建一个实例进行采样。

>>> engine = RandomEngine(2)
>>> engine.random(5)
array([[0.22733602, 0.31675834],  # random
       [0.79736546, 0.67625467],
       [0.39110955, 0.33281393],
       [0.59830875, 0.18673419],
       [0.67275604, 0.94180287]])

我们还可以重置生成器的状态并重新采样。

>>> _ = engine.reset()
>>> engine.random(5)
array([[0.22733602, 0.31675834],  # random
       [0.79736546, 0.67625467],
       [0.39110955, 0.33281393],
       [0.59830875, 0.18673419],
       [0.67275604, 0.94180287]])

方法

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 个数。

重置()

将引擎重置为基本状态。