scipy.stats.sampling.FastGeneratorInversion.

evaluate_error#

FastGeneratorInversion.evaluate_error(size=100000, random_state=None, x_error=False)[Quelle]#

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

Parameter:
sizeint, optional

Die Anzahl der Zufallspunkte, über die der Fehler geschätzt wird. Standard ist 100000.

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

Ein NumPy Zufallszahlengenerator oder ein Seed für den zugrunde liegenden NumPy Zufallszahlengenerator, der zur Erzeugung des Stroms von gleichmäßigen Zufallszahlen verwendet wird. Wenn random_state None ist, wird self.random_state verwendet. Wenn random_state eine Ganzzahl ist, wird np.random.default_rng(random_state) verwendet. Wenn random_state bereits eine Generator oder RandomState Instanz ist, wird diese Instanz verwendet.

Rückgabe:
u_error, x_errortuple of floats

Ein NumPy-Array von Zufallsvariaten.

Hinweise

Die numerische Präzision der inversen CDF ppf wird durch den u-Fehler gesteuert. Er wird wie folgt berechnet: max |u - CDF(PPF(u))|, wobei das Maximum über size Zufallspunkte im Intervall [0,1] genommen wird. random_state bestimmt die Zufallsstichprobe. Beachten Sie, dass der u-Fehler null wäre, wenn ppf exakt wäre.

Der x-Fehler misst den direkten Abstand zwischen der exakten PPF und ppf. Wenn x_error auf True gesetzt ist, wird er als das Maximum des Minimums des relativen und absoluten x-Fehlers berechnet: max(min(x_error_abs[i], x_error_rel[i])), wobei x_error_abs[i] = |PPF(u[i]) - PPF_fast(u[i])| und x_error_rel[i] = max |(PPF(u[i]) - PPF_fast(u[i])) / PPF(u[i])|. Beachten Sie, dass es wichtig ist, den relativen x-Fehler zu berücksichtigen, wenn PPF(u) nahe null oder sehr groß ist.

Standardmäßig wird nur der u-Fehler ausgewertet und der x-Fehler auf np.nan gesetzt. Beachten Sie, dass die Auswertung des x-Fehlers sehr langsam sein wird, wenn die Implementierung der PPF langsam ist.

Weitere Informationen zu diesen Fehlermetriken finden Sie in [1].

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.

Beispiele

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

Erstellen Sie ein Objekt für die Normalverteilung

>>> d_norm_frozen = stats.norm()
>>> d_norm = FastGeneratorInversion(d_norm_frozen)

Um zu bestätigen, dass die numerische Inversion korrekt ist, werten wir den Approximationsfehler (u-Fehler und x-Fehler) aus.

>>> u_error, x_error = d_norm.evaluate_error(x_error=True)

Der u-Fehler sollte unter 1e-10 liegen

>>> u_error
8.785783212061915e-11  # may vary

Vergleichen Sie die PPF mit der Approximation ppf

>>> q = [0.001, 0.2, 0.4, 0.6, 0.8, 0.999]
>>> diff = np.abs(d_norm_frozen.ppf(q) - d_norm.ppf(q))
>>> x_error_abs = np.max(diff)
>>> x_error_abs
1.2937954707581412e-08

Dies ist der absolute x-Fehler, ausgewertet an den Punkten q. Der relative Fehler ist gegeben durch

>>> x_error_rel = np.max(diff / np.abs(d_norm_frozen.ppf(q)))
>>> x_error_rel
4.186725600453555e-09

Der oben berechnete x_error wird auf sehr ähnliche Weise über eine viel größere Menge von Zufallswerten q abgeleitet. An jedem Wert q[i] wird das Minimum des relativen und absoluten Fehlers genommen. Der endgültige Wert ergibt sich dann als das Maximum dieser Werte. In unserem Beispiel erhalten wir den folgenden Wert

>>> x_error
4.507068014335139e-07  # may vary