QMCEngine#
- class scipy.stats.qmc.QMCEngine(d, *, optimization=None, rng=None)[source]#
一个通用的准蒙特卡洛采样器类,用于子类化。
QMCEngine 是一个用于构建特定准蒙特卡洛采样器的基类。它不能直接用作采样器。
- 参数:
- dint
参数空间的维度。
- optimization{None, “random-cd”, “lloyd”}, optional
是否使用优化方案来提高采样后的质量。请注意,这是一个后处理步骤,不能保证样本的所有属性都会被保留。 默认为 None。
random-cd
:坐标的随机排列以降低中心差异。基于中心差异的最佳样本会不断更新。 与使用其他差异度量相比,基于中心差异的采样在 2D 和 3D 子投影中表现出更好的空间填充鲁棒性。lloyd
:使用修改后的 Lloyd-Max 算法扰动样本。该过程收敛到等间距的样本。
在 1.10.0 版本中添加。
- rng
numpy.random.Generator
, optional 伪随机数生成器状态。当 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
()将引擎重置为基本状态。
注释
按照惯例,样本分布在半开区间
[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]])