...

Entropia di sequenze simboliche

by user

on
Category: Documents
19

views

Report

Comments

Transcript

Entropia di sequenze simboliche
Entropia di sequenze simboliche
Chiara Basile, Chiara Farinelli
Dipartimento di Matematica, Università di Bologna
8 Luglio 2008
“La mia più grande preoccupazione era come chiamarla. Pensavo di chiamarla
informazione, ma la parola era fin troppo usata, così decisi di chiamarla incertezza.
Quando discussi della cosa con John Von Neumann, lui ebbe un’idea migliore. Mi
disse che avrei dovuto chiamarla entropia, per due motivi: ‘Innanzitutto, la tua
funzione d’incertezza è già nota nella meccanica statistica con quel nome. In secondo
luogo, e più significativamente, nessuno sa cosa sia con certezza l’ entropia, così in una
discussione sarai sempre in vantaggio.’ ”
- C.E. Shannon -
L’idea generale [2]: misurare la quantità di informazione di un “messaggio” emesso da
una “sorgente”. Gli aspetti semantici (il significato del messaggio) non sono presi in considerazione, la quantità di informazione si pensa invece come una misura del fatto che si sta
scegliendo un messaggio tra i tanti possibili.
Da qui subito una prima idea: usare come misura del contenuto informativo il “numero di
messaggi ” tra cui si è scelto, o una qualsiasi funzione monotona di tale numero. Per ragioni
“pratiche” (di semplicità di calcolo e anche ingegneristiche - Shannon si poneva il problema
reale della comunicazione!) si può pensare di utilizzare il logaritmo del numero di messaggi.
Fin qui solo chiacchiere...
1
Sorgenti d’informazione ed ergodicità
Definizione 1.1. Dato uno spazio di probabilità (Ω, S, P ) e un alfabeto finito A, un processo stocastico è una successione infinita {Xn } = {X1 , X2 , . . . , Xn , . . .} di variabili aleatorie
definite da Ω in A. Il processo si dice stazionario se P (X1 = a1 , . . . , Xn = an ) = P (X1+k =
a1 , . . . , Xn+k = an ) ∀ a1 , . . . , an ∈ A, ∀ k, n ∈ N.
Per comodità denoteremo spesso con an1 la sequenza a1 , . . . , an e analogamente con X1n
la sequenza costituita dalle prime n componenti del processo. Nel caso di processi stazionari
indicheremo inoltre con P (an1 ) la probabilità P (X1 = a1 , . . . , Xn = an ), che sappiamo essere
invariante per traslazione della sequenza. Tali probabilità congiunte, al variare di n, sono
dette per brevità distribuzione del processo e determinano univocamente il processo stesso:
in altre parole, la particolare scelta di (Ω, S) non è importante, purché la distribuzione sia
la stessa.
1
Una sorgente di informazione (discreta) può essere rappresentata matematicamente come un processo stocastico: un’“entità” che genera un simbolo ad ogni istante di tempo n
(discretizzato), costruendo in modo sequenziale una stringa di caratteri presi da un alfabeto
fissato e finito A. La probabilità con cui essa genera un simbolo può dipendere, in generale,
dai simboli precedenti, dal simbolo in questione e dall’istante in cui lo genera. Diremo che la
sorgente è stazionaria quando lo è il processo che la rappresenta: in questo caso la distribuzione di probabilità con cui la sorgente genera i simboli si mantiene costante al passare del
tempo.
Intuitivamente, una sorgente si dice ergodica se quasi ogni sequenza da essa prodotta ha
le stesse proprietà statistiche. Più formalmente:
Definizione 1.2. Sia A∗ = ∪n∈N An l’insieme delle sequenze finite di simboli di A e per
an1 , bk1 ∈ A∗ , con n ≥ k, sia fan1 (bk1 ) la frequenza (relativa) di bk1 in an1 . Definiamo l’insieme
delle sequenze tipiche della sorgente (stazionaria):
T ({Xn }) = {a ∈ AN | ∀ k ∈ N, ∀ bk1 ∈ Ak , fan1 (bk1 ) −−−→ P (X1k = bk1 )}.
n→∞
Una sorgente (i.e. la sua distribuzione P ) si dice ergodica se e solo se P (T ({Xn })) = 1, cioè
se e solo se quasi ogni sequenza generata dalla sorgente è tipica.
Nota: questa è solo una delle (tante!) possibili definizioni equivalenti di ergodicità... [3]
A cosa serve l’ergodicità? Permette di identificare medie su sequenze tipiche infinite
(medie “temporali”, se si pensa a {Xn } come all’orbita di un sistema dinamico...) con medie
sull’insieme di tutte le sequenze (medie “spaziali”)... questo è molto importante dal punto
di vista sia teorico (vedi seguito) sia pratico: permette di considerare sequenze “abbastanza
lunghe” come buoni indicatori della distribuzione della sorgente che le ha generate...
2
L’entropia di una variabile aleatoria
Volevamo misurare la quantità di informazione veicolata da un messaggio di una data sorgente; ancora meglio, vorremmo misurare il tasso (rate) con cui tale informazione è prodotta
dalla sorgente. Limitiamoci per ora ad una singola variabile aleatoria X che prende valori
nell’alfabeto A = {a1 , . . . , am }, e sia pi = P (X = ai ), i = 1, . . . , m; ci poniamo il problema
di misurare “quanto è incerto” il valore di X. È naturale richiedere tre proprietà ad una
funzione H che misuri tale incertezza:
1. H(X) = H(p1, . . . , pm ) continua nelle pi ;
2. se denotiamo A(m) = H( m1 , . . . , m1 ) (X può assumere gli m valori con uguale probabilità), A(m) deve essere una funzione crescente di m: l’aggiunta di un evento
equiprobabile può solo aumentare l’incertezza;
P
P
p
p
3. H(p1 , . . . , pm ) = H( kj=1 pij , p1 , . . . , p̂i1 , . . . , p̂ik , . . . , pm )+ kj=1 pij H( Pk i1 p , . . . , Pk ik p ),
j=1
ij
j=1
∀ k = 1, . . . , n, ∀ i1 < . . . < ik ∈ {1, . . . , m}
Diamo qualche spiegazione della terza proprietà richiesta. Innanzitutto si è fatto un abuso di
notazione utilizzando lo stesso simbolo H per indicare diverse funzioni, con un numero diverso
di argomenti: tale notazione sarà comunque mantenuta anche nel seguito, per semplicità. La
proprietà 3 può essere espressa nel seguente modo: ogni volta che è possibile spezzare una
scelta in due scelte successive la H della scelta originaria deve essere la somma della H delle
due scelte, ognuna pesata con la probabilità che tale scelta sia effettuata.
2
ij
Esempio 2.1. Sia A = {a,b,c}, un alfabeto ternario, e P (a) = 1/2, P (b) = P (c) =
1/4. Si può suddividere la scelta in due scelte successive: prima si sceglie tra i due eventi
equiprobabili {a} e {b,c} e poi, se si è scelto {b,c}, si sceglie ancora una volta in modo
equiprobabile tra b e c. Allora, secondo la 3, dovrà essere H( 21 , 14 , 41 ) = H( 12 , 21 ) + 12 H( 21 , 12 )
(colori come in figura 1).
Figura 1: Decomposizione di una scelta ternaria in due scelte binarie.
Teorema 2.1 (Shannon,[2]). La sola funzione che soddisfa le tre proprietà elencate sopra è
H(p1, . . . , pm ) = −K
m
X
pi log pi ,
i=1
con K costante positiva che deriva semplicemente dalla scelta della base del logaritmo (i.e.
di una unità di misura per H). H è detta entropia della variabile aleatoria X o della
distribuzione di probabilità (p1 , . . . , pm ).
Dimostrazione. È sempre possibile decomporre una scelta tra sm possibilità equiprobabili in
m scelte tra s possibilità equiprobabili, ottenendo per la proprietà 3:
A(sm ) = mA(s)
e, analogamente,
A(tn ) = nA(t).
Per qualsiasi valore di s, t ed n esiste un m tale che
sm ≤ tn ≤ sm+1 .
Da qui, prendendo il logaritmo in base s e dividendo per n log s = n:
m
m 1
≤ log t ≤
+ .
n
n
n
Fissato ε > 0, si può quindi prendere n abbastanza grande perché | m
− log t| < ε. Per la
n
monotonia di A(n) (proprietà 2):
A(sm ) ≤ A(tn ) ≤ A(sm+1 )
e cioè
mA(s) ≤ nA(t) ≤ (m + 1)A(s)
3
da cui, ponendo K := A(s) e dividendo per nA(s) = nK:
m
A(t)
m 1
≤
≤
+ ,
n
K
n
n
− A(t)
| < ε per n ≫ 1. Quindi | log t − A(t)
| < 2ε per n ≫ 1, ma dal momento che
ovvero | m
n
K
K
il termine da maggiorare è indipendente da n ciò significa che
A(t) = K log t,
(1)
con K positiva per soddisfare la 2.
Osserviamo che scegliere un’altra base per il logaritmo corrisponde esattamente a modificare la K, moltiplicandola per una costante che dipende solo dalle due basi in considerazione.
Supponiamo ora di poter scegliere tra m possibilità con probabilità razionali pi = Pmni ni ,
i=1
P
ni ∈ N ∀ i = 1, . . . , m. Osserviamo che possiamo decomporre una scelta tra m
i=1 ni possibilità equiprobabili in una scelta tra m possibilità con probabilità p1 , . . . , pm e poi, se si è
scelta i, un’ulteriore scelta tra ni eventi equiprobabili. Usando
Pmancora la condizione 3 e la (1)
eguagliamo le due espressioni per l’entropia della scelta tra i=1 ni possibilità equiprobabili:
X X X
X
A
ni = K log
ni = H(p1, . . . , pm )+
pi A(ni ) = H(p1, . . . , pm )+K
pi log ni .
Dunque:
H
n
n
P 1 , . . . , Pm
ni
ni
X
X
X
pi log
ni −
pi log ni
X
ni
= −K
pi log P
ni
X
= −K
pi log pi .
= K
(2)
Se le pi non sono razionali possono essere approssimate da razionali e H deve mantenere
la stessa espressione per continuità (proprietà 1): perciò la (2) vale in generale.
La scelta più naturale per l’unità di misura dell’informazione (e quindi dell’incertezza) è il
bit, che rappresenta la scelta tra due possibilità equiprobabili: 0/1, on/off... di conseguenza, i
logaritmi nella (2) saranno in generale in base 2. Comunque, come già osservato, un cambio di
base del logaritmo corrisponde semplicemente alla moltiplicazione per una costante positiva
K.
Il nome “entropia” non è un’invenzione di Shannon: già in meccanica statistica si usava per
definire (l’opposto de) la quantità di informazione derivante dalla scelta fra tutti i microstati
corrispondenti ad un dato macrostato... si veda anche la citazione inziale.
Definizione 2.1. Date due variabili aleatorie X, Y la loro entropia congiunta (joint entropy)
è l’entropia della loro distribuzione congiunta, ovvero:
X
H(X, Y ) := −
P (X = α, Y = β) log P (X = α, Y = β).
α,β∈A
4
3
L’entropia di una sorgente di informazione
Ricordiamo: sorgente d’informazione = processo stocastico. Per noi d’ora in avanti la
sorgente sarà sempre stazionaria (ipotesi pesantina nel mondo reale...).
Definizione 3.1. Fissato n ≥ 1, la block entropy (entropia a blocchi ) di ordine n della
sorgente {Xn } è l’entropia congiunta delle prime n variabili aleatorie del processo, ovvero:
X
P (X1n = an1 ) log P (X1n = an1 ).
(3)
H(X1n ) = H(X1 , . . . , Xn ) = −
n
an
1 ∈A
Nel caso stazionario si può sostituire (X1 , . . . , Xn ) con qualsiasi sequenza di n componenti
consecutive del processo; in tal caso useremo, come sopra, la notazione P (an1 ) = P (Xii+n−1 =
an1 ).
Definizione 3.2. L’entropia della sorgente {Xn } è definita come:
H({Xn }) := lim sup
n→∞
H(X1n )
.
n
Si può provare [3, p. 59] che nel caso stazionario il lim sup è in realtà un lim.
Per sorgenti ergodiche vale il seguente importantissimo
Teorema 3.1. Sia {Xn } sorgente ergodica e A finito. Allora per quasi ogni sequenza a ∈ AN
vale:
1
(4)
lim − log P (an1 ) = H({Xn }).
n→∞
n
Il teorema 3.1 è detto Asymptotic Equipartition Property in teoria dell’informazione e
Teorema di Shannon-McMillan-Breiman (dai nomi di coloro che lo dimostrarono per casi
sempre più generali) in teoria ergodica. Una dimostrazione del risultato generale, tratta da
[1], si trova in [3, pp. 51-55]. Qui ne diamo solo la dimostrazione per sorgenti markoviane,
una caso più ristretto ma non troppo lontano da quel che ci si può aspettare nel caso reale.
Definizione 3.3. Un processo {Xn } si dice markoviano se ∀ n ≥ 1, ∀ an+1
∈ An+1 vale:
1
P (Xn+1 = an+1 |X1n = an1 ) = P (Xn+1 = an+1 |Xn = an ).
Equivalentemente, {Xn } si dice markoviano se ∀ n ≥ 1, ∀ an+1
∈ An+1 vale:
1
P (X1n+1
=
an+1
)
1
= P (X1 = a1 )
n
Y
P (Xi+1 = ai+1 |Xi = ai ),
i=1
con P (Xi+1 = ai+1 |Xi = ai ) indipendente dall’indice i della componente di {Xn }.
Si può pensare un processo markoviano come una sorgente con “memoria finita”: ogni
nuovo simbolo generato dipende solo dal simbolo che è stato generato precedentemente, e non
da tutto quello che è stato generato prima. Si può generalizzare questo concetto a memoria
di lunghezza k (processi markoviani di ordine k), ma poiché è sempre possibile ricondursi al
caso di memoria 1 considereremo solo questo nel seguito.
5
Definizione 3.4. Siano X, Y due variabili aleatorie su (Ω, S, P ). L’entropia di Y condizionata ad X è definita come:
X
P (X = α, Y = β) log P (Y = β|X = α).
H(Y |X) := −
α,β∈A
Proposizione 3.2. L’entropia condizionata ha le seguenti proprietà (dimostrazione ad esempio in [3, pp. 59-61]):
A) H(Y |X) ≥ 0 e H(Y |X) = 0 ⇔ Y = X (se X = Y e conosco X, non c’è nessuna
incertezza residua su Y )
B) H(Y |X) ≤ H(Y ) (la conoscenza di X non può aumentare l’incertezza di Y )
e H(Y |X) = H(Y ) ⇔ X, Y sono statisticamente indipendenti (in questo caso conoscere
X non mi dà nessuna informazione su Y ).
C) H(X, Y ) = H(Y |X) + H(X) (legge di addizione)
La dimostrazione del teorema 3.1 nel caso markoviano richiede una proposizione preliminare.
Proposizione 3.3. Se {Xn } è una sorgente markoviana stazionaria ed ergodica si ha:
X
Pα P (β|α) log P (β|α),
H({Xn }) = −
α,β∈A
dove {Pα }α∈A = {P (Xn = α)}α∈A è la distribuzione stazionaria del processo (la cui esistenza
e unicità è assicurata dall’ergodicità del processo) e P (β|α) indica la probabilità di transizione
P (Xn+1 = β|Xn = α), indipendente da n per la stazionarietà.
Dimostrazione. Dimostriamo innanzitutto che per sorgenti markoviane
H({Xn }) = lim H(Xn+1|X1n ).
n→∞
Infatti per la (C) di 3.2 con X = X1n , Y = Xn+1 , è H(Xn+1 |X1n ) = H(X1n+1 ) − H(X1n ) e,
poiché la successione H(Xn+1|X1n ) è (debolmente) decrescente in n per (B) e non negativa
per (A), essa ha un limite, che chiamiamo ℓ. Poniamo poi en := H(X1n ), l’entropia a blocchi
di ordine n; poiché en+1 − en = H(Xn+1|X1n ) −−−→ ℓ, si ha per il Teorema di Cesàro che
en
−−−→
n n→∞
n→∞
ℓ. Ma per definizione di entropia di una sorgente
l’unicità del limite,
limn→∞ H(Xn+1 |X1n )
en
−−−→
n n→∞
H({Xn }) e dunque, per
= H({Xn }).
Ora:
H(Xn+1|X1n ) = −
X
P (an+1
) log P (an+1 |an1 )
1
an+1
∈An+1
1
= −
X
an ,an+1
= −
X


log P (an+1|an ) 
X
an−1
1
P (a1 , . . . , an−1 , an , an+1 )
log P (an+1 |an )P (an , an+1 )
an ,an+1
= H(Xn+1 |Xn ) = (ancora per stazionarietà) H(X2 |X1 ).
6

E quindi:
H({Xn }) = lim H(Xn+1 |X1n ) =
lim H(X2 |X1 ) = H(X2|X1 )
X
= −
P (X1 = α, X2 = β) log P (X2 = β|X1 = α)
n→∞
n→∞
α,β∈A
= −
X
Pα P (β|α) log P (β|α).
α,β
Dimostrazione del Teorema di Shannon-McMillan-Breiman per sorgenti markoviane. La proposizione 3.3 ci dà una forma esplicita per l’entropia di un processo markoviano. Vediamo ora
log P (an )
la convergenza di − n 1 all’entropia nel caso ergodico. Poiché la sorgente è markoviana
si può scrivere:
P (an1 ) = Pa1 P (a2 |a1 )P (a3 |a2 ) . . . P (an |an−1 )
e dunque
log P (an1 )
= log Pa1 +
n−1
X
log P (ai+1 |ai ).
(5)
i=1
Per l’ergodicità (legge dei grandi numeri) per ogni sottosequenza di due caratteri αβ, con
α, β ∈ A, e per quasi ogni a ∈ AN , fan1 (αβ) −−−→ P (αβ). Poiché P (αβ) = Pα P (β|α), il
n→∞
numero di occorrenze della coppia αβ nella sequenza an1 , per n abbastanza grande, è dunque
nfan1 (αβ) = n [Pα P (β|α) + o(n)] ,
con o(n) → 0 per n → ∞. Dunque la (5) diventa:
X
log P (an1 ) = log Pa1 +
n [Pα P (β|α) + o(n)] log P (β|α),
α,β∈A
da cui, dividendo per n e cambiando segno:
X
X
1
1
− log P (an1 ) = − log Pa1 −
Pα P (β|α) log P (β|α) −
o(n) log P (β|α).
n
n
α,β
α,β
(6)
Ma il primo e il terzo termine della (6) si annullano per n → ∞, mentre il secondo è l’entropia
H({Xn }) della sorgente.
4
Entropia e Codici
Vediamo ora come questa entropia introdotta sia legata ai compressori. Quando parliamo
di compressori dovete pensare ai comuni compressori che utilizzate quotidianamente per
comprimere file sui vostri computer (bzip, gzip, etc...).
Comprimere una sequenza an1 (i cui caratteri appartengono ad un certo alfabeto A)
significa mappare tale sequenza in un’altra sequenza bl1 dalla quale sia poi possibile ricostruire
an1 . Per poter avere una compressione, bisogna fare in modo che le parole di codice siano
piu’ corte possibili (in senso medio).
Ovviamente, piu’ riesco a ridurre questa lunghezza piu’ sono contento...allora, quanto e’
possibile comprimere?! Esistono dei particolari tipi di codici, chiamati codici a prefisso, per i
quali esiste una connessione fra la lunghezza della parole di codice e l’entropia della sorgente.
7
4.1
Codici binari
Definizione 4.1. Un codice su un alfabeto A è una funzione
C : A → B∗
dove con B∗ indichiamo l’insieme di tutte le sequenze costrutite sull’alfabeto B (generalmente
parleremo di codici binari, in cui cioè B = {0, 1}).
Fra tutti i codici possibili un sottoinsieme significativo è rappresentato dai codici non
singolari in cui si richiede semplicemente che la funzione C sia iniettiva per garantire che
una sequenza s ∈ A∗ possa essere codificata, applicando C ad ogni carattere di s, in maniera
reversibile.
Se richiediamo che ogni parola di codice appartenente a B∗ corrisponda ad un unico
carattere dell’alfabeto A (codice non singolare) e che un eventuale destinatario sia in grado di poter univocamente ricostruire la sequenza di partenza, allora il codice è chiamato
univocamente decifrabile (o decodificabile) (UD).
Notiamo che non tutti i codici sono UD:
Esempio 4.1. Sia A = {a, b, c} e C tale che:
C
C
C
a 7→ 0 ; b 7→ 1 ; c 7→ 01
In questo caso, se ci trovassimo di fronte la sequenza 01 non sapremmo in maniera univoca
ricostruire la sequenza di caratteri originaria, infatti 01 potrebbe corrispondere a c ma anche
ad ab.
Fra tutti i codici UD ne esiste una sottoclasse, chiamati codici a prefisso, che hanno la particolarità di essere codici UD, e quindi univocamente decifrabili, ma in piu’ non permettono
ritardi di codifica...
Definizione 4.2. Un codice C si dice a prefisso se nessuna parola di codice (cioè una parola
w ∈ C(A)) è prefisso di un’altra parola di codice; in altre parole, per nessuna parola di codice
w1n ∈ C(A) esiste un’altra parola di codice v1k ∈ C(A), k < n tale che w1k = v1k .
Facciamo un esempio:
Esempio 4.2. Consideriamo due differenti codici che codificano tre lettere di un alfabeto
A = {a, b, c}: un codice C1 (A) = {1, 10, 100} che è un codice UD (non ci sono ambiguità
per un eventuale decodifica) ma non è un codice a prefisso perché la parola di codice 1 è
prefisso di un’altra parola di codice 10 (come pure 10 è prefisso di 100). Il secondo codice
che consideriamo, invece, è un codice a prefisso: C2 (A) = {0, 10, 11} (è UD e in piu’ nessuna
parola di codice è prefisso di un’altra).
Supponiamo di avere una sequenza codificata come 1010100.
Per ottenere la sequenza di partenza con caratteri in A (ovvero, per poter decodificare
la sequenza) devo poter individuare lungo la sequenza di B∗ le parole di codice alle quali poi
associare le lettere della sequenza di partenza.
L’individuazione di queste parole di codice nel caso sia stato utilizzato il codice C1 non è
immediata: fin dal primo carattere, quando leggo 1, posso dire con certezza che la parola di
codice è effettivamente 1 solo se il carattere successivo non è zero; e questo lo posso sapere
solo continuando a leggere la sequenza! In questo caso, dopo l’ 1 abbiamo uno 0 ... anche
questa volta dobbiamo ancora procedere nella lettura della sequenza per verificare il carattere
8
successivo a 10: abbiamo un 1 (e non 0). Quindi, tornando indietro di un passo lungo la
sequenza (per questo si parla di ritardi nella codifica..), possiamo dire con certezza che la
prima parola di codice lungo la sequenza è 10, che corrisponde alla lettera b. Procedendo,
si ottengono le seguenti parole di codice:
10 | 10 | 100
che corrispondono alla sequenza bbc.
Se invece la stessa sequenza fosse stata codificata dal codice C2 , l’individuazione delle parole di codice lungo la sequenza non avrebbe richiesto un proseguimento nella lettura, ovvero
sarebbe stata istantanea (infatti i codici a prefisso sono anche chiamati codici istantanei):
10 | 10 | 10 | 0
alla quale corrisponde, nell’alfabeto A, la sequenza bbba.
E’ chiaro che se si vuole comprimere dati senza perdere informazione su essi (che significa
che dobbiamo poi essere in grado, una volta ottenuta la sequenza compressa, di tornare
indietro alla sequenza originale), un buon codice deve essere almeno un codice UD; se poi è
anche un codice a prefisso tanto meglio, perché ci permetterà di essere piu’ veloce in fase di
decodifica.
Ancora, sempre in vista di una buona compressione, è chiaro che saremo interessati a
codici dai quali riottenere la sequenza originaria senza ambiguita’ e in maniera “veloce”, ma
ci interessa anche che le lunghezze delle parole di codice non siano troppo grandi... quanto
brevi possono essere le parole di un codice UD? La diseguaglianza di Kraft risponde a questa
domanda:
Teorema 4.1. Se C : A → {0, 1}∗ è un codice Univocamente Decodificabile, con parole
di codice lunghe li = |C(ai )|, i = 1, . . . |A| = m, allora vale la seguente diseguaglianza
(Diseguaglianza di Kraft):
m
X
2−li ≤ 1
(7)
i=1
Notiamo che il teorema, scritto per codici UD, vale anche per il caso particolare di codici
a prefisso: questo ci dice che non vi è nulla da guadagnare, in termini di possibili scelte per
le lunghezze delle parole di codice, passando dall’insieme dei codici istantanei a quello piu’
ampio dei codici univocamente decodificabili. Conviene dunque, per il discorso fatto sopra
della velocità di decodifica, restringersi ai codici a prefisso. Vale anche il teorema “inverso”:
Teorema 4.2. Se gli interi l1 , . . . , lm verificano la diseguaglianza di Kraft (7), allora esiste
un codice a prefisso con parole di codice di lunghezza l1 , . . . , lm .
(Per la dimostrazione dei teoremi rimandiamo a [4] o [3]).
Quello che interessa a noi ora, come dicevamo all’inizio, è rendere minima la lunghezza
media di queste parole di codice, sotto il vincolo che questi codici siano istantanei (e quindi
che valga la diseguaglianza di Kraft (7)).
La soluzione di questo problema di minimizzazione è legata all’entropia.
Piu’ precisamente:
Denotiamo con LC (a) la funzione che associa a ciascun a ∈ A la lunghezza della parola
di codice C(a):
9
LC : A → N
a 7→ |C(a)|
La lunghezza media delle parole del codice C, relativa alla distribuzione di probabilità pi
di una variabile aleatoria X (pi = P (X = ai )), è per definizione:
X
EX (LC ) =
pi LC (ai ).
(8)
i
Ricordiamo la definizione di entropia di una variabile aleatoria X data precedentemente:
X
pi log pi .
(9)
H(X) = −
i
Confrontandola con la lunghezza media di un codice, l’entropia puo’ essere vista come la
lunghezza media di un codice che utilizza − log pi bits per codificare ai .
Sarà una buona scelta questo codice che utilizza − log pi ?!, ovvero, è una scelta che mi
minimizza (in media) la lunghezza delle parole di codice?
Attraverso i due teoremi seguenti, faremo vedere che non solo è una buona scelta, ma
meglio di così non possiamo fare! Infatti, per codici a prefisso si dimostra che l’entropia è
un limite inferiore alla lunghezza media delle parole di codice:
Teorema 4.3. i) Per ogni codice C Univocamente Decodificabile
EX (LC ) ≥ H(X)
(con uguaglianza se e solo se LC (ai ) = − log pi )
ii) Esiste un codice prefisso tale che
EX (LC ) ≤ H(X) + 1
Per dimostare questo teorema abbiamo bisogno di introdurre un piccolo lemma:
Lemma 4.4. Se p = (p1 , . . . , pm ) e q = (q1 , . . . , qm ) sono due distribuzioni di probabilità,
allora
X
X
pi log pi ≥
pi log qi
(10)
i
i
con uguaglianza se e solo se p = q
Dimostrazione. Basta osservare che il logaritmo è una funzione concava e quindi vale log x ≤
x − 1 (con uguaglianza se e solo se x = 1). Così:
X
X qi
X
X
qi
pi log ≤
pi ( − 1) ≤
qi −
pi = 0
(11)
pi
pi
i
i
i
i
con uguaglianza se e solo se qi = pi . Quindi:
prova il teorema.
P
i
10
pi log pqii =
P
i
pi log qi −
P
i
pi log pi ≤ 0 che
In verità, per dimostrare il lemma è sufficiente che q sia tale che
La quantità
X
X
pi
qi
pi log = −
pi log
qi
pi
i
i
P
i qi
≤ 1.
(12)
è chiamata divergenza di Kullback-Leibler o entropia relativa, o più semplicemente divergenza, fra due distribuzioni di probabilità p e q, ed è una quantità sempre positiva.
Torniamo ora alla dimostrazione del teorema:
Dimostrazione. i) Sia C un codice UD.
X
X
E(LC ) =
pi LC (ai ) =
pi log 2LC (ai )
i
=
X
pi log
pi
i
−
X
pi log pi
−LC (ai )
2
i
i
X
pi
=
pi log −L (a ) + H(X).
2 C i
i
−LC (ai )
Il primo
,
P termine è la divergenza fra la distribuzione di probabilità pi e qi = 2
dove i qi ≤ 1 per P
la diseguaglianza di Kraft. La divergenza è una quantità sempre
pi
positiva e quindi :
i pi log 2−LC (ai ) + H(X) ≥ H(X), con uguaglianza se e solo se
pi = 2−LC (ai ) .
ii) Dalla dimostrazione precedente, se − log pi = L(ai ) allora E(L) = H(X). Ma in generale
− log pi potrebbe non essere un numero intero... Impongo L(ai ) = ⌈− log pi ⌉, cioè il
più piccolo intero maggiore o uguale a − log pi . Gli L(a1 ), . . . , L(am ) sono interi che
soddisfano la disuguaglianza di Kraft; infatti:
X
X
X
2−L(ai ) ≤
2log pi =
pi = 1.
i
i
i
Per il teorema 4.2 esiste allora un codice a prefisso C t.c. LC (ai ) = L(ai )
Ora, poiché LC (ai ) ≤ 1 − log pi ne verrà:
X
EX (LC ) =
pi LC (ai )
i
≤
X
(1 − log pi )pi = 1 −
X
pi log pi
i
i
= 1 + H(X)
Concludendo: abbiamo dimostrato che in effetti − log pi è la scelta ottimale per la lunghezza media delle parole di codice, ovvero che l’entropia è la lunghezza media ottimale.
Le stime ora ottenute (H(Xn ) ≤ E(LC ) ≤ H(Xn ) + 1)), però, non ci assicurano un raggiungimento del valore dell’entropia, anzi, potremmo essere abbastanza al di sopra di tale
valore.
Facciamo un esempio che ci evidenzi questo fatto:
11
Esempio 4.3 (Codice di Huffman). Supponiamo di avere un alfabeto A = {a, b, c, d} e di
conoscere le probabilità di apparizione delle lettere dell’alfabeto A in una sequenza simbolica
X: per esempio P(a)=0.4, P(b)=0.3, P(c)=0.25 e P(d)=0.05.
Dopo aver ordinato i caratteri in modo decrescente in base ai valori delle loro probabilità,
si divide l’insieme iniziale {a, b, c, d} in 2 sottoinsiemi, uno composto dalla lettera piu’ probabile {a} e l’altro dai restanti caratteri {b, c, d}. Assegnamo la parola di codice 0 alla scelta
di a, 1 alla scelta di {b, c, d}. Ora si ripete la procedura sull’insieme {b, c, d} e si associa la
parola di codice 0 se si sceglie la lettera piu’ frequente (all’interno di questo insieme) b, 1 se
si sceglie l’insieme delle lettere restanti {c, d}.
La lettera b avra’ parola di codice associata uguale a 10. In maniera iterativa, si ottengono
le parole di codice per tutte le lettere dell’alfabeto.
In sintesi, il codice ottenuto è: (nota che è un codice a prefisso)
a
b
c
d
0
10
110
111
In figura 2 e’ rappresentato l’albero che si ottiene con questa procedura.
Come si può notare anche visivamente dall’albero, il codice opera in modo da assegnare parole di codice piu’ corte alle lettere piu’ frequenti (e piu’ lunghe per caratteri meno
frequenti).
Osserviamo che nell’esempio la lunghezza media del codice è uguale a:
E(L) = P (a)L(a) + P (b)L(b) + P (c)L(c) + P (d)L(d) = 1.9
ed, ovviamente,
E(L) > H(X) = −[P (a) log P (a) + P (b) log P (b) + P (c) log P (c) + P (d) log P (d)] = 1.766
Figura 2: esempio codice Huffman
Passiamo ora da una singola variabile aleatoria ai processi.
4.2
n-Codici
Consideriamo ora la funzione (n-Codice) definita:
Cn : An → B∗
12
che mappa sequenze di lunghezza n in parole binarie. Analogamente a prima, denotiamo la
L (an )
lunghezza di codice per simbolo con Cnn 1 e la lunghezza media con E{Xn } (LCn )
Sia H(X1n ) l’entropia a blocchi definita come in (3).
Considerando Cn come un codice sull’alfabeto An , il teorema 4.3 i) diventa:
1
H(X1n )
≤ E{Xn } (LCn )
n
n
(13)
per ogni n-codice a prefisso, mentre il teorema 4.3 ii) prova l’esistenza di un n-codice a
prefisso Cn tale che
H(X1n ) 1
1
E{Xn } (LCn ) ≤
+
(14)
n
n
n
Una sequenza {Cn } tale che, per ogni n, Cn è un n-codice a prefisso con lunghezza associata
L(an1 ) = LCn (an1 ), sarà chiamata una sequenza di codici a prefisso. Il rate di una tale sequenza
di parole di codice, relative a un processo {Xn }, è definito:
R({Cn }) := lim sup
n→∞
E(LCn )
n
(15)
I due risultati (14) e (15) portano al seguente teorema (Teorema I.7.12 in [3]):
Teorema 4.5 (Entropia di un processo e codici a prefisso). Se {Xn } è un processo stazionario
con entropia H, allora:
i) Esiste una sequenza di codici a prefisso {Cn } tale che R({Cn }) ≤ H
ii) Non esiste una sequenza di codici a prefisso {Cn } tale che R({Cn }) < H
Quindi: esistono codici buoni, cioè è possibile comprimere al limite fino al valore dell’entropia, ma non esiston codici “troppo” buoni, cioè nessuna sequenza di codici può asintoticamente comprimere meno del valore dell’entropia del processo.
Questo teorema ci garantisce l’esistenza di un codice ottimale per una singola sorgente,
dove la sorgente è NOTA.
Nel mondo reale, però, si lavora su dati/sequenze per le quali la sorgente non è nota... quindi dobbiamo chiedere molto di piu’ ai nostri compressori! Chiediamo che siano
universalmente asintoticamente ottimali, o piu’ semplicemente, universali:
Definizione 4.3. Una sequenza di codice {Cn } è detta universale se
lim sup
n→∞
LCn (an1 )
≤ H({Xn }) quasi certamente
n
per ogni processo ergodico {Xn }.
Teorema 4.6 (Esistenza dei Codici Universali). Esiste una sequenza di codici a prefisso {Cn }
L (an )
tale che lim supn Cnn 1 ≤ H({Xn }) quasi certamente, per ogni processo ergodico {Xn }.
Teorema 4.7 (Codici troppo buoni non esistono). Se {Cn } è una sequenza di codici non
L (an )
singolari allora lim inf n Cnn 1 ≥ H({Xn }) quasi certamente.
Per concludere vediamo ora un esempio di compressore universale.
13
Esempio 4.4 (L’algoritmo LZ78). Quello che presenteremo ora è un algoritmo di codifica
proposto da Lempel e Ziv nel 1978 in [5] ed è attualmente alla base di molti comuni e popolari
compressori presenti nei nostri computer.
L’algoritmo è basato su una particolare procedura di segmentazione (parsing) di una
sequenza che permette di scrivere una sequenza infinita a ∈ AN come concatenazione di
blocchi di lunghezza variabile, chiamati parole:
a = w1 w2 . . .
.
L’insieme delle parole così formate è chiamato dizionario della sequenza (D(x) = {w1 , w2 , . . .}).
Nel caso dell’algoritmo LZ78 la regola di parsing può essere sintetizzata nella frase: “scegli la prossima parola in modo che sia la piu’ corta nuova parola non ancora apparsa nel
dizionario”.
Facciamo un esempio: consideriamo una sequenza
s = aababbbbaababb...
Seguendo la regola scritta sopra, dobbiamo ‘tagliare’ la sequenza in modo da ottenere le
parole che poi andranno codificate. Si incomincia a leggere la sequenza: ovviamente il primo
carattere sarà sicuramente una parola nuova, mai incontrata, quindi il primo taglio lungo la
sequenza sarà fatto proprio dopo la prima ‘a’ e la lettera a andrà a far parte del dizionario
della sequenza. Ora leggo il secondo carattere, che è ancora la lettera a: questo è già presente
nel dizionario, quindi non è una nuova parola, quindi continuo a leggere finchè non trovo
una parola non presente nel dizionario. In questo caso non devo andare molto lontano, basta
leggere il carattere sucessivo e trovare la parola ab che è una nuova parola, e aggiungerla al
dizionario. Si procede in questo modo fino alla fine della sequenza, ottenendo un dizionario
con tutte le parole.
Ogni parola cosi’ creata puo’ essere vista come composta da due parti: un prefisso corrispondente ad una parola già apparsa nel dizionario piu’ un suffisso costituito da un nuovo carattere; il prefisso di ogni parola può essere identificato con la posizione che ha nel
dizionario.
La sequenza in esempio, seguendo questa regola di parsing, diventa concatenazione delle
seguenti parole:
s = a|ab|abb|b|ba|aba|bb....
Ora queste parole vanno mappate in parole binarie (codificate); il codice LZ (Lempel
e Ziv) mappa dunque la stringa s nella concatenazione delle parole ottenute dal parsing
codificate.
Non esponiamo ora il tipo di codice a prefisso che si viene a costruire su queste parole
del parsing; in maniera molto approssimativa diremo solo che l’output dell’algoritmo di
compressione sarà dato dalla codifica binaria della posizione del prefisso nel dizionario e del
nuovo carattere.
Nella tabella che segue abbiamo scritto le coppie corrispondenti ad ogni parola del dizionario per la sequenza s d’esempio; la prima colonna è il numero che indica la posizione
nel dizionario della parola codice la cui coppia corrispondente è mostrata nella stessa linea,
in seconda colonna. Per facilitare la lettura, aggiungiamo una terza colonna che mostra
ciascuna parola codificata nella stringa originale s, ma notiamo che questa non è contenuta
nel file di output:
14
1
2
3
4
5
6
7
(0,a) [a]
(1,b) [ab]
(2,b) [abb]
(0,b) [b]
(4,a) [ba]
(2,a) [aba]
(4,b) [bb]
...
Se con C indichiamo il numero di parole ottenute con questo tipo di parsing (ovvero la
cardinalità del dizionario finale), il costo di codifica, cioè il numero di bit spesi per codificare
queste parole, sarà approssimativamente dato dal numero di bit necessari a codificare il
prefisso, cioè la posizione nel dizionario, + il numero di bit necessari a codificare il nuovo
carattere, ovvero (al più) C log n bit per codificare le posizioni nel dizionario e C log |A| bit
per codificare i nuovi caratteri.
Quando si va a considerare il rate (costo di codifica diviso per la lunghezza originaria
n della sequenza), al limite per n → ∞ il termine dominante in questa codifica è C log n,
e dunque per stabilire l’universalità dell’algoritmo di compressione LZ78 basta provare il
seguente teorema di Ziv [7], nel quale C(an1 ) denota il numero di parole ottenute con il
parsing ora descritto per la sequenza an1 :
Teorema 4.8. Se {Xn } è un processo ergodico con entropia H({Xn }), allora
1
C(an1 ) log n −−−→ H({Xn }) quasi certamente.
n→∞
n
Ovviamente basta dimostrare che l’entropia è un limite superiore, poiché per il teorema
4.7 nessun codice puo’ comprimere superando l’entropia.
Due considerazioni finali: il teorema 4.8 ci assicura l’esistenza di un codificatore ottimale.
Non ci dice nulla, però, sulla velocità di convergenza all’entropia; per avere tale informazione
sono necessarie stime accurate sul costo effettivo del codice LZ implementato, come riportato
in [6] e [5] da Ziv e Lempel per gli algoritmi LZ78 e LZ77 (ma questi conti li lascerei agli
informatici...).
La seconda considerazione: con i codificatori alla LZ abbiamo degli strumenti in grado di
comprimere sequenze simboliche senza conoscerne a priori la statistica: questo ovviamente li
rende molto piu’ veloci dei cosiddetti codificatori statistici, come il codice di Huffman prima
spiegato, che prima di operare la codifica devono leggere tutta la sequenza per registrare le
frequenze dei caratteri (o parole) presenti.
Il codificatore LZ, al contrario, codifica la stringa sequenzialmente, mentre la legge,
utilizzando per la compressione le ridondanze all’interno della sequenza stessa.
Riferimenti bibliografici
[1] D. Ornstein, B. Weiss, The Shannon-McMillan-Breiman theorem for amenable groups,
Israel Journal of Mathematics 44 (1983), 53-60.
[2] C.E. Shannon, A Mathematical Theory of Communication, The Bell System Technical
Journal 27 (1948), 379-423, 623-656.
15
[3] P.C. Shields, The Ergodic Theory of Discrete Sample Paths, American Mathematical
Society (1996).
[4] T.M. Cover, J.A.Thomas, Elements of Information Theory, New Jork: Wiley (1991)
[5] J. Ziv, A. Lempel Compression of individual sequences via variable-rate coding, IEEE
Transactions on Information Theory, IT-24, n 5 (1978), 530-536,
[6] J. Ziv, A. Lempel A Universal Algorithm for Sequential Data Compression”, IEEE
Transactions on Information Theory, 23, n 3, (1977) 337-343
[7] J. Ziv Coding theorems for individual sequences, IEEE Transactions on Information
Theory IT-24 (1978), 405-412
16
Fly UP