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, numpy.random.RandomState}, optionalEin 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_stateNone ist, wirdself.random_stateverwendet. Wennrandom_stateeine Ganzzahl ist, wirdnp.random.default_rng(random_state)verwendet. Wennrandom_statebereits eineGeneratoroderRandomStateInstanz 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
ppfwird 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_statebestimmt die Zufallsstichprobe. Beachten Sie, dass der u-Fehler null wäre, wennppfexakt wäre.Der x-Fehler misst den direkten Abstand zwischen der exakten PPF und
ppf. Wennx_erroraufTruegesetzt 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])), wobeix_error_abs[i] = |PPF(u[i]) - PPF_fast(u[i])|undx_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, wennPPF(u)nahe null oder sehr groß ist.Standardmäßig wird nur der u-Fehler ausgewertet und der x-Fehler auf
np.nangesetzt. 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