scipy.stats.sampling.

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 von NumericalInverseHermite oder NumericalInversePolynomial zu schlechter Leistung.

Parameter:
distObjekt

Eine Instanz einer Klasse mit pdf Methode.

  • 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 None ist, wird eine langsame numerische Routine verwendet, um ihn anzunähern. Standard ist None.

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. Wenn None

  • Wenn 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,

Ein 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.RandomState verwendet. Wenn random_state eine Ganzzahl ist, wird eine neue RandomState-Instanz verwendet, die mit random_state initialisiert wird. Wenn random_state bereits eine Generator- oder RandomState-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 rvs zu 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()
../../_images/scipy-stats-sampling-SimpleRatioUniforms-1.png