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!
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. –
Jeśli jest to implementacja, spróbuj spojrzeć na 'getAnywhere (" entropy.empirical ")', 'getAnywhere (" entropy.MillerMadow ")' i 'getAnywhere (" entropy.plugin ")'. – Laterow
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. –