tf.compat.v1.distributions.Categorical
Категориальное распределение.
Наследуется от: Distribution
tf.compat.v1.distributions.Categorical(
logits=None,
probs=None,
dtype=tf.dtypes.int32,
validate_args=False,
allow_nan_stats=True,
name='Categorical'
)
Категориальное распределение параметризуется вероятностями или логарифмами вероятностей для набора из K классов. Оно определено на целых числах {0, 1, ..., K}.
Категориальное распределение тесно связано с распределениями OneHotCategorical и Multinomial. Категориальное распределение можно интуитивно представить как генерацию выборок в соответствии с argmax{ OneHotCategorical(probs) }, которое само по себе идентично argmax{ Multinomial(probs, total_count=1) }.
Математические подробности
Функция вероятностей (pmf) имеет вид:
pmf(k; pi) = prod_j pi_j**[k == j]
Подводные камни
Число классов, K, не должно превышать:
- наибольшее целое число, представимое в
self.dtype, то есть2**(mantissa_bits+1)(IEEE 754), - максимальный индекс
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.
Примеры
Создает распределение с 3 классами, в котором наиболее вероятен 2-й класс.
dist = Categorical(probs=[0.1, 0.5, 0.4])
n = 1e4
empirical_prob = tf.cast(
tf.histogram_fixed_width(
dist.sample(int(n)),
[0., 2],
nbins=3),
dtype=tf.float32) / n
# ==> array([ 0.1005, 0.5037, 0.3958], dtype=float32)
Создает распределение с 3 классами, в котором наиболее вероятен 2-й класс. Параметризуется с помощью логитов, а не вероятностей.
dist = Categorical(logits=np.log([0.1, 0.5, 0.4])
n = 1e4
empirical_prob = tf.cast(
tf.histogram_fixed_width(
dist.sample(int(n)),
[0., 2],
nbins=3),
dtype=tf.float32) / n
# ==> array([0.1045, 0.5047, 0.3908], dtype=float32)
Создает распределение с 3 классами, в котором наиболее вероятен 3-й класс. Функции распределения можно вычислять для счетчиков.
# counts is a scalar. p = [0.1, 0.4, 0.5] dist = Categorical(probs=p) dist.prob(0) # Shape [] # p will be broadcast to [[0.1, 0.4, 0.5], [0.1, 0.4, 0.5]] to match counts. counts = [1, 0] dist.prob(counts) # Shape [2] # p will be broadcast to shape [3, 5, 7, 3] to match counts. counts = [[...]] # Shape [5, 7, 3] dist.prob(counts) # Shape [5, 7, 3]
| Аргументы | |
|---|---|
logits | Тензор Tensor N-го ранга, N >= 1, представляющий логарифмы вероятностей набора категориальных распределений. Первые N - 1 измерений индексируют пакет независимых распределений, а последнее измерение представляет вектор логитов для каждого класса. Следует передать только один из аргументов: logits или probs. |
probs | Тензор Tensor N-го ранга, N >= 1, представляющий вероятности набора категориальных распределений. Первые N - 1 измерений индексируют пакет независимых распределений, а последнее измерение представляет вектор вероятностей для каждого класса. Следует передать только один из аргументов: logits или probs. |
dtype | Тип выборок событий (по умолчанию: int32). |
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. Может быть определена частично или неизвестна. Размерности пакета являются индексами независимых параметризаций этого распределения, которые могут различаться. |
dtype | DType обработанных этим Distribution Tensor. |
event_shape | Форма одной выборки из одного пакета в виде TensorShape. Может быть определена частично или неизвестна. |
event_size | Скалярный тензор int32: число классов. |
logits | Вектор покоординатных логитов. |
name | Имя, добавляемое в начало имен всех операций, созданных этим Distribution. |
parameters | Словарь параметров, использованных для создания экземпляра этого Distribution. |
probs | Вектор покоординатных вероятностей. |
reparameterization_type | Описывает способ репараметризации выборок из распределения. В настоящее время это один из статических экземпляров: |
validate_args | Объект Python bool, указывающий, что включены потенциально затратные проверки. |
Методы
batch_shape_tensor
batch_shape_tensor(
name='batch_shape_tensor'
)
Форма одной выборки для одного индекса события в виде 1-D 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-D тензора Tensor типа int32.
| Аргументы | |
|---|---|
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'
)
Логарифм функции плотности/вероятностей.
| Аргументы | |
|---|---|
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) ]
Как правило, для логарифма функции выживания можно использовать другие численные приближения, которые при условии x >> 1 точнее, чем 1 - cdf(x).
| Аргументы | |
|---|---|
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'
)
Функция плотности/вероятностей.
| Аргументы | |
|---|---|
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 | Целочисленное начальное значение Python для генератора случайных чисел |
name | имя операции. |
| Возвращаемое значение | |
|---|---|
samples | a Tensor with prepended dimensions 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/Categorical