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
已經是Generator
或RandomState
實例,則使用該實例。
- 回傳:
- 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