2016-07-07 2 views
5

Согласно Википедии, равномерное распределение является «максимальным распределением вероятности энтропии». Таким образом, если у меня есть две последовательности (одна равномерно распределенная и одна с повторяющимися значениями), обе длины k, то я ожидаю, что энтропия равномерно распределенной последовательности будет выше, чем последовательность повторяющихся значений. Однако, это не то, что наблюдается при выполнении следующего кода в R:Почему энтропия равномерного распределения ниже повторных значений в R?

require(entropy) 
entropy(runif(1024), method="ML", unit="log2") 
entropy(rep(1,1024), method="ML", unit="log2") 

Первый выход производит около 9,7 битых энтропии, в то время как вторые производит ровно 10 битых энтропии (логарифм по основанию 2 1024 = 10). Почему равномерное распределение не имеет более 10 бит энтропии?

+1

Я думал, что это может быть из-за реализации. Если используется метод «ММ», поведение будет таким, как ожидалось, за исключением того, что энтропия повторяющихся значений зависит от этих значений, это не должно. Метод «ML» правильно справляется с этим. Редактировать: Cross validated может быть лучшим местом в любом случае. Я не знал, пока это не предложит. –

+0

Если это реализация, попробуйте взглянуть на 'getAnywhere (« entropy.empirical »)', 'getAnywhere (" entropy.MillerMadow ")' и 'getAnywhere (" entropy.plugin ")'. – Laterow

+0

Спасибо. Я посмотрел исходный код, но я не уверен, почему он ведет себя так, как он. Таким образом, он берет данные, заполняет их с помощью функции freqs, а затем применяет к ней функцию журнала. –

ответ

3

Я думаю, вы не понимаете, что такое первый аргумент, 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 букв, как ожидается, будет происходить с равной частотой, и вы не можете получить более равномерное, чем это!

+0

Спасибо за помощь. То, что я хочу сделать, это измерить энтропию массива. Каждый элемент массива содержит число, соответствующее количеству раз, когда этот элемент обращался в память (это касается исследований безопасности).Чтобы правильно измерить энтропию, нужно ли сначала применить функцию freqs на этом массиве? –

+2

@AlphaBravo Извините, я не смогу вам помочь или дать вам полезный совет о том, как применять вычисления энтропии к вашему конкретному приложению. Так как 'freqs.empirical()' нормализует любые переданные ему данные (так что их частоты суммируются с '1'), не имеет значения, передаете ли вы его необработанные счета или уже нормализованные данные. –

Смежные вопросы