scipy.stats.sampling.

FastGeneratorInversion#

class scipy.stats.sampling.FastGeneratorInversion(dist, *, domain=None, ignore_shape_range=False, random_state=None)[Quelle]#

Schnelle Stichprobenentnahme durch numerische Inversion der CDF für eine große Klasse stetiger Verteilungen in scipy.stats.

Parameter:
distrv_frozen Objekt

Eingefrorenes Verteilungsobjekt aus scipy.stats. Die Liste der unterstützten Verteilungen finden Sie im Abschnitt „Hinweise“. Die Formparameter, loc und scale, die zur Erstellung der Verteilungen verwendet werden, müssen Skalare sein. Beispielsweise muss für die Gamma-Verteilung mit dem Formparameter p p ein Float sein, und für die Beta-Verteilung mit den Formparametern (a, b) müssen sowohl a als auch b Floats sein.

domainTuple von Floats, optional

Wenn man aus einer abgeschnittenen/bedingten Verteilung ziehen möchte, muss die Domäne angegeben werden. Der Standardwert ist None. In diesem Fall werden die Zufallsvariablen nicht abgeschnitten und die Domäne wird aus dem Träger der Verteilung abgeleitet.

ignore_shape_rangeBoolean, optional.

Wenn False, lösen Formparameter, die außerhalb des gültigen Wertebereichs liegen, um sicherzustellen, dass die numerische Genauigkeit (siehe Hinweise) hoch ist, einen ValueError aus. Wenn True, werden alle Formparameter akzeptiert, die für die Verteilung gültig sind. Dies kann zum Testen nützlich sein. Der Standardwert ist False.

random_state{None, int, numpy.random.Generator,

Ein NumPy-Zufallszahlengenerator oder ein Seed für den zugrundeliegenden NumPy-Zufallszahlengenerator, der zum Erzeugen des Stroms von gleichmäßigen Zufallszahlen verwendet wird. Wenn random_state None ist, wird self.random_state verwendet. Wenn random_state eine ganze Zahl ist, wird np.random.default_rng(random_state) verwendet. Wenn random_state bereits eine Instanz von Generator oder RandomState ist, wird diese Instanz verwendet.

Attribute:
locFloat

Der Lokationsparameter.

random_state{numpy.random.Generator, numpy.random.RandomState}

Der Zufallszustand, der in relevanten Methoden wie rvs verwendet wird (es sei denn, ein anderer random_state wird als Argument an diese Methoden übergeben).

scaleGleitkommazahl

Der Skalierungsparameter.

Methoden

evaluate_error([size, random_state, x_error])

Bewertet die numerische Genauigkeit der Inversion (u- und x-Fehler).

ppf(q)

Sehr schnelle PPF (inverse CDF) der Verteilung, die eine sehr gute Annäherung an die exakten PPF-Werte darstellt.

qrvs([size, d, qmc_engine])

Quasi-zufällige Variablen der gegebenen Verteilung.

rvs([size])

Stichprobe aus der Verteilung durch Inversion.

support()

Unterstützung der Verteilung.

cdf

Hinweise

Die Klasse erstellt ein Objekt für kontinuierliche Verteilungen, die durch dist spezifiziert werden. Die Methode rvs verwendet einen Generator aus scipy.stats.sampling, der beim Instanziieren des Objekts erstellt wird. Zusätzlich werden die Methoden qrvs und ppf hinzugefügt. qrvs generiert Stichproben basierend auf Quasi-Zufallszahlen aus scipy.stats.qmc. ppf ist die PPF, die auf der numerischen Inversionsmethode in [1] (NumericalInversePolynomial) basiert und zur Erzeugung von Zufallsvariablen verwendet wird.

Unterstützte Verteilungen (distname) sind: alpha, anglit, argus, beta, betaprime, bradford, burr, burr12, cauchy, chi, chi2, cosine, crystalball, expon, gamma, gennorm, geninvgauss, gumbel_l, gumbel_r, hypsecant, invgamma, invgauss, invweibull, laplace, logistic, maxwell, moyal, norm, pareto, powerlaw, t, rayleigh, semicircular, wald, weibull_max, weibull_min.

rvs beruht auf der Genauigkeit der numerischen Inversion. Wenn sehr extreme Formparameter verwendet werden, funktioniert die numerische Inversion möglicherweise nicht. Für alle implementierten Verteilungen wurden jedoch die zulässigen Formparameter getestet, und es wird ein Fehler ausgelöst, wenn der Benutzer Werte außerhalb des zulässigen Bereichs angibt. Der u-Fehler sollte für alle gültigen Parameter nicht 1e-10 überschreiten. Beachten Sie, dass Warnungen ausgelöst werden können, auch wenn die Parameter innerhalb des gültigen Bereichs liegen, wenn das Objekt instanziiert wird. Um die numerische Genauigkeit zu überprüfen, kann die Methode evaluate_error verwendet werden.

Beachten Sie, dass alle implementierten Verteilungen auch Teil von scipy.stats sind und das von FastGeneratorInversion erstellte Objekt auf Methoden wie ppf, cdf und pdf von rv_frozen beruht. Der Hauptvorteil der Verwendung dieser Klasse lässt sich wie folgt zusammenfassen: Sobald der Generator zur Erzeugung von Zufallsvariablen im Einrichtungsschritt erstellt ist, sind die Erzeugung von Stichproben und die Auswertung der PPF mit ppf sehr schnell, und die Leistung ist im Wesentlichen unabhängig von der Verteilung. Daher kann eine erhebliche Geschwindigkeitssteigerung für viele Verteilungen erzielt werden, wenn eine große Anzahl von Zufallsvariablen benötigt wird. Es ist wichtig zu wissen, dass diese schnelle Stichprobenerzeugung durch Inversion der CDF erreicht wird. Somit wird eine gleichmäßige Zufallsvariable in eine nicht-gleichmäßige Variable umgewandelt, was für verschiedene Simulationsmethoden von Vorteil ist, z. B. wenn Methoden zur Varianzreduktion mit gemeinsamen Zufallsvariablen oder synthetischen Zufallsvariablen verwendet werden ([2]).

Darüber hinaus ermöglicht die Inversion: - die Verwendung eines QMC-Generators aus scipy.stats.qmc (Methode qrvs), - die Erzeugung von Zufallsvariablen, die auf ein Intervall abgeschnitten sind. Wenn man beispielsweise Standard-Normalverteilungsvariablen aus dem Intervall (2, 4) ziehen möchte, kann dies einfach durch Verwendung des Parameters domain erreicht werden.

Die ursprünglich durch dist definierten Lokations- und Skalierungsparameter können zurückgesetzt werden, ohne den Einrichtungsschritt zum Erstellen des für die Stichprobenerzeugung verwendeten Generators erneut durchlaufen zu müssen. Der Zusammenhang der Verteilung Y mit loc und scale zur Standardverteilung X (d. h. loc=0 und scale=1) ist gegeben durch Y = loc + scale * X.

Referenzen

[1]

Derflinger, Gerhard, Wolfgang Hörmann, und Josef Leydold. „Random variate generation by numerical inversion when only the density is known.“ ACM Transactions on Modeling and Computer Simulation (TOMACS) 20.4 (2010): 1-25.

[2]

Hörmann, Wolfgang, Josef Leydold und Gerhard Derflinger. „Automatic nonuniform random number generation.“ Springer, 2004.

Beispiele

>>> import numpy as np
>>> from scipy import stats
>>> from scipy.stats.sampling import FastGeneratorInversion

Beginnen wir mit einem einfachen Beispiel, um die Hauptfunktionen zu veranschaulichen

>>> gamma_frozen = stats.gamma(1.5)
>>> gamma_dist = FastGeneratorInversion(gamma_frozen)
>>> r = gamma_dist.rvs(size=1000)

Der Mittelwert sollte ungefähr dem Formparameter 1,5 entsprechen

>>> r.mean()
1.52423591130436  # may vary

Ähnlich können wir eine Stichprobe basierend auf Quasi-Zufallszahlen ziehen

>>> r = gamma_dist.qrvs(size=1000)
>>> r.mean()
1.4996639255942914  # may vary

Vergleichen Sie die PPF mit der Approximation ppf.

>>> q = [0.001, 0.2, 0.5, 0.8, 0.999]
>>> np.max(np.abs(gamma_frozen.ppf(q) - gamma_dist.ppf(q)))
4.313394796895409e-08

Um zu bestätigen, dass die numerische Inversion korrekt ist, werten wir den Approximationsfehler (u-Fehler) aus, der unter 1e-10 liegen sollte (weitere Einzelheiten finden Sie in der Dokumentation von evaluate_error)

>>> gamma_dist.evaluate_error()
(7.446320551265581e-11, nan)  # may vary

Beachten Sie, dass die Lokation und Skalierung geändert werden können, ohne einen neuen Generator zu instanziieren

>>> gamma_dist.loc = 2
>>> gamma_dist.scale = 3
>>> r = gamma_dist.rvs(size=1000)

Der Mittelwert sollte ungefähr 2 + 3*1,5 = 6,5 betragen.

>>> r.mean()
6.399549295242894  # may vary

Illustrieren wir auch, wie eine Abschneidung angewendet werden kann

>>> trunc_norm = FastGeneratorInversion(stats.norm(), domain=(3, 4))
>>> r = trunc_norm.rvs(size=1000)
>>> 3 < r.min() < r.max() < 4
True

Überprüfen Sie den Mittelwert

>>> r.mean()
3.250433367078603  # may vary
>>> stats.norm.expect(lb=3, ub=4, conditional=True)
3.260454285589997

In diesem speziellen Fall könnte auch scipy.stats.truncnorm zur Erzeugung abgeschnittener Normalverteilungs-Zufallsvariablen verwendet werden.