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.
- rng
numpy.random.Generator, optional Zustand des pseudozufälligen Zahlengenerators. Wenn rng None ist, wird ein neuer
numpy.random.Generatorunter Verwendung von Entropie aus dem Betriebssystem erstellt. Typen außernumpy.random.Generatorwerden annumpy.random.default_rngübergeben, um einenGeneratorzu instanziieren.Geändert in Version 1.15.0: Im Rahmen der SPEC-007-Umstellung von der Verwendung von
numpy.random.RandomStatezunumpy.random.Generatorwurde 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:dfür die Dimension; undrngfür den Zufallszahlengenerator.Unterklassenbildung
Beim Erstellen von Unterklassen von
QMCEngine, um einen neuen Sampler zu erstellen, müssen__init__undrandomneu definiert werden.__init__(d, rng=None): Legt zumindest die Dimension fest. Wenn der Sampler keinenrngnutzt (deterministische Methoden wie Halton), kann dieser Parameter weggelassen werden._random(n, *, workers=1): Ziehenaus der Engine.workerswird für Parallelität verwendet. SieheHaltonals 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 überspringtfast_forward(n)die erstennZiehungen.
Beispiele
Um einen zufälligen Sampler basierend auf
np.random.randomzu 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
QMCEngineUnterklassen 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]])