2016-07-07 17 views
5

Według Wikipedii, rozkład jednostajny jest "maksymalnym rozkładem prawdopodobieństwa entropii". Tak więc, jeśli mam dwie sekwencje (jedną równomiernie rozłożoną i jedną z powtarzanymi wartościami), obie długości k, wówczas oczekiwałbym, że entropia równomiernie rozłożonej sekwencji będzie wyższa niż sekwencja powtarzanych wartości. Jednakże, nie jest to, co jest obserwowane, gdy działa następujący kod badania:Dlaczego entropia rozkładu jednolitego jest mniejsza od wartości powtarzanych w R?

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

Pierwsze wyjście wytwarza około 9,7 bitów entropii, a drugi tworzy się dokładnie z 10 bitów entropii (log podstawę 2 1024 = 10). Dlaczego rozkład jednorodny nie ma więcej niż 10 bitów entropii?

+1

Myślałem, że może to być spowodowane wdrożeniem. Jeśli używana jest metoda "MM", zachowanie jest zgodne z oczekiwaniami, z tym że entropia powtarzanych wartości zależy od tych wartości, nie powinna. Metoda "ML" poprawnie to obsługuje. Edycja: krzyż sprawdzone poprawność może i tak być lepszym miejscem. Nie wiedziałem, czy to dopóki nie zasugerowałeś tego. –

+0

Jeśli jest to implementacja, spróbuj spojrzeć na 'getAnywhere (" entropy.empirical ")', 'getAnywhere (" entropy.MillerMadow ")' i 'getAnywhere (" entropy.plugin ")'. – Laterow

+0

Dzięki. Sprawdziłem kod źródłowy, ale nie jestem pewien, dlaczego zachowuje się tak jak on. Podsumowując, pobiera dane, blokuje je za pomocą funkcji freqs, a następnie stosuje do niej funkcję logu. –

Odpowiedz

3

Myślę, że nie rozumiesz, co reprezentuje pierwszy argument, y, w entropy(). Jak wspomniano w ?entropy, daje on wektor zliczeń. Te zliczenia razem dają względne częstotliwości każdego z symboli, z których składają się wiadomości na tym "dyskretnym źródle informacji".

Aby zobaczyć, jak to się dzieje, spójrz na prostszy przykład binarnego źródła informacji z tylko dwoma symbolami (1/0, wł/wył, A/B, co ty). W tym przypadku wszystkie z następujących daje entropii źródeł, w których względne częstotliwości w dwa symbole są takie same (np pół symbole są A S połowa B s)

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 

Ze wszystkie odnoszą się do tego samego podstawowego rozkładu, w którym prawdopodobieństwo jest maksymalnie rozłożone wśród dostępnych symboli, każdy z nich daje najwyższą możliwą entropię dla źródła informacji o dwóch stanach (log(2) = 0.6931472)).

Gdy wykonasz zamiast tego entropy(runif(2)), podajesz względne prawdopodobieństwa dla dwóch symboli losowo wybranych z rozkładu jednolitego. Jeśli te dwie losowo wybrane liczby są dokładnie równe, mówisz entropy(), że masz źródło informacji z dwoma symbolami, które są używane z różnymi częstotliwościami. W rezultacie zawsze otrzymasz obliczoną entropię, która jest niższa niż log(2). Oto krótki przykład, aby zilustrować, co mam na myśli:

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)) 

Podsumowując, poprzez przepuszczanie y= argumentem długi ciąg 1 s, jak w entropy(rep(1, 1024)), opisujesz źródło informacji, które są dyskretny analog jednolitej dystrybucji. Na dłuższą metę lub w bardzo długim komunikacie oczekuje się, że każda z 1024 liter wystąpi z jednakową częstotliwością, a nie można uzyskać bardziej jednolitego niż to!

+0

Dzięki za pomoc. Chciałbym zmierzyć entropię tablicy. Każdy element w tablicy zawiera liczbę, która odpowiada liczbie razy, kiedy element ten był dostępny w pamięci (służy do badań bezpieczeństwa).Aby poprawnie zmierzyć entropię, czy najpierw musiałbym zastosować funkcję freqs w tej macierzy? –

+2

@AlphaBravo Przepraszamy, nie będę w stanie Ci pomóc ani udzielić użytecznych porad, jak zastosować obliczenia entropii do konkretnej aplikacji. Ponieważ 'freqs.empirical()' normalizuje wszelkie dane przekazane do niego (tak, że ich częstotliwości sumują się do '1'), nie ma jednak znaczenia, czy przekażesz surowe zliczenia, czy już znormalizowane dane. –