scipy.stats.

энтропия#

scipy.stats.энтропия(pk, qk=None, основание=None, ось=0, *, nan_policy='propagate', keepdims=False)[источник]#

Вычислить энтропию Шеннона/относительную энтропию заданного распределения(й).

Если только вероятности pk заданы, энтропия Шеннона вычисляется как H = -sum(pk * log(pk)).

Если qk не None, тогда вычислить относительную энтропию D = sum(pk * log(pk / qk)). Эта величина также известна как дивергенция Кульбака-Лейблера.

Эта процедура нормализует pk и qk если они не суммируются до 1.

Параметры:
pkarray_like

Определяет (дискретное) распределение. Вдоль каждого среза оси pk, элемент i это (возможно, ненормализованная) вероятность события i.

qkarray_like, необязательный

Последовательность, относительно которой вычисляется относительная энтропия. Должна быть в том же формате, что и pk.

основаниеfloat, опционально

Логарифмическое основание для использования, по умолчанию e (натуральный логарифм).

осьint или None, по умолчанию: 0

Если это целое число, ось входных данных, по которой вычисляется статистика. Статистика каждого среза по оси (например, строки) входных данных появится в соответствующем элементе вывода. Если None, вход будет сведён в одномерный массив перед вычислением статистики.

nan_policy{‘propagate’, ‘omit’, ‘raise’}

Определяет, как обрабатывать входные значения NaN.

  • propagate: если NaN присутствует в срезе оси (например, строке), вдоль которой вычисляется статистика, соответствующая запись вывода будет NaN.

  • omit: NaN будут пропущены при выполнении расчета. Если в срезе оси, вдоль которого вычисляется статистика, остается недостаточно данных, соответствующая запись вывода будет NaN.

  • raise: если присутствует NaN, то ValueError будет вызвано исключение.

keepdimsbool, по умолчанию: False

Если установлено значение True, оси, которые были сокращены, остаются в результате как размерности с размером один. С этой опцией результат будет корректно транслироваться относительно входного массива.

Возвращает:
S{float, array_like}

Рассчитанная энтропия.

Примечания

Неформально, энтропия Шеннона количественно оценивает ожидаемую неопределённость, присущую возможным исходам дискретной случайной величины. Например, если сообщения, состоящие из последовательностей символов из множества, должны быть закодированы и переданы по бесшумному каналу, то энтропия Шеннона H(pk) дает точную нижнюю границу для среднего количества единиц информации, необходимых на символ, если символы встречаются с частотами, определяемыми дискретным распределением pk [1]. Выбор основания определяет выбор единиц измерения; например, e для nats, 2 для битов и т.д.

Относительная энтропия, D(pk|qk), количественно оценивает увеличение среднего количества единиц информации, необходимых на символ, если кодирование оптимизировано для распределения вероятностей qk вместо истинного распределения pk. Неформально, относительная энтропия количественно оценивает ожидаемый избыток неожиданности, испытываемый, если кто-то верит, что истинное распределение — это qk когда на самом деле pk.

Связанная величина, перекрёстная энтропия CE(pk, qk), удовлетворяет уравнению CE(pk, qk) = H(pk) + D(pk|qk) и также может быть вычислена с помощью формулы CE = -sum(pk * log(qk)). Он даёт среднее количество единиц информации, необходимых на символ, если кодирование оптимизировано для распределения вероятностей qk когда истинное распределение pk. Не вычисляется напрямую с помощью entropy, но его можно вычислить с помощью двух вызовов функции (см. Примеры).

См. [2] для получения дополнительной информации.

Начиная с SciPy 1.9, np.matrix входные данные (не рекомендуется для нового кода) преобразуются в np.ndarray перед выполнением вычисления. В этом случае результатом будет скаляр или np.ndarray подходящей формы вместо 2D np.matrix. Аналогично, хотя маскированные элементы маскированных массивов игнорируются, результатом будет скаляр или np.ndarray вместо маскированного массива с mask=False.

Ссылки

[1]

Shannon, C.E. (1948), A Mathematical Theory of Communication. Bell System Technical Journal, 27: 379-423. https://doi.org/10.1002/j.1538-7305.1948.tb01338.x

[2]

Томас М. Ковер и Джой А. Томас. 2006. Элементы теории информации (Серия Wiley по телекоммуникациям и обработке сигналов). Wiley-Interscience, США.

Примеры

Исход честной монеты является наиболее неопределенным:

>>> import numpy as np
>>> from scipy.stats import entropy
>>> base = 2  # work in units of bits
>>> pk = np.array([1/2, 1/2])  # fair coin
>>> H = entropy(pk, base=base)
>>> H
1.0
>>> H == -np.sum(pk * np.log(pk)) / np.log(base)
True

Результат подброшенной смещённой монеты менее неопределён:

>>> qk = np.array([9/10, 1/10])  # biased coin
>>> entropy(qk, base=base)
0.46899559358928117

Относительная энтропия между честной и смещенной монетой рассчитывается как:

>>> D = entropy(pk, qk, base=base)
>>> D
0.7369655941662062
>>> np.isclose(D, np.sum(pk * np.log(pk/qk)) / np.log(base), rtol=4e-16, atol=0)
True

Перекрестная энтропия может быть рассчитана как сумма энтропии и относительной энтропии:

>>> CE = entropy(pk, base=base) + entropy(pk, qk, base=base)
>>> CE
1.736965594166206
>>> CE == -np.sum(pk * np.log(qk)) / np.log(base)
True