FastGeneratorInversion#
- класс scipy.stats.sampling.FastGeneratorInversion(dist, *, область определения=None, ignore_shape_range=False, random_state=None)[источник]#
Быстрая выборка путём численной инверсии CDF для большого класса непрерывных распределений в
scipy.stats.- Параметры:
- distобъект rv_frozen
Замороженный объект распределения из
scipy.stats. Список поддерживаемых распределений можно найти в разделе Примечания. Параметры формы,locиscaleиспользуемые для создания распределений должны быть скалярами. Например, для гамма-распределения с параметром формы p, p должен быть числом с плавающей точкой, а для бета-распределения с параметрами формы (a, b) оба a и b должны быть числами с плавающей точкой.- область определениякортеж из чисел с плавающей точкой, опционально
Если требуется выборка из усечённого/условного распределения, необходимо указать область определения. По умолчанию - None. В этом случае случайные величины не усекаются, и область определения выводится из носителя распределения.
- ignore_shape_rangeлогическое значение, опционально.
Если False, параметры формы, которые находятся вне допустимого диапазона значений для обеспечения численной точности (см. Примечания), вызывают ValueError. Если True, любые параметры формы, которые допустимы для распределения, принимаются. Это может быть полезно для тестирования. По умолчанию False.
- random_state{None, int,
numpy.random.Generator, numpy.random.RandomState, опциональноГенератор случайных чисел NumPy или seed для базового генератора случайных чисел NumPy, используемого для генерации потока равномерных случайных чисел. Если
random_stateравно None, используетсяself.random_state. Еслиrandom_stateявляется целым числом,np.random.default_rng(random_state)используется. Еслиrandom_stateуже являетсяGeneratorилиRandomStateэкземпляр, то используется этот экземпляр.
- Атрибуты:
- locfloat
Параметр местоположения.
- random_state{
numpy.random.Generator,numpy.random.RandomState} Случайное состояние, используемое в соответствующих методах, таких как
rvs(если не указан другойrandom_stateпередается в качестве аргумента этим методам).- scalefloat
Параметр масштаба.
Методы
evaluate_error([size, random_state, x_error])Оценить численную точность инверсии (ошибки u и x).
ppf(q)Очень быстрая PPF (обратная CDF) распределения, которая является очень близким приближением точных значений PPF.
qrvs([size, d, qmc_engine])Квазислучайные величины заданного распределения.
rvs([size])Выборка из распределения методом инверсии.
support()Носитель распределения.
функция распределения
Примечания
Класс создаёт объект для непрерывных распределений, заданных dist. Метод
rvsиспользует генератор изscipy.stats.samplingкоторый создается при инициализации объекта. Кроме того, методыqrvsиppfдобавляются.qrvsгенерировать выборки на основе квазислучайных чисел изscipy.stats.qmc.ppfявляется PPF на основе численного метода инверсии в [1] (NumericalInversePolynomial), который используется для генерации случайных величин.Поддерживаемые распределения (distname) являются:
alpha,anglit,argus,beta,betaprime,bradford,burr,burr12,cauchy,chi,chi2,cosine,crystalball,expon,gamma,gennorm,geninvgauss,gumbel_l,gumbel_r,hypsecant,invgamma,invgauss,invweibull,laplace,logistic,maxwell,moyal,norm,pareto,powerlaw,t,rayleigh,semicircular,wald,weibull_max,weibull_min.rvsзависит от точности численной инверсии. Если используются очень экстремальные параметры формы, численная инверсия может не сработать. Однако для всех реализованных распределений допустимые параметры формы были протестированы, и будет вызвана ошибка, если пользователь предоставит значения вне допустимого диапазона. U-ошибка не должна превышать 1e-10 для всех допустимых параметров. Обратите внимание, что предупреждения могут быть вызваны, даже если параметры находятся в допустимом диапазоне при создании объекта. Для проверки численной точности методevaluate_errorможет быть использован.Обратите внимание, что все реализованные распределения также являются частью
scipy.stats, и объект, созданныйFastGeneratorInversionполагается на методы, такие какppf, функция распределения и pdf из rv_frozen. Основное преимущество использования этого класса можно суммировать следующим образом: После создания генератора для выборки случайных величин на этапе настройки, выборка и вычисление обратной функции распределения с использованиемppfочень быстры, и производительность практически не зависит от распределения. Поэтому значительное ускорение может быть достигнуто для многих распределений, если требуется большое количество случайных величин. Важно знать, что эта быстрая выборка достигается инверсией CDF. Таким образом, одна равномерная случайная величина преобразуется в неравномерную величину, что является преимуществом для нескольких методов моделирования, например, когда используются методы уменьшения дисперсии общих случайных величин или антитетических величин ([2]).Кроме того, инверсия позволяет - использовать генератор QMC из
scipy.stats.qmc(методqrvs), - для генерации случайных величин, усечённых до интервала. Например, если цель — выборка стандартных нормальных случайных величин из интервала (2, 4), это можно легко достичь с помощью параметра область определения.Параметры положения и масштаба, которые изначально определены dist можно сбросить без необходимости повторного выполнения шага настройки для создания генератора, используемого для выборки. Отношение распределения Y с
locиscaleк стандартному распределению X (т.е.,loc=0иscale=1) задается какY = loc + scale * X.Ссылки
[1]Дерфлингер, Герхард, Вольфганг Хёрманн и Йозеф Лейдольд. «Генерация случайных величин численной инверсией, когда известна только плотность». ACM Transactions on Modeling and Computer Simulation (TOMACS) 20.4 (2010): 1-25.
[2]Хёрманн, Вольфганг, Йозеф Лейдольд и Герхард Дерфлингер. «Автоматическая генерация неоднородных случайных чисел». Springer, 2004.
Примеры
>>> import numpy as np >>> from scipy import stats >>> from scipy.stats.sampling import FastGeneratorInversion
Начнём с простого примера, чтобы проиллюстрировать основные особенности:
>>> gamma_frozen = stats.gamma(1.5) >>> gamma_dist = FastGeneratorInversion(gamma_frozen) >>> r = gamma_dist.rvs(size=1000)
Среднее значение должно быть приблизительно равно параметру формы 1.5:
>>> r.mean() 1.52423591130436 # may vary
Аналогично, мы можем нарисовать выборку на основе квазислучайных чисел:
>>> r = gamma_dist.qrvs(size=1000) >>> r.mean() 1.4996639255942914 # may vary
Сравнить PPF с аппроксимацией
ppf.>>> q = [0.001, 0.2, 0.5, 0.8, 0.999] >>> np.max(np.abs(gamma_frozen.ppf(q) - gamma_dist.ppf(q))) 4.313394796895409e-08
Чтобы подтвердить точность численной инверсии, мы оцениваем ошибку аппроксимации (u-error), которая должна быть ниже 1e-10 (подробнее см. документацию
evaluate_error):>>> gamma_dist.evaluate_error() (7.446320551265581e-11, nan) # may vary
Обратите внимание, что местоположение и масштаб можно изменить без создания нового генератора:
>>> gamma_dist.loc = 2 >>> gamma_dist.scale = 3 >>> r = gamma_dist.rvs(size=1000)
Среднее должно быть приблизительно 2 + 3*1.5 = 6.5.
>>> r.mean() 6.399549295242894 # may vary
Также проиллюстрируем, как можно применить усечение:
>>> trunc_norm = FastGeneratorInversion(stats.norm(), domain=(3, 4)) >>> r = trunc_norm.rvs(size=1000) >>> 3 < r.min() < r.max() < 4 True
Проверьте среднее значение:
>>> r.mean() 3.250433367078603 # may vary
>>> stats.norm.expect(lb=3, ub=4, conditional=True) 3.260454285589997
В данном конкретном случае,
scipy.stats.truncnormтакже может использоваться для генерации усечённых нормальных случайных величин.