scipy.stats.qmc.

Halton#

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

Halton 序列。

泛化 Van der Corput 序列至多維度的偽隨機數生成器。Halton 序列的第一維使用 base-two Van der Corput 序列,第二維使用 base-three,而 n 維則使用 base-\(n\)

參數:
dint

參數空間的維度。

scramblebool,選用

若為 True,則使用 Owen 擾亂。否則不進行擾亂。預設值為 True。

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.RandomState 過渡到 numpy.random.GeneratorSPEC-007 轉換的一部分,此關鍵字已從 seed 變更為 rng。在過渡期間,這兩個關鍵字將繼續運作,但一次只能指定一個。在過渡期結束後,使用 seed 關鍵字的函式呼叫將會發出警告。在棄用期過後,seed 關鍵字將會被移除。

註解

對於即使是適度大的維度,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 (排除) 繪製 n 個整數,或者如果 endpoint=True,則從 l_bounds (包含) 到 u_bounds (包含)。

random([n, workers])

在半開區間 [0, 1) 中繪製 n 個樣本。

reset()

將引擎重設為基礎狀態。