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, описывающий поведение при неопределённости статистического показателя. Статистические показатели возвращают +/- бесконечность, когда это имеет смысл. Например, дисперсия распределения Коши равна бесконечности. Однако иногда статистический показатель не определён, например, если функция плотности распределения не достигает максимума в области определения распределения, мода не определена. Если среднее значение не определено, то по определению дисперсия также не определена. Например, среднее значение для распределения Стьюдента для df = 1 не определено (нет ясного способа сказать, что это либо + или - бесконечность), поэтому дисперсия = E[(X - среднее значение)**2] также не определена. |
batch_shape | Форма отдельной выборки из одного индекса события в виде TensorShape. Может быть частично определена или неизвестна. Размеры партии — индексы для независимых, неидентичных параметризаций этого распределения. |
concentration | Параметр концентрации; ожидаемые числовые значения для этой координаты. |
dtype | DType обрабатываемые этим 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'
)
Форма одного образца из одного пакета как 1-мерный целочисленный массив 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
)
TensorShape формы, используемые для `param_shapes`.
Это метод класса, описывающий какие пары "ключ-значение" необходимы для создания экземпляра данного 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 | 0D или 1D int32 Tensor. Форма генерируемых выборок. |
seed | целочисленное 0D-значение, используемое в качестве начального значения для генератора случайных чисел. |
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, добавляемая в имена операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
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