Я думаю, вы не понимаете, что такое первый аргумент, y
, в entropy()
представляет. Как упоминалось в ?entropy
, он дает вектор отсчетов. Эти подсчеты дают относительные частоты каждого из символов, из которых складываются сообщения на этом «дискретном источнике информации».
Чтобы узнать, как это происходит, взгляните на более простой пример: двоичный источник информации с двумя символами (1/0, вкл./Выкл., A/B, что у вас есть). В этом случае, все из следующих дадут энтропии для источника, в котором относительные частоты двух символов являются одинаковыми (т.е. половины символов A
лет и половина из них B
ы):
entropy(c(0.5, 0.5))
# [1] 0.6931472
entropy(c(1,1))
# [1] 0.6931472
entropy(c(1000,1000))
# [1] 0.6931472
entropy(c(0.0004, 0.0004))
# [1] 0.6931472
entropy(rep(1,2))
# [1] 0.6931472
Поскольку все они относятся к одному и тому же базовому распределению, в котором вероятность максимально распространена среди доступных символов, каждая из них дает максимально возможную энтропию для источника информации из двух состояний (log(2) = 0.6931472)
).
Если вы делаете вместо этого entropy(runif(2))
, вы предоставляете относительные вероятности для двух символов, которые случайным образом выбираются из равномерного распределения. Если эти два случайно выбранных числа в точности равны, вы сообщаете entropy()
, что у вас есть источник информации с двумя символами, которые используются с разными частотами. В результате вы всегда получите расчетную энтропию, которая ниже log(2)
. Вот простой пример, чтобы проиллюстрировать, что я имею в виду:
set.seed(4)
(x <- runif(2))
# [1] 0.585800305 0.008945796
freqs.empirical(x) ## Helper function called by `entropy()` via `entropy.empirical()`
# [1] 0.98495863 0.01504137
## Low entropy, as you should expect
entropy(x)
# [1] 0.07805556
## Essentially the same thing; you can interpret this as the expected entropy
## of a source from which a message with 984 '0's and 15 '1's has been observed
entropy(c(984, 15))
Таким образом, путем пропускания y=
аргумента длинной строки 1
с, как и в entropy(rep(1, 1024))
, вы описываете источник информации, который дискретный аналог равномерного распределения. В долгосрочной перспективе или в очень длинном сообщении каждая из его 1024 букв, как ожидается, будет происходить с равной частотой, и вы не можете получить более равномерное, чем это!
Я думал, что это может быть из-за реализации. Если используется метод «ММ», поведение будет таким, как ожидалось, за исключением того, что энтропия повторяющихся значений зависит от этих значений, это не должно. Метод «ML» правильно справляется с этим. Редактировать: Cross validated может быть лучшим местом в любом случае. Я не знал, пока это не предложит. –
Если это реализация, попробуйте взглянуть на 'getAnywhere (« entropy.empirical »)', 'getAnywhere (" entropy.MillerMadow ")' и 'getAnywhere (" entropy.plugin ")'. – Laterow
Спасибо. Я посмотрел исходный код, но я не уверен, почему он ведет себя так, как он. Таким образом, он берет данные, заполняет их с помощью функции freqs, а затем применяет к ней функцию журнала. –