scipy.stats.qmc.

QMCEngine#

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

一个通用的准蒙特卡洛采样器类,用于子类化。

QMCEngine 是一个用于构建特定准蒙特卡洛采样器的基类。它不能直接用作采样器。

参数:
dint

参数空间的维度。

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 关键字将被删除。

注释

按照惯例,样本分布在半开区间 [0, 1) 上。该类的实例可以访问属性:d 表示维度;以及 rng 表示随机数生成器。

子类化

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

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

  • _random(n, *, workers=1):从引擎中抽取 n 个样本。workers 用于并行处理。例如,请参阅 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, rng=None):
...         super().__init__(d=d, rng=rng)
...
...
...     def _random(self, n=1, *, workers=1):
...         return self.rng.random((n, self.d))
...
...
...     def reset(self):
...         super().__init__(d=self.d, rng=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(不含)抽取 n 个整数,或者如果 endpoint=True,则从 l_bounds(含)到 u_bounds(含)抽取。

random([n, workers])

在半开区间 [0, 1) 中抽取 n 个样本。

reset()

将引擎重置为基本状态。