scipy.stats.sampling.

SimpleRatioUniforms#

класс scipy.stats.sampling.SimpleRatioUniforms(dist, *, mode=None, pdf_area=1, область определения=None, cdf_at_mode=None, random_state=None)#

Метод простого отношения равномерных распределений (SROU).

SROU основан на методе отношения равномерных распределений, который использует универсальные неравенства для построения (универсального) ограничивающего прямоугольника. Он работает для T-вогнутых распределений с T(x) = -1/sqrt(x). Основное преимущество метода — быстрая настройка. Это может быть полезно, если нужно многократно генерировать небольшие или умеренные выборки распределения с разными параметрами формы. В такой ситуации шаг настройки NumericalInverseHermite или NumericalInversePolynomial приведет к плохой производительности.

Параметры:
distobject

Экземпляр класса с pdf метод.

  • pdf: PDF распределения. Сигнатура PDF ожидается как: def pdf(self, x: float) -> float. т.е. PDF должна принимать Python float и возвращать Python float. Она не обязана интегрироваться в 1, т.е. PDF не обязана быть нормализованной. Если не нормализована, pdf_area должно быть установлено равным площади под PDF.

modefloat, опционально

(Точная) Мода распределения. Когда мода None, используется медленная численная процедура для его аппроксимации. По умолчанию: None.

pdf_areafloat, опционально

Площадь под PDF. Опционально, верхняя граница площади под PDF может быть передана за счет увеличения константы отклонения. По умолчанию 1.

область определениясписок или кортеж длины 2, опционально

Носитель распределения. По умолчанию None. Когда None:

  • Если support метод предоставляется объектом распределения dist, используется для установки области определения распределения.

  • В противном случае предполагается, что носитель \((-\infty, \infty)\).

cdf_at_modefloat, опционально

CDF в моде. Может быть задана для повышения производительности алгоритма. Константа отбраковки уменьшается вдвое, когда задана CDF в моде. По умолчанию: None.

random_state{None, int, numpy.random.Generator,

numpy.random.RandomState, опционально

Генератор случайных чисел NumPy или seed для базового генератора случайных чисел NumPy, используемого для генерации потока равномерных случайных чисел. Если random_state равно None (или np.random), numpy.random.RandomState используется синглтон. Если random_state является int, новый RandomState используется экземпляр, инициализированный с random_state. Если random_state уже является Generator или RandomState экземпляр, тогда этот экземпляр используется.

Методы

rvs([size, random_state])

Выборка из распределения.

set_random_state([random_state])

Установить базовый генератор равномерных случайных чисел.

Ссылки

[1]

Справочное руководство UNU.RAN, раздел 5.3.16, “SROU - Simple Ratio-of-Uniforms method”, http://statmath.wu.ac.at/software/unuran/doc/unuran.html#SROU

[2]

Leydold, Josef. "A simple universal generator for continuous and discrete univariate T-concave distributions." ACM Transactions on Mathematical Software (TOMS) 27.1 (2001): 66-82

[3]

Leydold, Josef. “Short universal generators via generalized ratio-of-uniforms method.” Mathematics of Computation 72.243 (2003): 1453-1471

Примеры

>>> from scipy.stats.sampling import SimpleRatioUniforms
>>> import numpy as np

Предположим, у нас есть нормальное распределение:

>>> class StdNorm:
...     def pdf(self, x):
...         return np.exp(-0.5 * x**2)

Обратите внимание, что PDF не интегрируется в 1. Мы можем либо передать точную площадь под PDF при инициализации генератора, либо верхнюю границу точной площади под PDF. Также рекомендуется передать моду распределения для ускорения настройки:

>>> urng = np.random.default_rng()
>>> dist = StdNorm()
>>> rng = SimpleRatioUniforms(dist, mode=0,
...                           pdf_area=np.sqrt(2*np.pi),
...                           random_state=urng)

Теперь мы можем использовать rvs метод для генерации выборок из распределения:

>>> rvs = rng.rvs(10)

Если доступна CDF в моде, её можно установить для улучшения производительности rvs:

>>> from scipy.stats import norm
>>> rng = SimpleRatioUniforms(dist, mode=0,
...                           pdf_area=np.sqrt(2*np.pi),
...                           cdf_at_mode=norm.cdf(0),
...                           random_state=urng)
>>> rvs = rng.rvs(1000)

Мы можем проверить, что выборки взяты из заданного распределения, визуализировав его гистограмму:

>>> import matplotlib.pyplot as plt
>>> x = np.linspace(rvs.min()-0.1, rvs.max()+0.1, 1000)
>>> fx = 1/np.sqrt(2*np.pi) * dist.pdf(x)
>>> fig, ax = plt.subplots()
>>> ax.plot(x, fx, 'r-', lw=2, label='true distribution')
>>> ax.hist(rvs, bins=10, density=True, alpha=0.8, label='random variates')
>>> ax.set_xlabel('x')
>>> ax.set_ylabel('PDF(x)')
>>> ax.set_title('Simple Ratio-of-Uniforms Samples')
>>> ax.legend()
>>> plt.show()
../../_images/scipy-stats-sampling-SimpleRatioUniforms-1.png