scipy.stats.sampling.

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 также может использоваться для генерации усечённых нормальных случайных величин.