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()