tf.distributions.Dirichlet
Распределение Дирихле.
Наследуется от: Distribution
tf.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 — положительное действительное число, представляющее среднее общее количество.
Параметры распределения автоматически транслируются во всех функциях; см. примеры для получения подробностей.
Выборки из этого распределения повторно параметризуются (путевая дифференцируемость). Производные вычисляются с помощью подхода, описанного в статье
Michael Figurnov, Shakir Mohamed, Andriy Mnih. Implicit Reparameterization Gradients, 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)
| Аргументы | |
|---|---|
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 - 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 разные вычисления (энтропии Шеннона) перекрёстной энтропии. |
entropy
entropy
entropy(
name='entropy'
)
Энтропия Шеннона в натах.
event_shape_tensor
event_shape_tensor
event_shape_tensor(
name='event_shape_tensor'
)
Форма одного образца из одной партии в виде 1-мерного целочисленного массива int32 Tensor.
| Аргументы | |
|---|---|
name | имя для операции |
| Возвращаемое значение | |
|---|---|
event_shape | Tensor. |
is_scalar_batch
is_scalar_batch
is_scalar_batch(
name='is_scalar_batch'
)
Указывает, что batch_shape == [].
| Аргументы | |
|---|---|
name | Строка Python, добавляемая в префикс имен операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
is_scalar_batch | скалярное значение bool Tensor. |
is_scalar_event
is_scalar_event
is_scalar_event(
name='is_scalar_event'
)
Указывает, что event_shape == [].
| Аргументы | |
|---|---|
name | Строка Python, добавляемая в префикс имен операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
is_scalar_event | скалярное значение bool Tensor. |
kl_divergence
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 разные вычисления расстояния Кульбака—Лайблера. |
log_cdf
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. |
log_prob
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. |
log_survival_function
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. |
mean
mean
mean(
name='mean'
)
Среднее значение.
mode
mode
mode(
name='mode'
)
Мода.
Дополнительная документация из Dirichlet:
Примечание: Мода не определена, когдаconcentration <= 1. Еслиself.allow_nan_statsявляетсяTrue,NaNиспользуется для неопределённых мод. Еслиself.allow_nan_statsявляетсяFalse, при попытке получить неопределённые моды выбрасывается исключение.
param_shapes
param_shapes
@classmethod
param_shapes(
sample_shape, name='DistributionParamShapes'
)
Формы параметров, учитывая желаемую форму вызова функции sample().
Это метод класса, описывающий требуемые аргументы key/value для создания экземпляра данного Distribution, чтобы получить определённую форму для вызова sample() этим экземпляром.
Подклассы должны переопределять метод класса _param_shapes.
| Аргументы | |
|---|---|
sample_shape | Tensor или список/кортеж Python. Желаемая форма вызова sample(). |
name | имя для добавления к операциям. |
| Возвращает | |
|---|---|
dict имени параметра к формам Tensor. |
data-text="param_static_shapes" id="param_static_shapes" tabindex="0">param_static_shapes
@classmethod
param_static_shapes(
sample_shape
)
param_shapes со статическими (т.е. TensorShape) формами.
Это метод класса, описывающий требуемые аргументы key/value для создания экземпляра данного Distribution, чтобы получить определённую форму для вызова sample() этим экземпляром. Предполагается, что форма выборки известна статически.
Подклассы должны переопределять метод класса _param_shapes, чтобы возвращать тензоры с постоянными значениями при передаче постоянных значений.
| Аргументы | |
|---|---|
sample_shape | TensorShape или список/кортеж Python. Желаемая форма вызова sample(). |
| Возвращает | |
|---|---|
dict имени параметра к формам TensorShape. |
| Возможные исключения | |
|---|---|
ValueError | если sample_shape является TensorShape и не определён полностью. |
data-text="prob" id="prob" tabindex="0">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. |
data-text="quantile" id="quantile" tabindex="0">quantile
quantile(
value, name='quantile'
)
Функция квантиля. Также известна как "обратная функция распределения" или "функция процентиля".
Для случайной величины X и p in [0, 1], квантиль равен:
quantile(p) := x such that P[X <= x] == p
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Python-строка для добавления к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
quantile | тензор с формой sample_shape(x) + self.batch_shape и значениями типа self.dtype. |
data-text="sample" id="sample" tabindex="0">sample
sample(
sample_shape=(), seed=None, name='sample'
)
Генерирует выборки указанной формы.
Обратите внимание, что вызов sample() без аргументов сгенерирует одну выборку.
| Аргументы | |
|---|---|
sample_shape | 0D или 1D тензор int32 Tensor. Форма генерируемых выборок. |
seed | Python-целое число, семя для генератора псевдослучайных чисел. |
name | имя для операции. |
| Возвращает | |
|---|---|
samples | тензор с добавленными измерениями sample_shape. |
data-text="stddev" id="stddev" tabindex="0">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(). |
data-text="survival_function" id="survival_function" tabindex="0">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. |
data-text="variance" id="variance" tabindex="0">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/distributions/Dirichlet