tf.contrib.distributions.TransformedDistribution
Преобразованное распределение.
Наследуется от: Distribution
tf.contrib.distributions.TransformedDistribution(
distribution, bijector=None, batch_shape=None, event_shape=None,
validate_args=False, name=None
)
Объект TransformedDistribution моделирует p(y) на основе базового распределения p(x), и детерминированного, обратимого, дифференцируемого преобразования Y = g(X). Преобразование, как правило, является экземпляром класса Bijector, а базовое распределение — экземпляром класса Distribution.
Ожидается, что Bijector будет реализовывать следующие функции:
-
forward, -
inverse, -
inverse_log_det_jacobian. Семантика этих функций описана в документации поBijector.
Теперь опишем, как TransformedDistribution изменяет входные/выходные данные Distribution, связанного с случайной величиной (rv) X.
Запишите cdf(Y=y) для абсолютно непрерывной функции кумулятивного распределения случайной величины Y; запишите функцию плотности вероятности pdf(Y=y) := d^k / (dy_1,...,dy_k) cdf(Y=y) для её производной по Y в точке y. Предполагается, что Y = g(X), где g является детерминированной диффеоморфией, т.е. неслучайной, непрерывной, дифференцируемой и обратимой функцией. Запишите обратную функцию g как X = g^{-1}(Y) и (J o g)(x) для якобиана g в точке x.
Объект TransformedDistribution реализует следующие операции:
sampleМатематически:Y = g(X)Программное обеспечение:bijector.forward(distribution.sample(...))-
log_probМатематически: `(log o pdf)(Y=y) = (log o pdf o g^{-1})(y)`+ (log o abs o det o J o g^{-1})(y)`Программное обеспечение:
(distribution.log_prob(bijector.inverse(y)) + bijector.inverse_log_det_jacobian(y)) log_cdfМатематически:(log o cdf)(Y=y) = (log o cdf o g^{-1})(y)Программное обеспечение:distribution.log_cdf(bijector.inverse(x))и аналогично для:
cdf,prob,log_survival_function,survival_function.
Простой пример создания распределения Лог-Нормального из нормального распределения:
ds = tfp.distributions log_normal = ds.TransformedDistribution( distribution=ds.Normal(loc=0., scale=1.), bijector=ds.bijectors.Exp(), name="LogNormalTransformedDistribution")
Объект LogNormal, созданный из вызываемых функций:
ds = tfp.distributions
log_normal = ds.TransformedDistribution(
distribution=ds.Normal(loc=0., scale=1.),
bijector=ds.bijectors.Inline(
forward_fn=tf.exp,
inverse_fn=tf.math.log,
inverse_log_det_jacobian_fn=(
lambda y: -tf.reduce_sum(tf.math.log(y), axis=-1)),
name="LogNormalTransformedDistribution")
Ещё один пример создания нормального распределения из стандартного нормального:
ds = tfp.distributions
normal = ds.TransformedDistribution(
distribution=ds.Normal(loc=0., scale=1.),
bijector=ds.bijectors.Affine(
shift=-1.,
scale_identity_multiplier=2.)
name="NormalTransformedDistribution")
Форма пакетной и событийной структуры TransformedDistribution определяется базовым распределением, если явно не переопределены параметры batch_shape или event_shape. Указание переопределённой формы batch_shape (event_shape разрешено только в том случае, если форма пакетной структуры (форма события) базового распределения является скалярной. Биджектор применяется к распределению так, как если бы распределение имело переопределённую форму. Следующий пример демонстрирует, как создать многомерное нормальное распределение как TransformedDistribution.
ds = tfp.distributions
# We will create two MVNs with batch_shape = event_shape = 2.
mean = [[-1., 0], # batch:0
[0., 1]] # batch:1
chol_cov = [[[1., 0],
[0, 1]], # batch:0
[[1, 0],
[2, 2]]] # batch:1
mvn1 = ds.TransformedDistribution(
distribution=ds.Normal(loc=0., scale=1.),
bijector=ds.bijectors.Affine(shift=mean, scale_tril=chol_cov),
batch_shape=[2], # Valid because base_distribution.batch_shape == [].
event_shape=[2]) # Valid because base_distribution.event_shape == [].
mvn2 = ds.MultivariateNormalTriL(loc=mean, scale_tril=chol_cov)
# mvn1.log_prob(x) == mvn2.log_prob(x)
| Аргументы | |
|---|---|
distribution | Экземпляр базового распределения для преобразования. Обычно экземпляр Distribution. |
bijector | Объект, отвечающий за вычисление преобразования. Обычно экземпляр Bijector. None означает Identity(). |
batch_shape | integer вектор Tensor, который переопределяет distribution batch_shape; допустимо только, если distribution.is_scalar_batch(). |
event_shape | integer вектор Tensor, который переопределяет distribution event_shape; допустимо только, если distribution.is_scalar_event(). |
validate_args | Python bool, по умолчанию False. Когда True параметры распределения проверяются на корректность, несмотря на возможное ухудшение производительности выполнения. Когда False недопустимые входные данные могут молча привести к неверным результатам. |
name | Python str имя, добавляемое в качестве префикса к операциям, созданным этим классом. По умолчанию: bijector.name + distribution.name. |
| Атрибуты | |
|---|---|
allow_nan_stats | Python bool описывает поведение, когда статистическая характеристика не определена. Статистические характеристики возвращают +/- бесконечность, когда это имеет смысл. Например, дисперсия распределения Коши равна бесконечности. Однако иногда статистическая характеристика не определена, например, если функция плотности вероятности распределения не достигает максимума в пределах области определения распределения, мода не определена. Если среднее значение не определено, то по определению дисперсия также не определена. Например, среднее значение для распределения Стьюдента при df = 1 не определено (нет чёткого способа сказать, что это либо + или - бесконечность), поэтому дисперсия = E[(X - среднее значение)**2] также не определена. |
batch_shape | Форма одного образца из одного индекса события в виде TensorShape. Может быть частично определена или неизвестна. Размер пакетной обработки используется для индексов независимых, нетождественных параметризаций этого распределения. |
bijector | Функция, преобразующая x в y. |
distribution | Базовое распределение, p(x). |
dtype | DType Tensor обрабатываются этим Distribution. |
event_shape | Форма одного образца из одной пакетной обработки в виде TensorShape. Может быть частично определена или неизвестна. |
name | Имя, добавляемое в качестве префикса ко всем операциям, созданным этим Distribution. |
parameters | Словарь параметров, используемых для создания этого Distribution. |
reparameterization_type | Описывает, как образцы из распределения повторно параметризуются. В настоящее время это один из статических экземпляров |
validate_args | Python bool указывающий, возможно, включены дорогостоящие проверки. |
Методы
batch_shape_tensor
batch_shape_tensor(
name='batch_shape_tensor'
)
Форма одного образца из одного индекса события в виде одномерного Tensor.
Размеры пакета используются для индексов независимых, нетождественных параметризаций этого распределения.
| Аргументы | |
|---|---|
name | имя для операции |
| Возвращает | |
|---|---|
batch_shape | Tensor. |
cdf
cdf(
value, name='cdf'
)
Функция кумулятивного распределения.
Для случайной величины X, функция кумулятивного распределения cdf имеет вид:
cdf(x) := P[X <= x]
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Python str добавляется в качестве префикса к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
cdf | Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
copy
copy(
**override_parameters_kwargs
)
Создаёт глубокую копию распределения.
Примечание: копия распределения может по-прежнему зависеть от исходных аргументов инициализации.
| Аргументы | |
|---|---|
**override_parameters_kwargs | Строковый/словарный словарь аргументов инициализации для переопределения новыми значениями. |
| Возвращает | |
|---|---|
distribution | Новый экземпляр type(self), инициализированный объединением self.parameters и override_parameters_kwargs, т.е., dict(self.parameters, **override_parameters_kwargs). |
covariance
covariance(
name='covariance'
)
Ковариация.
Ковариация (возможно) определяется только для распределений со значениями не по одному событию.
Например, для распределения со значениями длиной k, векторизованного распределения, она рассчитывается как,
Cov[i, j] = Covariance(X_i, X_j) = E[(X_i - E[X_i]) (X_j - E[X_j])]
где Cov является (пакетом) k x k матрицей, 0 <= (i, j) < k, и E обозначает математическое ожидание.
В альтернативе, для невекторных, многомерных распределений (например, матричнозначных, Вишарта), Covariance должна возвращать (пакет) матриц при некотором векторировании событий, т.е.,
Cov[i, j] = Covariance(Vec(X)_i, Vec(X)_j) = [as above]
где Cov является (пакетом) k' x k' матриц, 0 <= (i, j) < k' = reduce_prod(event_shape), и Vec является некоторой функцией, отображающей индексы размерностей событий этого распределения в индексы вектора длиной k'.
| Аргументы | |
|---|---|
name | Python str добавляемый к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
covariance | Вещественное число с плавающей точкой Tensor формы [B1, ..., Bn, k', k'], где первые n измерения — координаты пакетной обработки, а k' = reduce_prod(self.event_shape). |
cross_entropy
cross_entropy(
other, name='cross_entropy'
)
Вычисляет перекрёстную энтропию (по Шеннону).
Обозначим данное распределение (self) как P, а распределение other — как Q. Предполагая, что P, Q абсолютно непрерывны относительно друг друга и допускают плотности p(x) dr(x) и q(x) dr(x), перекрёстная энтропия (по Шеннону) определяется как:
H[P, Q] = E_p[-log q(X)] = -int_F p(x) log q(x) dr(x)
где F обозначает область значений случайной величины X ~ P.
| Аргументы | |
|---|---|
other | Экземпляр tfp.distributions.Distribution. |
name | Python str добавляемый к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
cross_entropy | Вещественное число с плавающей точкой self.dtype Tensor формы [B1, ..., Bn], представляющее n различные вычисления перекрёстной энтропии (по Шеннону). |
entropy
entropy(
name='entropy'
)
Энтропия Шеннона в натах.
event_shape_tensor
event_shape_tensor(
name='event_shape_tensor'
)
Форма одного образца из одного пакета в виде одномерного целочисленного массива int32 Tensor.
| Аргументы | |
|---|---|
name | имя операции |
| Возвращаемое значение | |
|---|---|
event_shape | Tensor. |
is_scalar_batch
is_scalar_batch(
name='is_scalar_batch'
)
Указывает, что batch_shape == [].
| Аргументы | |
|---|---|
name | Python str добавляемый к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
is_scalar_batch | bool скаляр Tensor. |
is_scalar_event
is_scalar_event(
name='is_scalar_event'
)
Указывает, что event_shape == [].
| Аргументы | |
|---|---|
name | Python str добавляемый к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
is_scalar_event | bool скаляр Tensor. |
kl_divergence
kl_divergence(
other, name='kl_divergence'
)
Вычисляет расстояние Кульбака — Лейблера.
Обозначим данное распределение (self) как p, а распределение other — как q. Предполагая, что p, q абсолютно непрерывны относительно эталонной меры r, расстояние Кульбака — Лейблера определяется как:
KL[p, q] = E_p[log(p(X)/q(X))]
= -int_F p(x) log q(x) dr(x) + int_F p(x) log p(x) dr(x)
= H[p, q] - H[p]
где F обозначает область значений случайной величины X ~ p, H[., .] обозначает перекрёстную энтропию (по Шеннону), а H[.] обозначает энтропию (по Шеннону).
| Аргументы | |
|---|---|
other | Экземпляр tfp.distributions.Distribution. |
name | Python str добавляемый к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
kl_divergence | Вещественное число с плавающей точкой self.dtype Tensor формы [B1, ..., Bn], представляющее n различные вычисления расстояния Кульбака — Лейблера. |
log_cdf
log_cdf(
value, name='log_cdf'
)
Логарифмическая функция кумулятивного распределения.
Для случайной величины X, функция кумулятивного распределения cdf имеет вид:
log_cdf(x) := Log[ P[X <= x] ]
Часто для log_cdf(x) используется численное приближение, которое даёт более точный результат, чем просто взятие логарифма cdf при x << -1.
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Python str добавляемый к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
logcdf | тензор Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
log_prob
log_prob(
value, name='log_prob'
)
Логарифмическая функция плотности/массы вероятности.
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Python str добавляемый к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
log_prob | тензор Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
log_survival_function
log_survival_function(
value, name='log_survival_function'
)
Логарифмическая функция выживания.
Для случайной величины X, функция выживания определяется как:
log_survival_function(x) = Log[ P[X > x] ]
= Log[ 1 - P[X <= x] ]
= Log[ 1 - cdf(x) ]
Обычно для логарифмической функции выживания используются различные численные приближения, которые более точные, чем 1 - cdf(x) при x >> 1.
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Python str добавляемый к именам операций, созданных этой функцией. |
Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
mean
mean(
name='mean'
)
Среднее значение.
mode
mode(
name='mode'
)
Мода.
param_shapes
@classmethod
param_shapes(
sample_shape, name='DistributionParamShapes'
)
Формы параметров, учитывая желаемую форму вызова sample().
Это метод класса, который описывает, какие аргументы ключ/значение требуются для создания экземпляра данного Distribution, чтобы получить определённую форму для вызова sample() этим экземпляром.
Подклассы должны переопределять метод класса _param_shapes.
| Аргументы | |
|---|---|
sample_shape | Tensor или список/кортеж Python. Желаемая форма вызова sample(). |
name | Имя для добавления к операциям. |
| Возвращает | |
|---|---|
dict имени параметра к формам Tensor. |
param_static_shapes
@classmethod
param_static_shapes(
sample_shape
)
param_shapes со статическими (т.е. TensorShape) формами.
Это метод класса, который описывает, какие аргументы ключ/значение требуются для создания экземпляра данного Distribution, чтобы получить определённую форму для вызова sample() этим экземпляром. Предполагается, что форма выборки статически известна.
Подклассы должны переопределять метод класса _param_shapes, чтобы возвращать тензоры с постоянными значениями при подаче постоянных значений.
| Аргументы | |
|---|---|
sample_shape | TensorShape или список/кортеж Python. Желаемая форма вызова sample(). |
| Возвращает | |
|---|---|
dict имени параметра к TensorShape. |
| Исключения | |
|---|---|
ValueError | если sample_shape является TensorShape, и не определён полностью. |
prob
prob(
value, name='prob'
)
Функция плотности/массы вероятности.
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Строка Python, добавляемая к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
prob | тензор формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
quantile
quantile(
value, name='quantile'
)
Функция квантиля. Также известна как "обратная функция распределения" или "функция процентиля".
Для случайной переменной X и p in [0, 1], quantile:
quantile(p) := x such that P[X <= x] == p
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Строка Python, добавляемая к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
quantile | тензор формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
sample
sample(
sample_shape=(), seed=None, name='sample'
)
Генерирует выборки заданной формы.
Обратите внимание, что вызов sample() без аргументов сгенерирует одну выборку.
| Аргументы | |
|---|---|
sample_shape | 0D или 1D целочисленное значение. Форма генерируемых выборок. |
seed | Целочисленное семя для генератора псевдослучайных чисел. |
name | Имя для операции. |
| Возвращает | |
|---|---|
samples | тензор с добавленными измерениями sample_shape. |
stddev
stddev(
name='stddev'
)
Среднеквадратическое отклонение.
Среднеквадратическое отклонение определяется как,
stddev = E[(X - E[X])**2]**0.5
где X — случайная переменная, связанная с этим распределением, E обозначает математическое ожидание, и stddev.shape = batch_shape + event_shape.
| Аргументы | |
|---|---|
name | Строка Python, добавляемая к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
stddev | Число с плавающей запятой с формой, идентичной batch_shape + event_shape, т.е. той же формой, что и self.mean(). |
survival_function
survival_function(
value, name='survival_function'
)
Функция выживания.
Для случайной переменной X, функция выживания определяется как:
survival_function(x) = P[X > x]
= 1 - P[X <= x]
= 1 - cdf(x).
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Строка Python, добавляемая к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
тензор с формой sample_shape(x) + self.batch_shape и значениями типа self.dtype. |
variance
variance(
name='variance'
)
Дисперсия.
Дисперсия определяется как,
Var = E[(X - E[X])**2]
где X — случайная переменная, связанная с этим распределением, E обозначает математическое ожидание, и Var.shape = batch_shape + event_shape.
| Аргументы | |
|---|---|
name | Строка Python, добавляемая к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
variance | Число с плавающей запятой с формой, идентичной batch_shape + event_shape, т.е. той же формой, что и self.mean(). |
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/distributions/TransformedDistribution