evaluate_error#
- FastGeneratorInversion.evaluate_error(размер=100000, random_state=None, x_error=False)[источник]#
Оценить численную точность инверсии (ошибки u и x).
- Параметры:
- размерint, необязательный
Количество случайных точек, по которым оценивается ошибка. По умолчанию
100000.- random_state{None, int,
numpy.random.Generator, numpy.random.RandomState, опциональноГенератор случайных чисел NumPy или seed для базового генератора случайных чисел NumPy, используемого для генерации потока равномерных случайных чисел. Если
random_stateis 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].random_stateопределяет случайную выборку. Обратите внимание, что еслиppfбыло точным, u-ошибка была бы нулевой.Ошибка по x измеряет прямое расстояние между точной PPF и
ppf. Еслиx_errorустановлено вTrue`, it is computed as the maximum of the minimum of the relative and absolute 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])|. Обратите внимание, что важно учитывать относительную x-ошибку в случае, когдаPPF(u)близко к нулю или очень велико.По умолчанию оценивается только u-ошибка, а x-ошибка устанавливается в
np.nan. Обратите внимание, что оценка x-ошибки будет очень медленной если реализация PPF медленная.Дополнительная информация об этих мерах ошибок может быть найдена в [1].
Ссылки
[1]Дерфлингер, Герхард, Вольфганг Хёрманн и Йозеф Лейдольд. «Генерация случайных величин численной инверсией, когда известна только плотность». 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
Это абсолютная x-погрешность, вычисленная в точках q. Относительная погрешность задается
>>> 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