SimpleRatioUniforms#
- class scipy.stats.sampling.SimpleRatioUniforms(dist, *, mode=None, pdf_area=1, domain=None, cdf_at_mode=None, random_state=None)#
Simple Ratio-of-Uniforms (SROU) Methode.
SROU basiert auf der Ratio-of-Uniforms-Methode, die universelle Ungleichungen zur Konstruktion eines (universellen) begrenzenden Rechtecks verwendet. Sie funktioniert für T-konkave Verteilungen mit
T(x) = -1/sqrt(x). Der Hauptvorteil der Methode ist eine schnelle Einrichtung. Dies kann vorteilhaft sein, wenn man wiederholt kleine bis moderate Stichproben einer Verteilung mit unterschiedlichen Formparametern generieren muss. In einer solchen Situation führt die Einrichtungsphase vonNumericalInverseHermiteoderNumericalInversePolynomialzu schlechter Leistung.- Parameter:
- distObjekt
Eine Instanz einer Klasse mit
pdfMethode.pdf: PDF der Verteilung. Die Signatur der PDF wird erwartet als:def pdf(self, x: float) -> float. D.h. die PDF sollte einen Python-Float akzeptieren und einen Python-Float zurückgeben. Sie muss nicht zu 1 integrieren, d.h. die PDF muss nicht normalisiert sein. Wenn sie nicht normalisiert ist, sollte pdf_area auf die Fläche unter der PDF gesetzt werden.
- modefloat, optional
(Exakter) Modus der Verteilung. Wenn der Modus
Noneist, wird eine langsame numerische Routine verwendet, um ihn anzunähern. Standard istNone.- pdf_areafloat, optional
Fläche unter der PDF. Optional kann eine Obergrenze für die Fläche unter der PDF übergeben werden, auf Kosten einer erhöhten Ablehnungskonstante. Standard ist 1.
- domainListe oder Tupel der Länge 2, optional
Die Unterstützung der Verteilung. Standard ist
None. WennNoneWenn eine
support-Methode vom Verteilungsobjekt dist bereitgestellt wird, wird sie verwendet, um den Definitionsbereich der Verteilung festzulegen.Andernfalls wird die Unterstützung als \((-\infty, \infty)\) angenommen.
- cdf_at_modefloat, optional
CDF am Modus. Dies kann angegeben werden, um die Leistung des Algorithmus zu verbessern. Die Ablehnungskonstante halbiert sich, wenn CDF am Modus angegeben wird. Standard ist
None.- random_state{None, int,
numpy.random.Generator, numpy.random.RandomState}, optionalEin NumPy-Zufallszahlengenerator oder ein Seed für den zugrunde liegenden NumPy-Zufallszahlengenerator, der zum Erzeugen des Stroms von gleichverteilten Zufallszahlen verwendet wird. Wenn random_state None (oder np.random) ist, wird das Singleton
numpy.random.RandomStateverwendet. Wenn random_state eine Ganzzahl ist, wird eine neueRandomState-Instanz verwendet, die mit random_state initialisiert wird. Wenn random_state bereits eineGenerator- oderRandomState-Instanz ist, wird diese Instanz verwendet.
Methoden
rvs([size, random_state])Stichprobe aus der Verteilung.
set_random_state([random_state])Setzt den zugrunde liegenden gleichmäßigen Zufallszahlengenerator.
Referenzen
[1]UNU.RAN Referenzhandbuch, Abschnitt 5.3.16, „SROU – Simple Ratio-of-Uniforms method“, http://statmath.wu.ac.at/software/unuran/doc/unuran.html#SROU
[2]Leydold, Josef. “A simple universal generator for continuous and discrete univariate T-concave distributions.” ACM Transactions on Mathematical Software (TOMS) 27.1 (2001): 66-82
[3]Leydold, Josef. “Short universal generators via generalized ratio-of-uniforms method.” Mathematics of Computation 72.243 (2003): 1453-1471
Beispiele
>>> from scipy.stats.sampling import SimpleRatioUniforms >>> import numpy as np
Angenommen, wir haben die Normalverteilung
>>> class StdNorm: ... def pdf(self, x): ... return np.exp(-0.5 * x**2)
Beachten Sie, dass die PDF nicht zu 1 integriert. Wir können entweder die exakte Fläche unter der PDF bei der Initialisierung des Generators oder eine obere Schranke für die exakte Fläche unter der PDF übergeben. Außerdem wird empfohlen, den Modus der Verteilung anzugeben, um die Einrichtung zu beschleunigen
>>> urng = np.random.default_rng() >>> dist = StdNorm() >>> rng = SimpleRatioUniforms(dist, mode=0, ... pdf_area=np.sqrt(2*np.pi), ... random_state=urng)
Nun können wir die
rvs-Methode verwenden, um Stichproben aus der Verteilung zu generieren>>> rvs = rng.rvs(10)
Wenn die CDF am Modus verfügbar ist, kann sie angegeben werden, um die Leistung von
rvszu verbessern>>> from scipy.stats import norm >>> rng = SimpleRatioUniforms(dist, mode=0, ... pdf_area=np.sqrt(2*np.pi), ... cdf_at_mode=norm.cdf(0), ... random_state=urng) >>> rvs = rng.rvs(1000)
Wir können überprüfen, ob die Stichproben aus der gegebenen Verteilung stammen, indem wir ihr Histogramm visualisieren.
>>> import matplotlib.pyplot as plt >>> x = np.linspace(rvs.min()-0.1, rvs.max()+0.1, 1000) >>> fx = 1/np.sqrt(2*np.pi) * dist.pdf(x) >>> fig, ax = plt.subplots() >>> ax.plot(x, fx, 'r-', lw=2, label='true distribution') >>> ax.hist(rvs, bins=10, density=True, alpha=0.8, label='random variates') >>> ax.set_xlabel('x') >>> ax.set_ylabel('PDF(x)') >>> ax.set_title('Simple Ratio-of-Uniforms Samples') >>> ax.legend() >>> plt.show()