scipy.stats.qmc.

QMCEngine#

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

Eine generische Quasi-Monte-Carlo-Sampler-Klasse zur Unterklassenbildung.

QMCEngine ist eine Basisklasse zur Erstellung eines spezifischen Quasi-Monte-Carlo-Samplers. Sie kann nicht direkt als Sampler verwendet werden.

Parameter:
dint

Dimension des Parameterraums.

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 pseudozufälligen Zahlengenerators. 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: Im Rahmen der SPEC-007-Umstellung von der Verwendung von numpy.random.RandomState zu numpy.random.Generator wurde dieses Schlüsselwort von seed in rng geändert. Für eine Übergangszeit werden beide Schlüsselwörter weiterhin funktionieren, obwohl nur eines gleichzeitig angegeben werden kann. Nach der Übergangszeit werden Funktionsaufrufe mit dem Schlüsselwort seed Warnungen ausgeben. Nach einer Deprekationszeit wird das Schlüsselwort seed 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

Nach Konvention sind die Stichproben über dem halboffenen Intervall [0, 1) verteilt. Instanzen der Klasse können auf die Attribute zugreifen: d für die Dimension; und rng für den Zufallszahlengenerator.

Unterklassenbildung

Beim Erstellen von Unterklassen von QMCEngine, um einen neuen Sampler zu erstellen, müssen __init__ und random neu definiert werden.

  • __init__(d, rng=None): Legt zumindest die Dimension fest. Wenn der Sampler keinen rng nutzt (deterministische Methoden wie Halton), kann dieser Parameter weggelassen werden.

  • _random(n, *, workers=1): Ziehe n aus der Engine. workers wird für Parallelität verwendet. Siehe Halton als Beispiel.

Optional können zwei weitere Methoden von Unterklassen überschrieben werden

  • reset: Setzt die Engine in ihren ursprünglichen Zustand zurück.

  • fast_forward: Wenn die Sequenz deterministisch ist (wie die Halton-Sequenz), dann überspringt fast_forward(n) die ersten n Ziehungen.

Beispiele

Um einen zufälligen Sampler basierend auf np.random.random zu erstellen, würden wir Folgendes tun

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

Nachdem wir von QMCEngine Unterklassen gebildet haben, um die zu verwendende Sampling-Strategie zu definieren, können wir eine Instanz erstellen, um daraus zu sampeln.

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

Wir können auch den Zustand des Generators zurücksetzen und erneut sampeln.

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