Penso che tu abbia frainteso ciò che rappresenta il primo argomento, , in entropy()
. Come menzionato in ?entropy
, fornisce un vettore di conteggi. Quei conteggi insieme danno le frequenze relative di ciascuno dei simboli da cui sono composti i messaggi su questa "fonte discreta di informazioni".
Per vedere come funziona, date un'occhiata ad un esempio più semplice, quello di una fonte di informazioni binarie con solo due simboli (1/0, on/off, A/B, cosa avete). In questo caso, tutti i seguenti darà l'entropia di una sorgente in cui le frequenze relative dei due simboli sono uguali (cioè metà dei simboli sono A
s e mezzo sono 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
Poiché quelli si riferiscono tutti alla stessa distribuzione sottostante, in cui la probabilità si estende al massimo tra i simboli disponibili, ciascuno di essi fornisce la massima entropia possibile per una fonte di informazioni a due stati (log(2) = 0.6931472)
).
Quando si esegue invece entropy(runif(2))
, vengono fornite probabilità relative per i due simboli selezionati casualmente dalla distribuzione uniforme. A meno che quei due numeri scelti a caso non siano esattamente uguali, stai dicendo a entropy()
di avere una fonte di informazioni con due simboli usati con frequenze diverse. Di conseguenza, otterrai sempre un'entropia calcolata inferiore a log(2)
. Ecco un rapido esempio per illustrare quello che voglio dire:
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))
In sintesi, passando l'argomento y=
una lunga serie di 1
s, come in entropy(rep(1, 1024))
, si sta descrivendo una fonte di informazioni che sono una discreta analogo della distribuzione uniforme. Nel lungo periodo o in un messaggio molto lungo, ciascuna delle 1024 lettere dovrebbe verificarsi con uguale frequenza, e non è possibile ottenere più uniformi!
Ho pensato che potrebbe essere a causa dell'implementazione. Se si utilizza il metodo "MM", il comportamento è come previsto, tranne per il fatto che l'entropia dei valori ripetuti dipende da tali valori, non dovrebbe. Il metodo "ML" gestisce correttamente questo. Modifica: Cross convalidato potrebbe essere un posto migliore in ogni caso. Non lo sapevo fino a quando non lo hai suggerito. –
Se si tratta dell'implementazione, provare a cercare 'getAnywhere (" entropy.empirical ")', 'getAnywhere (" entropy.MillerMadow ")' e 'getAnywhere (" entropy.plugin ")'. – Laterow
Grazie. Ho guardato il codice sorgente ma non sono sicuro del perché si comporta come fa. In breve, prende i dati, li abbina alla funzione freqs e quindi applica la funzione di registro ad esso. –