tf.compat.v1.distributions.DirichletMultinomial
Составное распределение Дирихле — мультиномиальное.
Наследуется от: Distribution
tf.compat.v1.distributions.DirichletMultinomial(
total_count,
concentration,
validate_args=False,
allow_nan_stats=True,
name='DirichletMultinomial'
)
Распределение Дирихле — мультиномиальное параметризуется вектором (или набором векторов) длины K concentration (K > 1) и числом испытаний total_count, то есть количеством испытаний для одной выборки из DirichletMultinomial. Оно определено на векторе (или наборе векторов) длины K counts, таком что tf.reduce_sum(counts, -1) = total_count. Распределение Дирихле — мультиномиальное совпадает с бета-биномиальным распределением при K = 2.
Математические подробности
Распределение Дирихле — мультиномиальное задаёт распределение по количествам объектов в K классах, то есть по вектору длины K из неотрицательных целых чисел counts = n = [n_0, ..., n_{K-1}].
Функция вероятностной массы (pmf) имеет вид:
pmf(n; alpha, N) = Beta(alpha + n) / (prod_j n_j!) / Z Z = Beta(alpha) / N!
где:
-
concentration = alpha = [alpha_0, ..., alpha_{K-1}],alpha_j > 0, -
total_count = N,N— положительное целое число, -
N!— факториалN, и -
Beta(x) = prod_j Gamma(x_j) / Gamma(sum_j x_j)— многомерная бета-функция, а -
Gamma— гамма-функция.
Распределение Дирихле — мультиномиальное является составным распределением, то есть его выборки генерируются следующим образом.
- Выберите вероятности классов:
probs = [p_0,...,p_{K-1}] ~ Dir(concentration) - Получите целые числа:
counts = [n_0,...,n_{K-1}] ~ Multinomial(total_count, probs)
Последнее измерение concentration задаёт параметры одного распределения Дирихле — мультиномиального. При вызове функций распределения (например, dist.prob(counts)), concentration, total_count и counts приводятся к одинаковой форме. Последнее измерение counts соответствует отдельным распределениям Дирихле — мультиномиальным.
Параметры распределения автоматически приводятся к совместимой форме во всех функциях; подробности см. в примерах.
Возможные проблемы
Число классов, K, не должно превышать:
- наибольшее целое число, представимое типом
self.dtype, то есть2**(mantissa_bits+1)(IEE754); - максимальный индекс
Tensor, то есть2**31-1.
Иными словами,
K <= min(2**31-1, {
tf.float16: 2**11,
tf.float32: 2**24,
tf.float64: 2**53 }[param.dtype])
Примечание: Это условие проверяется только при self.validate_args = True.
Примеры
alpha = [1., 2., 3.] n = 2. dist = DirichletMultinomial(n, alpha)
Создаёт распределение с 3 классами, причём вероятность выбора 3-го класса максимальна. Функции распределения можно вычислять для заданных количеств.
# counts same shape as alpha. counts = [0., 0., 2.] dist.prob(counts) # Shape [] # alpha will be broadcast to [[1., 2., 3.], [1., 2., 3.]] to match counts. counts = [[1., 1., 0.], [1., 0., 1.]] dist.prob(counts) # Shape [2] # alpha will be broadcast to shape [5, 7, 3] to match counts. counts = [[...]] # Shape [5, 7, 3] dist.prob(counts) # Shape [5, 7]
Создаёт набор из 2 распределений с 3 классами.
alpha = [[1., 2., 3.], [4., 5., 6.]] # Shape [2, 3] n = [3., 3.] dist = DirichletMultinomial(n, alpha) # counts will be broadcast to [[2., 1., 0.], [2., 1., 0.]] to match alpha. counts = [2., 1., 0.] dist.prob(counts) # Shape [2]
| Аргументы | |
|---|---|
total_count | Тензор неотрицательных чисел с плавающей точкой, тип данных которого совпадает с типом concentration. Форма должна допускать приведение к [N1,..., Nm] с m >= 0. Задаёт набор из N1 x ... x Nm различных мультиномиальных распределений Дирихле. Его компоненты должны быть равны целым значениям. |
concentration | Положительный тензор с плавающей точкой, тип данных которого совпадает с типом n; его форма должна допускать приведение к [N1,..., Nm, K] m >= 0. Задаёт набор из N1 x ... x Nm различных мультиномиальных распределений Дирихле с 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 | Сумма последней размерности параметра концентрации. |
total_count | Число испытаний, используемое для построения выборки. |
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'.
Дополнительная документация из DirichletMultinomial:
Ковариация для каждого элемента пакета определяется следующим образом:
Var(X_j) = n * alpha_j / alpha_0 * (1 - alpha_j / alpha_0) * (n + alpha_0) / (1 + alpha_0)
где concentration = alpha и total_concentration = alpha_0 = sum_j alpha_j.
Ковариация между элементами пакета определяется следующим образом:
Cov(X_i, X_j) = -n * alpha_i * alpha_j / alpha_0 ** 2 * (n + alpha_0) / (1 + alpha_0)
| Аргументы | |
|---|---|
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'
)
Логарифм функции плотности/массы вероятности.
Дополнительная документация из DirichletMultinomial:
Для каждого пакета количеств value = [n_0, ..., n_{K-1}] величина P[value] равна вероятности того, что после self.total_count выборок из этого распределения Дирихле — мультиномиального число выборок, попавших в класс j, составит n_j. Поскольку это определение является обменным, разные последовательности могут иметь одинаковые количества, поэтому вероятность включает комбинаторный коэффициент.
Примечание:valueдолжен быть неотрицательным тензором типаself.dtype, не содержать дробных компонентов и удовлетворять условиюtf.reduce_sum(value, -1) = self.total_count. Его форма должна допускать приведение к совместимой форме сself.concentrationиself.total_count.
| Аргументы | |
|---|---|
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'
)
Мода.
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'
)
Функция плотности/массы вероятности.
Дополнительная документация из DirichletMultinomial:
Для каждого набора количеств, value = [n_0, ..., n_{K-1}], P[value] — это вероятность того, что после выборки self.total_count значений из этого распределения Дирихле — мультиномиального распределения количество значений, попавших в класс j, составит n_j. Поскольку это определение обменное, разные последовательности имеют одинаковые количества, поэтому вероятность включает комбинаторный коэффициент.
Примечание:valueдолжен быть неотрицательным тензором с типом данныхself.dtype, не содержать дробных значений и удовлетворять условиюtf.reduce_sum(value, -1) = self.total_count. Его форма должна быть совместима сself.concentrationиself.total_countпри широковещательной передаче.
| Аргументы | |
|---|---|
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 | Целочисленное значение 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/DirichletMultinomial