tf.contrib.distributions.WishartCholesky
Матричное распределение Вишарта на положительно определённых матрицах.
tf.contrib.distributions.WishartCholesky(
df, scale, cholesky_input_output_matrices=False, validate_args=False,
allow_nan_stats=True, name='WishartCholesky'
)
Это распределение определяется скалярной степенью свободы df и нижней, треугольной факторизацией Холецкого, которая характеризует матрицу масштаба.
Использование WishartCholesky — это улучшение с постоянной скоростью по сравнению с WishartFull. Оно экономит операцию O(nbk^3), то есть операцию умножения матриц для выборки и факторизации Холецкого в log_prob. В большинстве случаев это часто экономит ещё одну операцию O(nbk^3), так как большинство случаев использования Wishart также используют факторизацию Холецкого.
Математические подробности
Функция плотности вероятности (pdf) равна,
pdf(X; df, scale) = det(X)**(0.5 (df-k-1)) exp(-0.5 tr[inv(scale) X]) / Z Z = 2**(0.5 df k) |det(scale)|**(0.5 df) Gamma_k(0.5 df)
где:
-
df >= kобозначает степень свободы, -
scaleявляется симметричной, положительно определённойk x kматрицей, -
Zявляется нормирующей константой, и, -
Gamma_kявляется многомерной гамма-функцией.
Примеры
import tensorflow_probability as tfp
tfd = tfp.distributions
# Initialize a single 3x3 Wishart with Cholesky factored scale matrix and 5
# degrees-of-freedom.(*)
df = 5
chol_scale = tf.linalg.cholesky(...) # Shape is [3, 3].
dist = tfd.WishartCholesky(df=df, scale=chol_scale)
# Evaluate this on an observation in R^3, returning a scalar.
x = ... # A 3x3 positive definite matrix.
dist.prob(x) # Shape is [], a scalar.
# Evaluate this on a two observations, each in R^{3x3}, returning a length two
# Tensor.
x = [x0, x1] # Shape is [2, 3, 3].
dist.prob(x) # Shape is [2].
# Initialize two 3x3 Wisharts with Cholesky factored scale matrices.
df = [5, 4]
chol_scale = tf.linalg.cholesky(...) # Shape is [2, 3, 3].
dist = tfd.WishartCholesky(df=df, scale=chol_scale)
# Evaluate this on four observations.
x = [[x0, x1], [x2, x3]] # Shape is [2, 2, 3, 3].
dist.prob(x) # Shape is [2, 2].
# (*) - To efficiently create a trainable covariance matrix, see the example
# in tfp.distributions.matrix_diag_transform.
| Аргументы | |
|---|---|
df | float или double Tensor. Степень свободы, должна быть больше или равна размерности матрицы масштаба. |
scale | float или double Tensor. Факторизация Холецкого симметричной положительно определённой матрицы масштаба распределения. |
cholesky_input_output_matrices | Python bool. Любая функция, вход или выход которой — матрица, предполагает, что вход — факторизация Холецкого и возвращает факторизованную по Холецкому матрицу. Пример log_prob ввода принимает факторизацию Холецкого и sample_n возвращает факторизацию Холецкого при cholesky_input_output_matrices=True. |
validate_args | Python bool, по умолчанию False. Когда True параметры распределения проверяются на валидность, несмотря на возможную деградацию производительности. Когда False недопустимые вводы могут незаметно привести к неправильным выходам. |
allow_nan_stats | Python bool, по умолчанию True. Когда True, статистические данные (например, среднее значение, мода, дисперсия) используют значение "NaN" для обозначения того, что результат не определён. Когда False, возникает исключение, если один или несколько членов партии статистики не определены. |
name | Python str имя, добавляемое в префикс операций, созданных этим классом. |
| Атрибуты | |
|---|---|
allow_nan_stats | Python bool описывающий поведение при неопределенном состоянии. Статистики возвращают +/- бесконечность, когда это имеет смысл. Например, дисперсия распределения Коши равна бесконечности. Однако иногда статистика не определена, например, если pdf распределения не достигает максимума в области определения распределения, мода не определена. Если среднее значение не определено, то по определению дисперсия также не определена. Например, среднее значение для распределения Стьюдента для df = 1 не определено (нет ясного способа сказать, что это либо + либо - бесконечность), поэтому дисперсия = E[(X - среднее)**2] также не определена. |
batch_shape | Форма одного образца из одного индекса события как TensorShape. Может быть частично определена или неизвестна. Размерности партии — индексы независимых, нетождественных параметризаций этого распределения. |
cholesky_input_output_matrices | Логическое значение, указывающее, являются ли входные/выходные данные факторизацией Холецкого. |
df | Степень свободы распределения Вишарта. |
dimension | Размерность основного векторного пространства. p в R^(p*p). |
dtype | DType Tensors, обрабатываемых этим Distribution. |
event_shape | Форма одного образца из одной партии как TensorShape. Может быть частично определена или неизвестна. |
name | Префикс имени для всех операций, созданных этим Distribution. |
parameters | Словарь параметров, используемых для создания этого Distribution. |
reparameterization_type | Описание того, как образцы из распределения перепараметризуются. В настоящее время это одна из статических экземпляров |
scale_operator | Матрица масштаба распределения Вишарта как линейный оператор. |
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.
| Args | |
|---|---|
other | tfp.distributions.Distribution экземпляр. |
name | Префикс Python str добавляется к именам операций, созданных этой функцией. |
| Returns | |
|---|---|
cross_entropy | self.dtype Tensor с формой [B1, ..., Bn], представляющей n различные вычисления кросс-энтропии (Шеннона). |
entropy
entropy(
name='entropy'
)
Энтропия Шеннона в натах.
event_shape_tensor
event_shape_tensor(
name='event_shape_tensor'
)
Форма одного образца из одной группы в виде целочисленного массива 1-D int32 Tensor.
| Args | |
|---|---|
name | имя для присвоения операции |
| Returns | |
|---|---|
event_shape | Tensor. |
is_scalar_batch
is_scalar_batch(
name='is_scalar_batch'
)
Указывает, что batch_shape == [].
| Args | |
|---|---|
name | Префикс Python str добавляется к именам операций, созданных этой функцией. |
| Returns | |
|---|---|
is_scalar_batch | bool скаляр Tensor. |
is_scalar_event
is_scalar_event(
name='is_scalar_event'
)
Указывает, что event_shape == [].
| Args | |
|---|---|
name | Префикс Python str добавляется к именам операций, созданных этой функцией. |
| Returns | |
|---|---|
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[.] обозначает (энтропию Шеннона).
| Args | |
|---|---|
other | tfp.distributions.Distribution экземпляр. |
name | Префикс Python str добавляется к именам операций, созданных этой функцией. |
| Returns | |
|---|---|
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.
| Args | |
|---|---|
value | float или double Tensor. |
name | Префикс Python str добавляется к именам операций, созданных этой функцией. |
| Returns | |
|---|---|
logcdf | массив Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
log_normalization
log_normalization(
name='log_normalization'
)
Вычисляет логарифм нормализующей константы, log(Z).
log_prob
log_prob(
value, name='log_prob'
)
Логарифм плотности/массы вероятности.
| Args | |
|---|---|
value | float или double Tensor. |
name | Префикс Python str добавляется к именам операций, созданных этой функцией. |
| Returns | |
|---|---|
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.
| Args | |
|---|---|
value | float или double Tensor. |
name | Префикс Python str добавляется к именам операций, созданных этой функцией. |
| Returns | |
|---|---|
Tensor с формой sample_shape(x) + self.batch_shape и значениями типа self.dtype. |
mean
mean(
name='mean'
)
Среднее значение.
mean_log_det
mean_log_det(
name='mean_log_det'
)
Вычисляет E[log(det(X))] для данного распределения Вишарта.
mode
mode(
name='mode'
)
Мода.
param_shapes
@classmethod
param_shapes(
sample_shape, name='DistributionParamShapes'
)
Формы параметров, заданных желаемой формой вызова sample().
Это метод класса, который описывает, какие аргументы ключ/значение необходимы для создания данного Distribution, чтобы для вызова sample() этого экземпляра возвращалась определённая форма.
Подклассы должны переопределять метод класса _param_shapes.
| Args | |
|---|---|
sample_shape | Tensor или список/кортеж Python. Желаемая форма вызова sample(). |
name | имя для добавления префикса к операциям. |
| Returns | |
|---|---|
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 | Tensor формы 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 | Tensor формы 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 | Tensor с добавленными размерностями sample_shape. |
scale
scale()
Матрица масштабирования распределения Вишарта.
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/WishartCholesky