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'
)
Распределение «Categorical» параметризуется либо вероятностями, либо логарифмами вероятностей набора из K классов. Оно определено над целыми числами {0, 1, ..., K}.
Распределение «Categorical» тесно связано с распределениями OneHotCategorical и Multinomial. Распределение «Categorical» можно представить как генерирующее выборки в соответствии с 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 | N-мерный Tensor, N >= 1, представляющий логарифмы вероятностей набора категориальных распределений. Первые N - 1 измерения индексируют пакет независимых распределений, а последнее измерение представляет вектор логарифмов шансов для каждого класса. Только один из logits или probs должен быть передан. |
probs | N-мерный Tensor, 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 – среднее)**2] тоже не определена. |
batch_shape | Форма одной выборки из одного индекса события в виде TensorShape. Может быть частично определена или неизвестна. Измерения пакета индексируют независимые, нетождественные параметризации этого распределения. |
dtype | DType из Tensors, обрабатываемых этим Distribution. |
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-мерного 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 | Префикс для имён операций, созданных этой функцией. |
| Возвращаемые значения | |
|---|---|
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-мерного целочисленного массива Tensor.
| Аргументы | |
|---|---|
name | Имя для данной операции |
| Возвращаемые значения | |
|---|---|
event_shape | Tensor. |
is_scalar_batch
is_scalar_batch
is_scalar_batch(
name='is_scalar_batch'
)
Указывает, что batch_shape == [].
| Аргументы | |
|---|---|
name | Префикс для имён операций, созданных этой функцией. |
| Возвращаемые значения | |
|---|---|
is_scalar_batch | bool скаляр Tensor. |
is_scalar_event
is_scalar_event
is_scalar_event(
name='is_scalar_event'
)
Указывает, что event_shape == [].
| Аргументы | |
|---|---|
name | Префикс для имён операций, созданных этой функцией. |
| Возвращаемые значения | |
|---|---|
is_scalar_event | bool скаляр Tensor. |
kl_divergence
kl_divergence
kl_divergence(
other, name='kl_divergence'
)
Вычисляет расстояние Кульбака-Лейблера.
Обозначим это распределение (self) как p и распределение other как q. Предполагая, что p, q абсолютно непрерывны относительно опорного распределения r, расстояние Кульбака-Лейблера определяется как:
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 | Префикс для имён операций, созданных этой функцией. |
| Возвращаемые значения | |
|---|---|
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 | Префикс для имён операций, созданных этой функцией. |
| Возвращаемые значения | |
|---|---|
logcdf | массив Tensor с формой sample_shape(x) + self.batch_shape и значениями типа self.dtype. |
log_prob
log_prob
log_prob(
value, name='log_prob'
)
Логарифм плотности/массы вероятности.
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Префикс для имён операций, созданных этой функцией. |
| Возвращаемые значения | |
|---|---|
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 | Префикс для имён операций, созданных этой функцией. |
Tensor с формой sample_shape(x) + self.batch_shape и значениями типа self.dtype. |
mean
mean
mean(
name='mean'
)
Математическое ожидание.
mode
mode
mode(
name='mode'
)
Мода.
param_shapes
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
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 | 0-мерный или 1-мерный 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(). |
© 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.4/api_docs/python/tf/compat/v1/distributions/Categorical