tf.compat.v1.distributions.Dirichlet
Распределение Дирихле.
Наследуется от: Distribution
tf.compat.v1.distributions.Dirichlet(
concentration,
validate_args=False,
allow_nan_stats=True,
name='Dirichlet'
)
Распределение Дирихле задано на (k-1)-симплексе с помощью положительного вектора k длины concentration (k > 1). Распределение Дирихле совпадает с бета-распределением, когда k = 2.
Математические подробности
Распределение Дирихле задано на открытом (k-1)-симплексе, то есть
S^{k-1} = { (x_0, ..., x_{k-1}) in R^k : sum_j x_j = 1 and all_j x_j > 0 }.
Функция плотности вероятности (pdf) имеет вид:
pdf(x; alpha) = prod_j x_j**(alpha_j - 1) / Z Z = prod_j Gamma(alpha_j) / Gamma(sum_j alpha_j)
где:
-
x in S^{k-1}, то есть(k-1)-симплекс, -
concentration = alpha = [alpha_0, ..., alpha_{k-1}],alpha_j > 0, -
Z— нормирующая константа, также называемая многомерной бета-функцией, и -
Gamma— гамма-функция.
concentration представляет собой среднее общее число появлений классов, то есть
concentration = alpha = mean * total_concentration
где mean в S^{k-1}, а total_concentration — положительное вещественное число, представляющее среднее общее количество.
Параметры распределения автоматически транслируются во всех функциях; подробности см. в примерах.
Для выборок из этого распределения используется репараметризация (поточечная дифференцируемость). Производные вычисляются с использованием подхода, описанного в работе Figurnov et al., 2018.
Примеры
import tensorflow_probability as tfp
tfd = tfp.distributions
# Create a single trivariate Dirichlet, with the 3rd class being three times
# more frequent than the first. I.e., batch_shape=[], event_shape=[3].
alpha = [1., 2, 3]
dist = tfd.Dirichlet(alpha)
dist.sample([4, 5]) # shape: [4, 5, 3]
# x has one sample, one batch, three classes:
x = [.2, .3, .5] # shape: [3]
dist.prob(x) # shape: []
# x has two samples from one batch:
x = [[.1, .4, .5],
[.2, .3, .5]]
dist.prob(x) # shape: [2]
# alpha will be broadcast to shape [5, 7, 3] to match x.
x = [[...]] # shape: [5, 7, 3]
dist.prob(x) # shape: [5, 7]
# Create batch_shape=[2], event_shape=[3]:
alpha = [[1., 2, 3],
[4, 5, 6]] # shape: [2, 3]
dist = tfd.Dirichlet(alpha)
dist.sample([4, 5]) # shape: [4, 5, 2, 3]
x = [.2, .3, .5]
# x will be broadcast as [[.2, .3, .5],
# [.2, .3, .5]],
# thus matching batch_shape [2, 3].
dist.prob(x) # shape: [2]
Вычислите градиенты выборок по параметрам:
alpha = tf.constant([1.0, 2.0, 3.0]) dist = tfd.Dirichlet(alpha) samples = dist.sample(5) # Shape [5, 3] loss = tf.reduce_mean(tf.square(samples)) # Arbitrary loss function # Unbiased stochastic gradients of the loss function grads = tf.gradients(loss, alpha)
| Ссылки | |
|---|---|
| Градиенты неявной репараметризации: Figurnov et al., 2018 (pdf) |
| Аргументы | |
|---|---|
concentration | Положительный тензор с плавающей точкой Tensor, указывающий среднее число появлений класса; также называется «альфа». Подразумевает self.dtype и self.batch_shape, self.event_shape, то есть если concentration.shape = [N1, N2, ..., Nm, k], то batch_shape = [N1, N2, ..., Nm] и event_shape = [k]. |
validate_args | Python bool, по умолчанию False. Если True, параметры распределения проверяются на корректность, что может снизить производительность во время выполнения. Если False, некорректные входные данные могут незаметно привести к неправильным результатам. |
allow_nan_stats | Python bool, по умолчанию True. Если True, статистики (например, среднее, мода, дисперсия) используют значение «NaN», указывающее, что результат не определен. Если False, возникает исключение, если одна или несколько статистик элементов пакета не определены. |
name | Имя Python str, добавляемое перед Ops, создаваемыми этим классом. |
| Атрибуты | |
|---|---|
allow_nan_stats | Python bool, описывающий поведение в случае неопределенной статистики. Статистики возвращают +/- бесконечность, когда это имеет смысл. Например, дисперсия распределения Коши равна бесконечности. Однако иногда статистика не определена. Например, если плотность вероятности распределения не достигает максимума в пределах области значений распределения, мода не определена. Если среднее не определено, то по определению не определена и дисперсия. Например, среднее распределения Стьюдента с df = 1 не определено (нельзя однозначно сказать, равно ли оно + или - бесконечности), поэтому дисперсия = E[(X - mean)**2] также не определена. |
batch_shape | Форма одной выборки для одного индекса события в виде TensorShape. Может быть определена частично или неизвестна. Размерности пакета являются индексами независимых параметризаций этого распределения, не совпадающих друг с другом. |
concentration | Параметр концентрации; ожидаемое число появлений для этой координаты. |
dtype | DType Tensor, обрабатываемых этим Distribution. |
event_shape | Форма одной выборки для одного пакета в виде TensorShape. Может быть определена частично или неизвестна. |
name | Имя, добавляемое перед всеми операциями, создаваемыми этим Distribution. |
parameters | Словарь параметров, использованных для создания этого Distribution. |
reparameterization_type | Описывает способ репараметризации выборок из распределения. В настоящее время это один из статических экземпляров: |
total_concentration | Сумма по последней размерности параметра концентрации. |
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 определяется следующим образом:
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'
)
Логарифм функции плотности/вероятности.
Дополнительная документация из Dirichlet:
Примечание:valueдолжен быть неотрицательным тензором с типом данныхself.dtypeи принадлежать(self.event_shape() - 1)-симплексу, то естьtf.reduce_sum(value, -1) = 1. Его форма должна быть совместима сself.batch_shape() + self.event_shape().
| Аргументы | |
|---|---|
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'
)
Мода.
Дополнительная документация из Dirichlet:
Примечание: Мода не определена, если любоеconcentration <= 1. Еслиself.allow_nan_stats—True, для неопределенных мод используетсяNaN. Еслиself.allow_nan_stats—False, возникает исключение, когда одна или несколько мод не определены.
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'
)
Функция плотности вероятности/вероятностной массы.
Дополнительная документация из Dirichlet:
Примечание:valueдолжен быть неотрицательным тензором с типом данныхself.dtypeи принадлежать(self.event_shape() - 1)-симплексу, то естьtf.reduce_sum(value, -1) = 1. Его форма должна быть совместима сself.batch_shape() + self.event_shape().
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Python str, добавляемое перед именами операций, создаваемых этой функцией. |
| Возвращает | |
|---|---|
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 str добавляется к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
quantile | Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
sample
sample(
sample_shape=(), seed=None, name='sample'
)
Создает выборки указанной формы.
Обратите внимание, что вызов sample() без аргументов создает одну выборку.
| Аргументы | |
|---|---|
sample_shape | int32 Tensor размерности 0 или 1. Форма создаваемых выборок. |
seed | Целочисленное значение seed Python для генератора случайных чисел |
name | имя операции. |
| Возвращает | |
|---|---|
samples | Tensor с добавленными в начало размерностями sample_shape. |
stddev
stddev(
name='stddev'
)
Стандартное отклонение.
Стандартное отклонение определяется следующим образом:
stddev = E[(X - E[X])**2]**0.5
где X — случайная величина, соответствующая этому распределению, E обозначает математическое ожидание, а stddev.shape = batch_shape + event_shape.
| Аргументы | |
|---|---|
name | Префикс Python str добавляется к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
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 str добавляется к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
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 str добавляется к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
variance | Число с плавающей точкой Tensor, форма которого совпадает с формой batch_shape + event_shape, то есть с формой self.mean(). |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/compat/v1/distributions/Dirichlet