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 , добавляемое к операциям, созданным этим классом. |
| Атрибуты | |
|---|---|
allow_nan_stats | Python bool , описывающий поведение при неопределенности статистик. Статистики возвращают +/- бесконечность, когда это имеет смысл. Например, дисперсия распределения Коши равна бесконечности. Однако иногда статистика не определена, например, если pdf распределения не достигает максимума в пределах области определения распределения, мода не определена. Если среднее значение не определено, то по определению дисперсия также не определена. Например, среднее значение для распределения Стьюдента при 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, добавляемое к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
cross_entropy | self.dtype Tensor с формой [B1, ..., Bn], представляющей n различные вычисления (энтропии Шеннона). |
data-text="entropy" id="entropy" tabindex="0">entropy
entropy(
name='entropy'
)
Энтропия Шеннона в натах.
data-text="event_shape_tensor" id="event_shape_tensor" tabindex="0">event_shape_tensor
event_shape_tensor(
name='event_shape_tensor'
)
Форма одного образца из одной партии в виде 1-мерного целочисленного значения int32 Tensor.
| Аргументы | |
|---|---|
name | Имя, которое нужно дать операции |
| Возвращаемое значение | |
|---|---|
event_shape | Tensor. |
data-text="is_scalar_batch" id="is_scalar_batch" tabindex="0">is_scalar_batch
is_scalar_batch(
name='is_scalar_batch'
)
Указывает, что batch_shape == [].
| Аргументы | |
|---|---|
name | Предположение Python, добавляемое к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
is_scalar_batch | bool скаляр Tensor. |
data-text="is_scalar_event" id="is_scalar_event" tabindex="0">is_scalar_event
is_scalar_event(
name='is_scalar_event'
)
Указывает, что event_shape == [].
| Аргументы | |
|---|---|
name | Предположение Python, добавляемое к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
is_scalar_event | bool скаляр Tensor. |
data-text="kl_divergence" id="kl_divergence" tabindex="0">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, добавляемое к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
kl_divergence | self.dtype Tensor с формой [B1, ..., Bn], представляющей n различные вычисления расхождения Кульбака-Лайблера. |
data-text="log_cdf" id="log_cdf" tabindex="0">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, добавляемое к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
logcdf | Tensor с формой sample_shape(x) + self.batch_shape и значениями типа self.dtype. |
data-text="log_prob" id="log_prob" tabindex="0">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, добавляемое к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
log_prob | Tensor с формой sample_shape(x) + self.batch_shape и значениями типа self.dtype. |
data-text="log_survival_function" id="log_survival_function" tabindex="0">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, добавляемое к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
Tensor с формой sample_shape(x) + self.batch_shape и значениями типа self.dtype. |
data-text="mean" id="mean" tabindex="0">mean
mean(
name='mean'
)
Математическое ожидание.
data-text="mode" id="mode" tabindex="0">mode
mode(
name='mode'
)
Мода.
Дополнительная документация из Dirichlet:
Примечание: Мода не определена, когда любаяconcentration <= 1. Еслиself.allow_nan_statsявляетсяTrue, используетсяNaNдля неопределённых мод. Еслиself.allow_nan_statsявляетсяFalse, при неопределённых модах возникает исключение.
data-text="param_shapes" id="param_shapes" tabindex="0">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 для имён операций, созданных этой функцией. |
| Возвращает | |
|---|---|
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 тензор int32 Tensor. Форма генерируемых выборок. |
seed | Целочисленное семя Python для генератора псевдослучайных чисел (RNG) |
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/r2.3/api_docs/python/tf/compat/v1/distributions/Dirichlet