tf.contrib.distributions.MultivariateNormalTriL
Многомерное нормальное распределение над R^k.
tf.contrib.distributions.MultivariateNormalTriL(
loc=None, scale_tril=None, validate_args=False, allow_nan_stats=True,
name='MultivariateNormalTriL'
)
Распределение Многомерной Нормали определяется над R^k и параметризуется (пачкой) вектором длины k loc (также известным как "mu") и (пачкой) нижнетреугольной k x k scale матрицей; covariance = scale @ scale.T где @ обозначает матричное умножение.
Математические детали
Функция плотности вероятности (pdf) равна,
pdf(x; loc, scale) = exp(-0.5 ||y||**2) / Z, y = inv(scale) @ (x - loc), Z = (2 pi)**(0.5 k) |det(scale)|,
где:
-
loc— это вектор вR^k, -
scale— это матрица вR^{k x k},covariance = scale @ scale.T, -
Zобозначает константу нормирования, и, -
||y||**2обозначает квадрат Евклидовой нормыy.
Матрица (без пакета) scale равна:
scale = scale_tril
где scale_tril — это нижнетреугольная k x k матрица с ненулевой диагональю, т.е. tf.linalg.tensor_diag_part(scale_tril) != 0.
Дополнительные ведущие размерности (если таковые имеются) будут индексировать пакеты.
Распределение MultivariateNormal является членом семейства локально-масштабного, т.е. его можно создать как,
X ~ MultivariateNormal(loc=0, scale=1) # Identity scale, zero shift. Y = scale @ X + loc
Обучаемые (пакетные) нижнетреугольные матрицы могут быть созданы с помощью tfp.distributions.matrix_diag_transform() и/или tfp.distributions.fill_triangular()
Примеры
import tensorflow_probability as tfp
tfd = tfp.distributions
# Initialize a single 3-variate Gaussian.
mu = [1., 2, 3]
cov = [[ 0.36, 0.12, 0.06],
[ 0.12, 0.29, -0.13],
[ 0.06, -0.13, 0.26]]
scale = tf.linalg.cholesky(cov)
# ==> [[ 0.6, 0. , 0. ],
# [ 0.2, 0.5, 0. ],
# [ 0.1, -0.3, 0.4]])
mvn = tfd.MultivariateNormalTriL(
loc=mu,
scale_tril=scale)
mvn.mean().eval()
# ==> [1., 2, 3]
# Covariance agrees with cholesky(cov) parameterization.
mvn.covariance().eval()
# ==> [[ 0.36, 0.12, 0.06],
# [ 0.12, 0.29, -0.13],
# [ 0.06, -0.13, 0.26]]
# Compute the pdf of an observation in `R^3` ; return a scalar.
mvn.prob([-1., 0, 1]).eval() # shape: []
# Initialize a 2-batch of 3-variate Gaussians.
mu = [[1., 2, 3],
[11, 22, 33]] # shape: [2, 3]
tril = ... # shape: [2, 3, 3], lower triangular, non-zero diagonal.
mvn = tfd.MultivariateNormalTriL(
loc=mu,
scale_tril=tril)
# Compute the pdf of two `R^3` observations; return a length-2 vector.
x = [[-0.9, 0, 0.1],
[-10, 0, 9]] # shape: [2, 3]
mvn.prob(x).eval() # shape: [2]
# Instantiate a "learnable" MVN.
dims = 4
with tf.compat.v1.variable_scope("model"):
mvn = tfd.MultivariateNormalTriL(
loc=tf.compat.v1.get_variable(shape=[dims], dtype=tf.float32,
name="mu"),
scale_tril=tfd.fill_triangular(
tf.compat.v1.get_variable(shape=[dims * (dims + 1) / 2],
dtype=tf.float32, name="chol_Sigma")))
| Аргументы | |
|---|---|
loc | Число с плавающей запятой Tensor. Если это установлено как None, loc неявно 0. При указании может иметь форму [B1, ..., Bb, k], где b >= 0 и k — размер события. |
scale_tril | Число с плавающей запятой, нижнетреугольная Tensor с ненулевыми диагональными элементами. scale_tril имеет форму [B1, ..., Bb, k, k], где `b
|
| Исключения | |
|---|---|
ValueError | если ни loc ни scale_tril не указаны. |
| Атрибуты | |
|---|---|
allow_nan_stats | Python-описание поведения при отсутствии статистики. Статистики возвращают +/- бесконечность, когда это имеет смысл. Например, дисперсия распределения Коши равна бесконечности. Однако иногда статистика не определена, например, если функция плотности распределения не достигает максимума в пределах области распределения, мода не определена. Если среднее значение не определено, то дисперсия по определению не определена. Например, среднее значение для распределения Стьюдента при df = 1 не определено (нет ясного способа сказать, что это либо + либо - бесконечность), поэтому дисперсия = E[(X - среднее)**2] также не определена. |
batch_shape | Форма одного образца из одного индекса события как TensorShape. Может быть частично определена или неизвестна. Измерения пакетной обработки индексируют независимые, нетождественные параметризации этого распределения. |
bijector | Функция, преобразующая x => y. |
distribution | Базовое распределение, p(x). |
dtype | DType Tensors, обрабатываемые этим Distribution. |
event_shape | Форма одного образца из одной группы как TensorShape. Может быть частично определена или неизвестна. |
loc | loc Tensor в Y = scale @ X + loc. |
name | Префикс имени ко всем операциям, созданным этим Distribution. |
parameters | Словарь параметров, используемых для создания этого Distribution. |
reparameterization_type | Описывает, как образцы из распределения перепараметризованы. В настоящее время это один из статических экземпляров |
scale | scale LinearOperator в Y = scale @ X + loc. |
validate_args | Python-индикатор, указывающий, возможно, на включение дорогостоящих проверок. |
Методы
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-префикс имен операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
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-префикс имен операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
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 | Префикс для имён операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
cross_entropy | self.dtype Tensor с формой [B1, ..., Bn], представляющей собой n различных расчётов кросс-энтропии (энтропии Шеннона). |
entropy
entropy(
name='entropy'
)
Энтропия Шеннона в натах.
event_shape_tensor
event_shape_tensor(
name='event_shape_tensor'
)
Форма одного образца из одной группы в виде 1-мерного int32 Tensor.
| Аргументы | |
|---|---|
name | Имя для операции |
| Возвращаемое значение | |
|---|---|
event_shape | Tensor. |
is_scalar_batch
is_scalar_batch(
name='is_scalar_batch'
)
Указывает, что batch_shape == [].
| Аргументы | |
|---|---|
name | Префикс для имён операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
is_scalar_batch | bool скаляр Tensor. |
is_scalar_event
is_scalar_event(
name='is_scalar_event'
)
Указывает, что event_shape == [].
| Аргументы | |
|---|---|
name | Префикс для имён операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
is_scalar_event | bool скаляр Tensor. |
kl_divergence
kl_divergence(
other, name='kl_divergence'
)
Вычисляет расстояние Кульбака—Лайблера.
Обозначим это распределение (self) как p, а распределение other как q. Предполагая, что p, q абсолютно непрерывны относительно меры отсчёта r, расстояние KL определяется как:
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 | Префикс для имён операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
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 | Префикс для имён операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
logcdf | Tensor формы sample_shape(x) + self.batch_shape с значениями типа self.dtype. |
log_prob
log_prob(
value, name='log_prob'
)
Логарифмическая функция плотности/массы вероятности.
Дополнительная документация из MultivariateNormalLinearOperator:
value — это вектор группы с совместимой формой, если value — это Tensor, форма которого может быть расширена до:
self.batch_shape + self.event_shape
или
[M1, ..., Mm] + self.batch_shape + self.event_shape
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Префикс для имён операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
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 | Префикс для имён операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
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 | Имя для добавления префикса к операциям. |
| Возвращаемое значение | |
|---|---|
Отображение имени параметра на формы 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'
)
Функция плотности/массы вероятности.
Дополнительная документация из MultivariateNormalLinearOperator:
value — это пакетный вектор с совместимой формой, если value является Tensor с формой, которая может быть расширена до одной из:
self.batch_shape + self.event_shape
или
[M1, ..., Mm] + self.batch_shape + self.event_shape
| Аргументы | |
|---|---|
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(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 int32 Tensor. Форма сгенерированных образцов. |
seed | Целое число Python-семя для генератора случайных чисел. |
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 | Вещественный Tensor с формой, совпадающей с 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-строка, добавляемая к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
Tensor с формой 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 | Вещественный Tensor с формой, совпадающей с 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/MultivariateNormalTriL