Spec-Zone.ru › TensorFlow

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 — положительное вещественное число, представляющее среднее общее количество.

Параметры распределения автоматически транслируются во всех функциях; подробности см. в примерах.

Предупреждение: Из-за конечной точности некоторые компоненты выборок могут быть равны нулю. Это чаще происходит, когда некоторые концентрации очень малы. Перед вычислением плотности округлите выборки до np.finfo(dtype).tiny.

Для выборок из этого распределения используется репараметризация (поточечная дифференцируемость). Производные вычисляются с использованием подхода, описанного в работе 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 Описывает способ репараметризации выборок из распределения.

В настоящее время это один из статических экземпляров: distributions.FULLY_REPARAMETERIZED или distributions.NOT_REPARAMETERIZED.

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API