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 | 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 описывающий поведение при неопределении статистического показателя. Статистические данные возвращают +/- бесконечность, когда это имеет смысл. Например, дисперсия распределения Коши равна бесконечности. Однако иногда статистический показатель не определён, например, если pdf распределения не достигает максимума в области определения распределения, мода не определена. Если среднее не определено, то по определению дисперсия также не определена. Например, среднее для распределения Стьюдента для df = 1 не определено (нет ясного способа указать, что оно либо + или - бесконечность), поэтому дисперсия = E[(X - среднее)**2] также не определена. |
batch_shape | Форма одной выборки из одного индекса события как TensorShape. Может быть частично определена или неизвестна. Размеры пакета — индексы в независимые, нетождественные параметризации этого распределения. |
dtype | DType Tensor, обрабатываемых этим 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 обозначает математическое ожидание.
В качестве альтернативы, для не-векторных многомерных распределений (например, матричных, Wishart), 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, добавляемая как префикс к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
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], представляющее собой различные вычисления (кросс-)энтропии Шеннона. |
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, добавляемая как префикс к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
is_scalar_batch | Скалярное bool Tensor. |
is_scalar_event
is_scalar_event(
name='is_scalar_event'
)
Указывает, что event_shape == [].
| Аргументы | |
|---|---|
name | Строка Python, добавляемая как префикс к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
is_scalar_event | Скалярное bool Tensor. |
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 | Строка Python, добавляемая как префикс к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
kl_divergence | Вещественное число self.dtype Tensor с формой [B1, ..., Bn], представляющее собой различные вычисления расхождения Кульбака-Лейблера. |
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(
value, name='log_prob'
)
Логарифм плотности/массы вероятности.
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Строка Python, добавляемая как префикс к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
log_prob | Массив Tensor с формой sample_shape(x) + self.batch_shape и значениями типа self.dtype. |
log_survival_function
log_survival_function(
value, name='log_survival_function'
)
Логарифм функции выживания.
END_OF_DOCUMENT_MARKER ```При заданной случайной величине 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'
)
Функция плотности/массы вероятности.
| Аргументы | |
|---|---|
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/Categorical