scipy.stats.sampling.FastGeneratorInversion.

evaluate_error#

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

評估反演的數值準確性(u 誤差和 x 誤差)。

參數:
sizeint,可選

用於估計誤差的隨機點數量。預設值為 100000

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

NumPy 隨機數生成器或用於生成均勻隨機數流的底層 NumPy 隨機數生成器的種子。如果 random_state 為 None,則使用 self.random_state。如果 random_state 為 int,則使用 np.random.default_rng(random_state)。如果 random_state 已經是 GeneratorRandomState 實例,則使用該實例。

回傳:
u_error, x_errorfloat 元組

NumPy 隨機變數陣列。

註解

反向 CDF ppf 的數值精度由 u 誤差控制。它的計算方式如下:max |u - CDF(PPF(u))|,其中 max 取自區間 [0,1] 中 size 個隨機點。random_state 決定隨機樣本。請注意,如果 ppf 是精確的,則 u 誤差將為零。

x 誤差測量精確 PPF 和 ppf 之間的直接距離。如果 x_error 設定為 True,則計算為相對和絕對 x 誤差的最小值中的最大值:max(min(x_error_abs[i], x_error_rel[i])),其中 x_error_abs[i] = |PPF(u[i]) - PPF_fast(u[i])|x_error_rel[i] = max |(PPF(u[i]) - PPF_fast(u[i])) / PPF(u[i])|。請注意,在 PPF(u) 接近零或非常大的情況下,考慮相對 x 誤差非常重要。

預設情況下,僅評估 u 誤差,x 誤差設定為 np.nan。請注意,如果 PPF 的實作速度很慢,則 x 誤差的評估將非常慢。

有關這些誤差測量的更多資訊,請參閱 [1]

參考文獻

[1]

Derflinger, Gerhard, Wolfgang Hörmann, and 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.

範例

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

為常態分佈建立物件

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

為了確認數值反演是準確的,我們評估近似誤差(u 誤差和 x 誤差)。

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

u 誤差應低於 1e-10

>>> u_error
8.785783212061915e-11  # may vary

比較 PPF 與近似值 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

這是於點 q 評估的絕對 x 誤差。相對誤差由以下公式給出

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

上面計算的 x_error 是以非常相似的方式,在更大的隨機值 q 集合上推導出來的。在每個值 q[i] 處,取相對誤差和絕對誤差的最小值。然後,最終值導出為這些值的最大值。在我們的範例中,我們得到以下值

>>> x_error
4.507068014335139e-07  # may vary