scipy.stats.qmc.

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 版本中新增。

rngnumpy.random.Generator, optional

偽隨機數生成器狀態。當 rng 為 None 時,會使用作業系統的熵建立新的 numpy.random.Generator。除了 numpy.random.Generator 以外的類型會傳遞給 numpy.random.default_rng 以實例化 Generator

在 1.15.0 版本中變更:作為從使用 numpy.random.RandomState 過渡到 numpy.random.GeneratorSPEC-007 轉換的一部分,此關鍵字已從 seed 變更為 rng。在過渡期間,這兩個關鍵字將繼續有效,但一次只能指定一個。在過渡期之後,使用 seed 關鍵字的函數呼叫將發出警告。在棄用期之後,將移除 seed 關鍵字。

筆記

依照慣例,樣本分佈在半開區間 [0, 1) 內。此類別的實例可以存取屬性:維度的 d;以及隨機數生成器的 rng

子類別化

當子類別化 QMCEngine 以建立新的取樣器時,必須重新定義 __init__random

  • __init__(d, rng=None):至少要修正維度。如果取樣器不利用 rng(確定性方法,如 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, 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()

將引擎重設為基本狀態。