evaluate_error#
- FastGeneratorInversion.evaluate_error(size=100000, random_state=None, x_error=False)[源代码][源代码]#
评估反演的数值精度(u-误差和x-误差)。
- 参数:
- 大小int, 可选
用于估计误差的随机点数量。默认值为
100000
。- random_state{None, int,}
NumPy 随机数生成器或用于生成均匀随机数流的底层 NumPy 随机数生成器的种子。如果 random_state 为 None,则使用
self.random_state
。如果 random_state 是一个整数,则使用np.random.default_rng(random_state)
。如果 random_state 已经是Generator
或RandomState
实例,则使用该实例。
- 返回:
- u_error, x_error浮点数元组
一个随机变量的NumPy数组。
注释
逆CDF ppf 的数值精度由u-误差控制。其计算方式如下:
max |u - CDF(PPF(u))|
,其中最大值取自区间 [0,1] 内的 size 个随机点。random_state 决定了随机样本。注意,如果 ppf 是精确的,u-误差将为零。x-error 测量精确 PPF 和 ppf 之间的直接距离。如果
x_error
设置为True
,它将计算为相对和绝对 x-error 的最小值的最大值: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-error 是非常重要的。默认情况下,仅评估 u-error,并将 x-error 设置为
np.nan
。请注意,如果 PPF 的实现速度较慢,x-error 的评估将会非常慢。关于这些错误测量的更多信息可以在 [1] 中找到。
参考文献
[1]Derflinger, Gerhard, Wolfgang Hörmann, 和 Josef Leydold. “仅知密度时的数值反演随机变量生成.” ACM 建模与计算机模拟交易 (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-error 应低于 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