2016-07-07 25 views
5

Secondo Wikipedia, la distribuzione uniforme è la "massima distribuzione di probabilità dell'entropia". Quindi, se ho due sequenze (una uniformemente distribuita e una con valori ripetuti), entrambe di lunghezza k, allora mi aspetterei che l'entropia della sequenza uniformemente distribuita sia superiore alla sequenza di valori ripetuti. Tuttavia, questo non è ciò che si osserva quando si esegue il seguente codice R:Perché l'entropia di una distribuzione uniforme è inferiore ai valori ripetuti in R?

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

La prima uscita produce circa 9,7 bit di entropia, mentre il secondo produce esattamente 10 bit di entropia (log base 2 di 1024 = 10). Perché la distribuzione uniforme non ha più di 10 bit di entropia?

+1

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. –

+0

Se si tratta dell'implementazione, provare a cercare 'getAnywhere (" entropy.empirical ")', 'getAnywhere (" entropy.MillerMadow ")' e 'getAnywhere (" entropy.plugin ")'. – Laterow

+0

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. –

risposta

3

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!

+0

Grazie per l'aiuto. Quello che voglio fare è misurare l'entropia di un array. Ogni elemento dell'array contiene un numero che corrisponde al numero di volte in cui l'elemento è stato utilizzato in memoria (è per la ricerca di sicurezza).Per misurare correttamente l'entropia, dovrei prima applicare la funzione freqs su quell'array? –

+2

@AlphaBravo Spiacenti, non sarò in grado di aiutarti o fornirti utili consigli su come applicare i calcoli di entropia alla tua particolare applicazione. Dato che 'freqs.empirical()' normalizza qualsiasi dato passato ad esso (in modo che le loro frequenze sommino a '1'), tuttavia, non fa differenza se si gestiscono conteggi grezzi o dati già normalizzati. –

Problemi correlati