scipy.stats.qmc.

Halton#

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

Halton-Sequenz.

Pseudo-Zufallszahlengenerator, der die Van-der-Corput-Sequenz für mehrere Dimensionen verallgemeinert. Die Halton-Sequenz verwendet die Basis-Zwei-Van-der-Corput-Sequenz für die erste Dimension, Basis-Drei für ihre zweite und Basis-\(p\) für ihre \(n\)-te Dimension, wobei \(p\) die \(n\)-te Primzahl ist.

Parameter:
dint

Dimension des Parameterraums.

scramblebool, optional

Wenn True, wird zufälliges Scrambling gemäß [2] verwendet. Andernfalls wird kein Scrambling durchgeführt. Standard ist True.

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

Ob ein Optimierungsschema zur Verbesserung der Qualität nach dem Sampling verwendet werden soll. Beachten Sie, dass dies ein Nachbearbeitungsschritt ist, der nicht garantiert, dass alle Eigenschaften der Stichprobe erhalten bleiben. Standard ist None.

  • random-cd: zufällige Permutationen von Koordinaten zur Verringerung der zentrierten Diskrepanz. Die beste Stichprobe basierend auf der zentrierten Diskrepanz wird ständig aktualisiert. Das zentrierte dispunktbasierte Sampling zeigt eine bessere Raumfüllungsrobustheit gegenüber 2D- und 3D-Unterprojektionen im Vergleich zur Verwendung anderer Dispunktmaße.

  • lloyd: Stört Stichproben mithilfe eines modifizierten Lloyd-Max-Algorithmus. Der Prozess konvergiert zu gleichmäßig verteilten Stichproben.

Hinzugefügt in Version 1.10.0.

rngnumpy.random.Generator, optional

Zustand des Pseudozufallszahlengenerators. Wenn rng None ist, wird ein neuer numpy.random.Generator unter Verwendung von Entropie aus dem Betriebssystem erstellt. Typen außer numpy.random.Generator werden an numpy.random.default_rng übergeben, um einen Generator zu instanziieren.

Geändert in Version 1.15.0: Als Teil der SPEC-007-Umstellung von der Verwendung von numpy.random.RandomState zu numpy.random.Generator wurde dieses Schlüsselwort von seed zu rng geändert. Für eine Übergangszeit werden beide Schlüsselwörter weiterhin funktionieren, obwohl nur eines gleichzeitig angegeben werden darf. Nach der Übergangszeit werden Funktionsaufrufe, die das seed-Schlüsselwort verwenden, Warnungen ausgeben. Nach einer Deputationsperiode wird das seed-Schlüsselwort entfernt.

Methoden

fast_forward(n)

Führt die Sequenz um n Positionen vorwärts.

integers(l_bounds, *[, u_bounds, n, ...])

Zieht n ganze Zahlen von l_bounds (inklusive) bis u_bounds (exklusive), oder wenn endpoint=True, von l_bounds (inklusive) bis u_bounds (inklusive).

random([n, workers])

Zieht n im halboffenen Intervall [0, 1).

reset()

Setzt die Engine auf den Grundzustand zurück.

Hinweise

Die Halton-Sequenz weist selbst für mäßig große Dimensionen starke Streifenartefakte auf. Diese können durch Scrambling gemildert werden. Scrambling unterstützt auch replikationsbasierte Fehlerabschätzungen und erweitert die Anwendbarkeit auf unbeschränkte Integranden.

Referenzen

[1]

Halton, „On the efficiency of certain quasi-random sequences of points in evaluating multi-dimensional integrals“, Numerische Mathematik, 1960.

[2]

A. B. Owen. „A randomized Halton algorithm in R“, arXiv:1706.02808, 2017.

Beispiele

Generieren Sie Stichproben aus einer Quasi-Zufallszahlensequenz von 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]])

Berechnet die Qualität der Stichprobe anhand des Diskrepanzkriteriums.

>>> qmc.discrepancy(sample)
0.088893711419753

Wenn jemand ein bestehendes Design fortsetzen möchte, können zusätzliche Punkte durch erneutes Aufrufen von random erhalten werden. Alternativ können Sie einige Punkte überspringen, wie z. B.

>>> _ = 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]])

Schließlich können Stichproben auf Grenzen skaliert werden.

>>> 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]])