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,locundscale, 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, numpy.random.RandomState}, optionalEin NumPy-Zufallszahlengenerator oder ein Seed für den zugrundeliegenden NumPy-Zufallszahlengenerator, der zum Erzeugen des Stroms von gleichmäßigen Zufallszahlen verwendet wird. Wenn
random_stateNone ist, wirdself.random_stateverwendet. Wennrandom_stateeine ganze Zahl ist, wirdnp.random.default_rng(random_state)verwendet. Wennrandom_statebereits eine Instanz vonGeneratoroderRandomStateist, wird diese Instanz verwendet.
- Attribute:
- locFloat
Der Lokationsparameter.
- random_state{
numpy.random.Generator,numpy.random.RandomState} Der Zufallszustand, der in relevanten Methoden wie
rvsverwendet wird (es sei denn, ein andererrandom_statewird 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
rvsverwendet einen Generator ausscipy.stats.sampling, der beim Instanziieren des Objekts erstellt wird. Zusätzlich werden die Methodenqrvsundppfhinzugefügt.qrvsgeneriert Stichproben basierend auf Quasi-Zufallszahlen ausscipy.stats.qmc.ppfist 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.rvsberuht 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 Methodeevaluate_errorverwendet werden.Beachten Sie, dass alle implementierten Verteilungen auch Teil von
scipy.statssind und das vonFastGeneratorInversionerstellte Objekt auf Methoden wieppf, 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 mitppfsehr 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(Methodeqrvs), - 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
locundscalezur Standardverteilung X (d. h.loc=0undscale=1) ist gegeben durchY = 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.truncnormzur Erzeugung abgeschnittener Normalverteilungs-Zufallsvariablen verwendet werden.