scipy.stats.sampling.

TransformedDensityRejection#

класс scipy.stats.sampling.TransformedDensityRejection(dist, *, mode=None, центр=None, область определения=None, c=-0.5, construction_points=30, use_dars=True, max_squeeze_hat_ratio=0.99, random_state=None)#

Метод преобразованного отклонения плотности (TDR).

TDR — это метод принятия/отклонения, который использует вогнутость преобразованной плотности для автоматического построения функции-шапки и сжатия. Большинство универсальных алгоритмов очень медленны по сравнению со специализированными алгоритмами для конкретного распределения. Быстрые алгоритмы имеют медленную настройку и требуют больших таблиц. Цель этого универсального метода — предоставить алгоритм, который не слишком медленный и требует лишь короткой настройки. Этот метод может быть применён к одномерным и унимодальным непрерывным распределениям с T-вогнутой функцией плотности. См. [1] и [2] для более подробной информации.

Параметры:
distobject

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

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

  • dpdf: Производная PDF по x (т.е. переменной). Должна иметь ту же сигнатуру, что и PDF.

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

(Точная) Мода распределения. По умолчанию None.

центрfloat, опционально

Приблизительное расположение моды или среднего распределения. Это расположение даёт информацию об основной части PDF и используется для избежания численных проблем. По умолчанию None.

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

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

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

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

c{-0.5, 0.}, опционально

Установить параметр c для функции преобразования T. По умолчанию -0.5. Преобразование PDF должно быть вогнутым, чтобы построить функцию-шапку. Такой PDF называется T-вогнутым. В настоящее время поддерживаются следующие преобразования:

\[\begin{split}c = 0.: T(x) &= \log(x)\\ c = -0.5: T(x) &= \frac{1}{\sqrt{x}} \text{ (Default)}\end{split}\]
construction_pointsint или array_like, необязательно

Если целое число, оно определяет количество точек построения. Если это массивоподобный объект, элементы массива используются как точки построения. По умолчанию 30.

use_darsbool, необязательно

Если True, используется "дерандомизированное адаптивное режекторное сэмплирование" (DARS) в настройке. См. [1] для подробностей алгоритма DARS. По умолчанию True.

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

Установить верхнюю границу для отношения (площадь под squeeze) / (площадь под hat). Это должно быть число между 0 и 1. По умолчанию 0.99.

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 экземпляр, тогда этот экземпляр используется.

Атрибуты:
hat_area

Получить площадь под «шляпой» для генератора.

squeeze_area

Получить область под сжатием для генератора.

squeeze_hat_ratio

Получите текущее соотношение (площадь под сжатием) / (площадь под крышкой) для генератора.

Методы

ppf_hat(u)

Вычислить обратную функцию CDF распределения-шляпы в u.

rvs([size, random_state])

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

set_random_state([random_state])

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

Ссылки

[1] (1,2)

Руководство по UNU.RAN, Раздел 5.3.16, 'TDR - Transformed Density Rejection', http://statmath.wu.ac.at/software/unuran/doc/unuran.html#TDR

[2]

Хёрманн, Вольфганг. «Техника отклонения для выборки из T-вогнутых распределений.» ACM Transactions on Mathematical Software (TOMS) 21.2 (1995): 182-193

[3]

W.R. Gilks и P. Wild (1992). Adaptive rejection sampling for Gibbs sampling, Applied Statistics 41, стр. 337-348.

Примеры

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

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

\[\begin{split}f(x) = \begin{cases} 1 - x^2, & -1 \leq x \leq 1 \\ 0, & \text{otherwise} \end{cases}\end{split}\]

Производная этой функции плотности:

\[\begin{split}\frac{df(x)}{dx} = \begin{cases} -2x, & -1 \leq x \leq 1 \\ 0, & \text{otherwise} \end{cases}\end{split}\]

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

>>> urng = np.random.default_rng()
>>> class MyDist:
...     def pdf(self, x):
...         return 1-x*x
...     def dpdf(self, x):
...         return -2*x
...
>>> dist = MyDist()
>>> rng = TransformedDensityRejection(dist, domain=(-1, 1),
...                                   random_state=urng)

Область определения может быть очень полезной для усечения распределения, но чтобы избежать передачи её каждый раз в конструктор, область определения по умолчанию может быть установлена путем предоставления поддержка метод в объекте распределения (dist):

>>> class MyDist:
...     def pdf(self, x):
...         return 1-x*x
...     def dpdf(self, x):
...         return -2*x
...     def support(self):
...         return (-1, 1)
...
>>> dist = MyDist()
>>> rng = TransformedDensityRejection(dist, random_state=urng)

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

>>> rvs = rng.rvs(1000)

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

>>> import matplotlib.pyplot as plt
>>> x = np.linspace(-1, 1, 1000)
>>> fx = 3/4 * dist.pdf(x)  # 3/4 is the normalizing constant
>>> plt.plot(x, fx, 'r-', lw=2, label='true distribution')
>>> plt.hist(rvs, bins=20, density=True, alpha=0.8, label='random variates')
>>> plt.xlabel('x')
>>> plt.ylabel('PDF(x)')
>>> plt.title('Transformed Density Rejection Samples')
>>> plt.legend()
>>> plt.show()
../../_images/scipy-stats-sampling-TransformedDensityRejection-1.png