Salta al contenuto
Note per Studenti Codifica di sorgente

Codifica di sorgente

In questa pagina 10

La sorgente emette simboli con certe probabilità; la entropiaL'informazione di un evento di probabilità $P$ è $i=\log_2\frac1P$ bit; l'entropia $H(x)=\sum p\log_2\frac1p$ è l'informazione media e misura l'incertezza: $0\le H\le\log_2M$, massimo se i simboli sono equiprobabili. Per due variabili: $\max{H(x),H(y)}\le H(x,y)\le H(x)+H(y)$, $H(x|y)=H(x,y)-H(y)$ e l'informazione mutua $I(x;y)=H(x)-H(x|y)=H(x)+H(y)-H(x,y)\ge0$ (zero se e solo se indipendenti). Per una sorgente di $F_s$ simboli/s: rate di informazione $F_sH_s$, rate nominale $F_s\log_2M$, efficienza $\eta=\frac{H_s}{\log_2M}$.Informazione, entropia e informazione mutua → dice quanti bit di informazione contengono in media. Se si trasmette ogni simbolo con ⌈log⁡2M⌉\lceil\log_2M\rceil bit (lunghezza fissa) se ne spendono di più, quando i simboli non sono equiprobabili. La codifica di sorgente (source coding) rappresenta la stessa informazione con meno bit.

1. Lo schema e le grandezze

Esistono due famiglie. La codifica lossy accetta una perdita di informazione (mp3, jpeg, mpeg), la lossless è invertibile (zip, rar): da quello che si trasmette si ricostruisce esattamente la sequenza di partenza. Il corso studia solo la seconda.

Definizione (codice di sorgente). Una sorgente emette parole x⃗\vec x di NN simboli (dizionario di ingresso Dx\mathcal D_x, entropia H(x⃗)H(\vec x)). Una mappa μs:Dx→C\mu_s:\mathcal D_x\to\mathcal C associa a ogni parola una parola di codice b⃗\vec b scritta con un alfabeto di MM simboli (alfabeto binario: M=2M=2), e deve essere invertibile (diversamente si perderebbe informazione). L(b⃗)L(\vec b) è la lunghezza di b⃗\vec b; la lunghezza media è L~=E[L(b⃗)]=∑b⃗∈CP(b⃗) L(b⃗),\tilde L=E\left[L(\vec b)\right]=\sum_{\vec b\in\mathcal C}P(\vec b)\,L(\vec b), cioè il valore attesoIl valore atteso E[X] = Σ x p_X(x) è la media dei valori di X pesata con le loro probabilità (esiste se la serie converge assolutamente); per una funzione g vale E[g(X)] = Σ g(x) p_X(x) senza trovare la legge di g(X), ed E è lineare: E[aX + bY + c] = aE[X] + bE[Y] + c.Valore atteso → della lunghezza, vista come variabile aleatoria che dipende dalla parola emessa; e l'efficienza del codice è η=H(x⃗)L~ log⁡2M\eta=\frac{H(\vec x)}{\tilde L\,\log_2M} (per un codice binario η=HL~\eta=\frac{H}{\tilde L}).

Senza codifica servono ⌈log⁡2∣Dx∣⌉\lceil\log_2\lvert\mathcal D_x\rvert\rceil bit per parola. L'idea è: parole frequenti →\to parole corte; parole rare →\to parole lunghe, in modo che L~\tilde L scenda. Se la sorgente emette FsF_s simboli/s il bit-rate nominale diventa FsL~/NF_s\tilde L/N (confrontalo con il rate di informazione FsHsF_sH_s, Informazione, entropia e informazione mutuaL'informazione di un evento di probabilità $P$ è $i=\log_2\frac1P$ bit; l'entropia $H(x)=\sum p\log_2\frac1p$ è l'informazione media e misura l'incertezza: $0\le H\le\log_2M$, massimo se i simboli sono equiprobabili. Per due variabili: $\max{H(x),H(y)}\le H(x,y)\le H(x)+H(y)$, $H(x|y)=H(x,y)-H(y)$ e l'informazione mutua $I(x;y)=H(x)-H(x|y)=H(x)+H(y)-H(x,y)\ge0$ (zero se e solo se indipendenti). Per una sorgente di $F_s$ simboli/s: rate di informazione $F_sH_s$, rate nominale $F_s\log_2M$, efficienza $\eta=\frac{H_s}{\log_2M}$.Informazione, entropia e informazione mutua →).

Esempio. M=8M=8 simboli equiprobabili: H=3H=3 bit e a lunghezza fissa 3 bit: la codifica non può migliorare (η=1\eta=1). Se invece le probabilità sono (12,14,18,18)\left(\frac12,\frac14,\frac18,\frac18\right), la lunghezza fissa usa 2 bit e H=1,75H=1{,}75: c'è margine per risparmiare 12,5%12{,}5\%.

2. Decodificabilità e codici a prefisso

Definizione (decodificabile, a prefisso). Un codice è univocamente decodificabile se due sequenze diverse di parole di codice non danno mai la stessa stringa di bit. Una parola b⃗\vec b è prefisso di b⃗′\vec b' se L(b⃗)<L(b⃗′)L(\vec b)<L(\vec b') e b⃗\vec b coincide con i primi L(b⃗)L(\vec b) simboli di b⃗′\vec b'. Un codice è a prefisso se nessuna sua parola è prefisso di un'altra.

Il problema nasce quando le lunghezze sono diverse: una sequenza di bit ricevuta potrebbe essere divisa in più modi in parole di codice.

Esempio. Con A→0, B→1, C→01, D→10A\to0,\ B\to1,\ C\to01,\ D\to10 la stringa 01010011011010101001101101 è ambigua (0 1 0 1…0\,1\,0\,1\dots = ABAB…ABAB\dots ma anche 01 01⋯=CC…01\,01\dots=CC\dots): il codice non è decodificabile. Con A→0, B→10, C→110, D→111A\to0,\ B\to10,\ C\to110,\ D\to111 (a prefisso) la stringa 0 10 110 111 00\,10\,110\,111\,0 si legge in un solo modo.

Proposizione. Un codice a prefisso è decodificabile, e in modo istantaneo. Dimostrazione: si legge la stringa bit per bit; appena i bit letti coincidono con una parola di codice, quella è la parola emessa, perché nessuna parola più lunga può iniziare con essa (se no la prima sarebbe prefisso); si riparte da capo. Non vale il contrario: {0,01}\{0,01\} è decodificabile (dopo uno 00 si guarda il bit successivo) ma 00 è prefisso di 0101.

I codici a prefisso si disegnano con un albero binario: ogni parola è una foglia (un nodo senza figli), il cammino dalla radice la scrive (0 a sinistra, 1 a destra) e nessuna parola sta su un nodo interno.

3. Disuguaglianza di Kraft-McMillan

Teorema (Kraft-McMillan). Sia C\mathcal C un codice con alfabeto di MM simboli e parole di lunghezze l1,…,lKl_1,\dots,l_K.

  1. Se C\mathcal C è decodificabile, allora ∑i=1K1Mli≤1\displaystyle\sum_{i=1}^K\frac1{M^{l_i}}\le1 (equivalentemente E[1ML(b⃗)P(b⃗)]≤1E\left[\frac1{M^{L(\vec b)}P(\vec b)}\right]\le1).
  2. Viceversa, se l1,…,lKl_1,\dots,l_K sono interi con ∑iM−li≤1\sum_iM^{-l_i}\le1 esiste un codice a prefisso con alfabeto MM e quelle lunghezze.

Esempio. Le lunghezze 1,2,3,31,2,3,3 danno 12+14+18+18=1≤1\frac12+\frac14+\frac18+\frac18=1\le1: esiste un codice a prefisso binario (quello dell'esempio sopra con B→10B\to10, C→110C\to110, D→111D\to111). Le lunghezze 2,2,3,3,3,3,4,42,2,3,3,3,3,4,4 (otto parole) danno 2⋅14+4⋅18+2⋅116=12+12+18=98>12\cdot\frac14+4\cdot\frac18+2\cdot\frac1{16}=\frac12+\frac12+\frac18=\frac98>1: nessun codice decodificabile ha queste lunghezze.

Dimostrazione del punto 2 (costruzione). Si ordinano le lunghezze in modo crescente e si assegnano le parole una dopo l'altra, sull'albero, scegliendo ogni volta il primo nodo libero a quella profondità che non sia discendente di una parola già scelta. Una parola di lunghezza ll "occupa" una frazione M−lM^{-l} di tutte le foglie (a una profondità fissata); la condizione ∑M−li≤1\sum M^{-l_i}\le1 garantisce che le foglie occupate non superino mai quelle disponibili. Quindi il nodo libero esiste sempre. □\square

Dimostrazione del punto 1. Si elevi la somma a una potenza nn: (∑iM−li)n=∑i1,…,inM−(li1+⋯+lin)=∑k=nn lmax⁡Nk M−k,\left(\sum_iM^{-l_i}\right)^n=\sum_{i_1,\dots,i_n}M^{-(l_{i_1}+\dots+l_{i_n})}=\sum_{k=n}^{n\,l_{\max}}N_k\,M^{-k}, dove NkN_k è il numero di sequenze di nn parole di codice la cui lunghezza totale è kk. Se il codice è decodificabile, sequenze diverse danno stringhe diverse di kk simboli, quindi Nk≤MkN_k\le M^k (tanti quante le stringhe possibili). Allora (∑iM−li)n≤∑k=nn lmax⁡1≤n lmax⁡\left(\sum_iM^{-l_i}\right)^n\le\sum_{k=n}^{n\,l_{\max}}1\le n\,l_{\max}. Se la somma SS fosse >1>1, SnS^n crescerebbe esponenzialmente in nn mentre n lmax⁡n\,l_{\max} cresce solo linearmente: contraddizione per nn grande. Quindi S≤1S\le1. □\square

Osservazioni. (i) Il punto 1 è una condizione necessaria, non sufficiente: {0,01,10}\{0,01,10\} ha somma 12+14+14=1\frac12+\frac14+\frac14=1 ma 010010 è ambiguo (0 100\,10 oppure 01 001\,0). (ii) Il punto 2 dice che non si perde nulla limitandosi ai codici a prefisso: se esiste un codice decodificabile con certe lunghezze, ne esiste uno a prefisso con le stesse. (iii) Kraft serve per escludere codici (somma >1>1) o per costruirli: ad esempio A→0, B→00, C→01, D→111, E→1111A\to0,\ B\to00,\ C\to01,\ D\to111,\ E\to1111 ha somma 12+14+14+18+116=1916>1\frac12+\frac14+\frac14+\frac18+\frac1{16}=\frac{19}{16}>1, quindi non è decodificabile (000000 potrebbe essere AAAAAA, ABAB, BABA).

4. Teorema di Shannon sulla codifica di sorgente

Teorema (Shannon). Sia C\mathcal C un codice con alfabeto di MM simboli per parole x⃗\vec x di entropia H(x⃗)H(\vec x).

  1. Se C\mathcal C è decodificabile, L~≥H(x⃗)log⁡2M\displaystyle\tilde L\ge\frac{H(\vec x)}{\log_2M}.
  2. Esiste un codice a prefisso con L~<H(x⃗)log⁡2M+1\displaystyle\tilde L<\frac{H(\vec x)}{\log_2M}+1. Corollario (M=2M=2): L~=H(x⃗)\tilde L=H(\vec x) se e solo se tutte le probabilità sono potenze di 12\frac12.

Dimostrazione del punto 1. Per Kraft E[1MLP]≤1E\left[\frac1{M^{L}P}\right]\le1. Si applica il logaritmo in base 1M\frac1M (funzione decrescente, quindi inverte la disuguaglianza) e Jensen (log in base 1M\frac1M è convessa, quindi log⁡E[⋅]≤E[log⁡⋅]\log E[\cdot]\le E[\log\cdot] in questo verso, Segnali, potenza e decibelRichiami che servono in tutto il corso. Unità SI e prefissi (kilo = $10^3$, bit e non byte); decibel $[x]{dB}=10\log{10}x$ per le potenze e $20\log_{10}$ per le ampiezze (prodotti = somme); banda di un segnale (primo zero, a $\alpha$ dB, di energia) e banda pratica; energia, potenza e teorema di Parseval; processi aleatori: media, potenza, autocorrelazione, stazionarietà (WSS), ergodicità, densità spettrale di potenza $\mathcal P_x(f)$ e filtraggio $\mathcal P_y=\lvert G\rvert^2\mathcal P_x$.Segnali, potenza e decibel → §7): 0≤log⁡1/ME[1MLP]≤E[log⁡1/M1MLP]=E[L]−E[log⁡M1P]=L~−H(x⃗)log⁡2M.0\le\log_{1/M}E\left[\frac1{M^{L}P}\right]\le E\left[\log_{1/M}\frac1{M^{L}P}\right]=E\left[L\right]-E\left[\log_M\frac1P\right]=\tilde L-\frac{H(\vec x)}{\log_2M}. (passaggi: log⁡1/M1MLP=log⁡M(MLP)=L+log⁡MP=L−log⁡M1P\log_{1/M}\frac1{M^LP}=\log_M(M^LP)=L+\log_MP=L-\log_M\frac1P e log⁡M1P=log⁡2(1/P)log⁡2M\log_M\frac1P=\frac{\log_2(1/P)}{\log_2M}, per il cambio di base e le proprietà dei logaritmi, Esponenziale e logaritmoLa funzione esponenziale a^x (base positiva diversa da 1) e la sua inversa, il logaritmo in base a, con grafici e proprietà.Esponenziale e logaritmo →; la media si porta dentro e fuori dalla somma per la linearità del Valore attesoIl valore atteso E[X] = Σ x p_X(x) è la media dei valori di X pesata con le loro probabilità (esiste se la serie converge assolutamente); per una funzione g vale E[g(X)] = Σ g(x) p_X(x) senza trovare la legge di g(X), ed E è lineare: E[aX + bY + c] = aE[X] + bE[Y] + c.Valore atteso →.) □\square

Vedi anche la stessa teoria nel corso di Ing. Elettronica: Codifica di sorgente - codici a prefisso e teorema di ShannonLa codifica di sorgente riduce il numero di bit mappando le parole della sorgente in parole di lunghezza variabile (più corte per le più probabili), senza perdere informazione. Il codice deve essere decodificabile; i codici a prefisso (nessuna parola è prefisso di un'altra) lo sono. Kraft-McMillan: se il codice è decodificabile $\sum M_y^{-L(b)}\le1$. Teorema di Shannon: $L_y\ge\frac{H(x)}{\log_2M_y}$ e esiste un codice a prefisso con $L_y\le\frac{H(x)}{\log_2M_y}+1$; l'efficienza è $\eta=\frac{H(x)}{L_y\log_2M_y}$.Codifica di sorgente - codici a prefisso e teorema di Shannon → e Codici di Shannon-Fano e di HuffmanIn un codice ottimo le parole più probabili non sono più lunghe di quelle meno probabili e le due parole più lunghe differiscono solo per l'ultimo simbolo. Shannon-Fano costruisce l'albero dall'alto dividendo ripetutamente i simboli in due gruppi di probabilità quasi uguali; Huffman lo costruisce dal basso unendo ogni volta i due simboli meno probabili ed è sempre ottimo tra i codici a prefisso. La lunghezza media $L_y$ è la somma delle probabilità dei nodi uniti, l'efficienza è $\eta=\frac{H}{L_y}$.Codici di Shannon-Fano e di Huffman →.

Dimostrazione del punto 2 (lunghezze di Shannon). Si pone li=⌈log⁡M1Pi⌉l_i=\left\lceil\log_M\frac1{P_i}\right\rceil. Allora li≥log⁡M1Pil_i\ge\log_M\frac1{P_i}, cioè M−li≤PiM^{-l_i}\le P_i, quindi ∑iM−li≤∑iPi=1\sum_iM^{-l_i}\le\sum_iP_i=1: vale Kraft e per il punto 2 di Kraft-McMillan esiste un codice a prefisso con queste lunghezze. Inoltre li<log⁡M1Pi+1l_i<\log_M\frac1{P_i}+1 e mediando L~<Hlog⁡2M+1\tilde L<\frac{H}{\log_2M}+1. □\square

Corollario. Con M=2M=2 il limite inferiore è raggiunto esattamente quando log⁡21Pi\log_2\frac1{P_i} è intero per ogni ii, cioè Pi=2−liP_i=2^{-l_i}: allora le lunghezze di Shannon sono log⁡21Pi\log_2\frac1{P_i} senza arrotondamento e L~=H\tilde L=H.

Esempio. Probabilità (12,14,18,18)\left(\frac12,\frac14,\frac18,\frac18\right) e codice A→0A\to0, B→10B\to10, C→110C\to110, D→111D\to111: H=12⋅1+14⋅2+18⋅3+18⋅3=74=1,75H=\frac12\cdot1+\frac14\cdot2+\frac18\cdot3+\frac18\cdot3=\frac74=1{,}75 e L~=12⋅1+14⋅2+18⋅3+18⋅3=1,75\tilde L=\frac12\cdot1+\frac14\cdot2+\frac18\cdot3+\frac18\cdot3=1{,}75: η=1\eta=1.

Il teorema dà solo limiti: non dice come trovare il codice migliore. Servono algoritmi.

5. Codifica di Shannon

Definizione (codifica di Shannon). Le lunghezze sono li=⌈log⁡21Pi⌉l_i=\lceil\log_2\frac1{P_i}\rceil e le parole si assegnano scorrendo l'albero dalle lunghezze più corte alle più lunghe.

Esempio. P=(0,38, 0,19, 0,17, 0,14, 0,12)P=(0{,}38,\ 0{,}19,\ 0{,}17,\ 0{,}14,\ 0{,}12) per A,…,EA,\dots,E. log⁡21P=1,40, 2,40, 2,56, 2,84, 3,06\log_2\frac1P=1{,}40,\ 2{,}40,\ 2{,}56,\ 2{,}84,\ 3{,}06, quindi l=(2,3,3,3,4)l=(2,3,3,3,4) (Kraft: 14+38+116=0,6875≤1\frac14+\frac38+\frac1{16}=0{,}6875\le1). Assegnazione canonica: A=00A=00; poi tre parole di 3 bit: B=010B=010, C=011C=011, D=100D=100; poi la parola di 4 bit E=1010E=1010 (si parte da 101101 e si aggiunge uno 00, perché 100100 è già usata e 101101 è libero). L~=0,38⋅2+(0,19+0,17+0,14)⋅3+0,12⋅4=0,76+1,5+0,48=2,74\tilde L=0{,}38\cdot2+(0{,}19+0{,}17+0{,}14)\cdot3+0{,}12\cdot4=0{,}76+1{,}5+0{,}48=2{,}74 bit, a fronte di H=2,184H=2{,}184 bit: η=0,797\eta=0{,}797.

6. Codifica di Shannon-Fano

Procedura (dall'alto, top-down).

  1. ordina i simboli per probabilità decrescente;
  2. dividili in due gruppi (i primi kk e i restanti) con probabilità totali il più possibile vicine;
  3. ripeti in ogni gruppo fino ad avere un solo simbolo;
  4. a ogni ramo associa 00 o 11 (di solito 00 al gruppo di sinistra).

Esempio (stessi simboli). {A,B}\{A,B\} (0,570{,}57) contro {C,D,E}\{C,D,E\} (0,430{,}43): differenza 0,140{,}14 (con {A}\{A\} contro {B,C,D,E}\{B,C,D,E\} sarebbe 0,240{,}24). Poi {A},{B}\{A\},\{B\} e {C}\{C\} (0,170{,}17) contro {D,E}\{D,E\} (0,260{,}26), poi {D},{E}\{D\},\{E\}. Parole: A=00A=00, B=01B=01, C=10C=10, D=110D=110, E=111E=111. L~=2(0,38+0,19+0,17)+3(0,14+0,12)=1,48+0,78=2,26\tilde L=2(0{,}38+0{,}19+0{,}17)+3(0{,}14+0{,}12)=1{,}48+0{,}78=2{,}26 bit (η=0,967\eta=0{,}967).

La divisione "quasi uguale" non è sempre unica e l'algoritmo non garantisce l'ottimo; qui comunque è migliore della codifica di Shannon.

7. Codifica di Huffman

Per dire che un codice è ottimo (minima L~\tilde L tra i codici decodificabili, cioè, per Kraft, tra quelli a prefisso) servono due proprietà.

Teorema 1. In un codice ottimo, se Pa≤PbP_a\le P_b allora La≥LbL_a\ge L_b (la parola più probabile non è più lunga). Teorema 2. In un codice ottimo (binario) i due simboli meno probabili hanno parole di lunghezza massima, uguali in tutto tranne l'ultimo bit (sono "fratelli" nell'albero).

Dimostrazione del Teorema 1 (per assurdo). Se fosse Pa≤PbP_a\le P_b con La<LbL_a<L_b, scambiando le due parole il contributo di aa e bb alla lunghezza media passerebbe da PaLa+PbLbP_aL_a+P_bL_b a PaLb+PbLaP_aL_b+P_bL_a: la differenza è (Pa−Pb)(Lb−La)=−(Pb−Pa)(Lb−La)≤0(P_a-P_b)(L_b-L_a)=-(P_b-P_a)(L_b-L_a)\le0, prodotto di due fattori non negativi cambiato di segno. Quindi L~\tilde L non aumenta, e diminuisce se Pa<PbP_a<P_b: il codice non sarebbe ottimo. Dimostrazione del Teorema 2. La parola di lunghezza massima ha un "fratello" della stessa lunghezza che differisce solo nell'ultimo bit: se non l'avesse, si potrebbe togliere l'ultimo bit ottenendo ancora un codice a prefisso e una L~\tilde L minore, contro l'ipotesi di ottimalità. Per il Teorema 1 le parole più lunghe appartengono ai simboli meno probabili, e tra due parole di uguale lunghezza si possono sempre scambiare i simboli, quindi si può far sì che siano proprio i due meno probabili. □\square

Procedura (dal basso, bottom-up).

  1. ordina i simboli per probabilità;
  2. unisci i due meno probabili in un nodo di probabilità la somma;
  3. ripeti (il nodo nuovo è un simbolo come gli altri) fino alla radice;
  4. etichetta con 00 e 11 i due rami uscenti da ogni nodo; la parola di un simbolo è la sequenza di etichette dalla radice alla foglia.

Per il Teorema 2 unire i due meno probabili è una scelta ottima, e ripetendo il ragionamento sul problema ridotto si ottiene un codice ottimo.

Esempio. Stessi simboli (0,38, 0,19, 0,17, 0,14, 0,120{,}38,\ 0{,}19,\ 0{,}17,\ 0{,}14,\ 0{,}12). Si uniscono D+E=0,26D+E=0{,}26; poi i due minori sono C (0,17)C\,(0{,}17) e B (0,19)B\,(0{,}19): B+C=0,36B+C=0{,}36; poi DE (0,26)DE\,(0{,}26) e BC (0,36)BC\,(0{,}36): 0,620{,}62; infine A (0,38)+0,62=1A\,(0{,}38)+0{,}62=1. Codice: A=0A=0, B=100B=100, C=101C=101, D=110D=110, E=111E=111. L~=0,38⋅1+0,62⋅3=2,24\tilde L=0{,}38\cdot1+0{,}62\cdot3=2{,}24 bit, η=2,1842,24=0,975\eta=\frac{2{,}184}{2{,}24}=0{,}975: è il minimo possibile con parole intere (meglio di Shannon, 2,742{,}74, e di Shannon-Fano, 2,262{,}26).

Scorciatoia per L~\tilde L. L~\tilde L è la somma delle probabilità dei nodi interni (le unioni): 0,26+0,36+0,62+1=2,240{,}26+0{,}36+0{,}62+1=2{,}24. Infatti ogni foglia contribuisce con la propria probabilità tante volte quanti nodi attraversa fino alla radice, cioè la sua lunghezza.

Il codice di Huffman non è unico (a parità di probabilità si può scegliere in modi diversi e le etichette 0/1 si scambiano) ma L~\tilde L lo è.

Esempio (sette simboli). P=(0,40, 0,16, 0,15, 0,10, 0,08, 0,06, 0,05)P=(0{,}40,\ 0{,}16,\ 0{,}15,\ 0{,}10,\ 0{,}08,\ 0{,}06,\ 0{,}05): H=2,446H=2{,}446 bit, quindi per Shannon 2,446≤L~<3,4462{,}446\le\tilde L<3{,}446. Lunghezze di Shannon (2,3,3,4,4,5,5)(2,3,3,4,4,5,5): L~=3,00\tilde L=3{,}00 (Kraft 0,68750{,}6875). Shannon-Fano {A,B} ∣ {C,…,G}\{A,B\}\,|\,\{C,\dots,G\}: L~=2,55\tilde L=2{,}55. Huffman: unioni 0,11, 0,18, 0,26, 0,34, 0,60, 10{,}11,\ 0{,}18,\ 0{,}26,\ 0{,}34,\ 0{,}60,\ 1, somma 2,492{,}49; η=2,4462,49=0,982\eta=\frac{2{,}446}{2{,}49}=0{,}982 (Esercizio - sorgente a sette simboli e codici di Shannon, Shannon-Fano e Huffman).

8. Raggruppare i simboli

Se le probabilità non sono potenze di 12\frac12 le parole sono di lunghezza intera e L~\tilde L resta sopra HH. Si può codificare una parola di NN simboli alla volta: la lunghezza per simbolo è L~N≥Hs\frac{\tilde L}N\ge H_s e il margine "+1+1" del teorema pesa solo 1N\frac1N: Hs≤L~N<Hs+1N.H_s\le\frac{\tilde L}N<H_s+\frac1N. Il costo è la complessità: il dizionario ha MNM^N parole.

Esempio. Sorgente senza memoria con P=(0,4, 0,3, 0,3)P=(0{,}4,\ 0{,}3,\ 0{,}3): H=1,571H=1{,}571 bit. Un simbolo alla volta: Huffman dà lunghezze (1,2,2)(1,2,2), L~=1,6\tilde L=1{,}6 (η=0,982\eta=0{,}982). Per coppie ci sono 99 parole con probabilità 0,4⋅0,4=0,160{,}4\cdot0{,}4=0{,}16 (una), 0,4⋅0,3=0,120{,}4\cdot0{,}3=0{,}12 (quattro: AB,AC,BA,CAAB,AC,BA,CA) e 0,3⋅0,3=0,090{,}3\cdot0{,}3=0{,}09 (quattro): Huffman dà L~=3,18\tilde L=3{,}18 bit/coppia, 1,591{,}59 bit/simbolo, η=0,988\eta=0{,}988. Per terne 1,5811{,}581 bit/simbolo, η=0,993\eta=0{,}993. Con una sorgente più sbilanciata il guadagno è più evidente: per P=(0,9,0,1)P=(0{,}9,0{,}1), H=0,469H=0{,}469 e Huffman a un simbolo dà 11 bit (η=0,47\eta=0{,}47), a coppie 0,6450{,}645 (0,730{,}73), a terne 0,5330{,}533 (0,880{,}88), a quaterne 0,4930{,}493 (0,950{,}95).

9. Codifica aritmetica

La codifica aritmetica (versione di Shannon-Fano-Elias) non assegna una parola a ogni simbolo ma un intervallo di [0,1)[0,1) a tutta la sequenza, in modo che la lunghezza del codice per simbolo tenda a HsH_s senza dover costruire un dizionario enorme.

Procedura. Si divide [0,1)[0,1) in sottointervalli di ampiezza uguale alle probabilità dei simboli. Per ogni simbolo letto, l'intervallo corrente si restringe al sottointervallo del simbolo, suddiviso a sua volta con le stesse proporzioni. Alla fine la sequenza è identificata da qualsiasi numero binario nell'intervallo finale (la cui ampiezza è la probabilità P(sequenza)P(\text{sequenza})); servono circa ⌈log⁡21P⌉+1\lceil\log_2\frac1{P}\rceil+1 bit, cioè ≃\simeq l'informazione della sequenza più al massimo 2 bit in totale. Serve un segnale di fine messaggio (STOP).

Esempio. pA=0,5p_A=0{,}5, pB=0,3p_B=0{,}3, pC=0,2p_C=0{,}2: A→[0;0,5)A\to[0;0{,}5), B→[0,5;0,8)B\to[0{,}5;0{,}8), C→[0,8;1)C\to[0{,}8;1). Sequenza B A C AB\,A\,C\,A:

  • BB: [0,5;0,8)[0{,}5;0{,}8) (ampiezza 0,30{,}3);
  • AA: la prima metà (0,50{,}5 dell'ampiezza): [0,5;0,65)[0{,}5;0{,}65);
  • CC: l'ultimo 20%20\%, da 0,5+0,8⋅0,15=0,620{,}5+0{,}8\cdot0{,}15=0{,}62 a 0,650{,}65: [0,62;0,65)[0{,}62;0{,}65);
  • AA: la prima metà: [0,62;0,635)[0{,}62;0{,}635), ampiezza 0,015=0,3⋅0,5⋅0,2⋅0,50{,}015=0{,}3\cdot0{,}5\cdot0{,}2\cdot0{,}5.

Servono ⌈log⁡210,015⌉+1=⌈6,06⌉+1=8\lceil\log_2\frac1{0{,}015}\rceil+1=\lceil6{,}06\rceil+1=8 bit: il punto medio 0,62750{,}6275 troncato a 8 bit è 0,101000002=0,6250{,}10100000_2=0{,}625, che sta nell'intervallo (in questo caso bastano anche solo i 3 bit 101101). In media si resta a Hs=1,485H_s=1{,}485 bit/simbolo di questa sorgente più qualche bit di coda per l'intera sequenza, senza raggruppamento.

Errori comuni

  • Credere che Kraft dimostri la decodificabilità: serve solo per escludere o costruire.
  • Dimenticare che Shannon vale per parola: con NN simboli per parola H(x⃗)≤Nlog⁡2MH(\vec x)\le N\log_2M e L~\tilde L è la lunghezza media della parola; per simbolo si divide per NN.
  • Unire i due simboli più probabili in Huffman, o non riordinare i nodi nuovi con quelli rimasti.
  • Calcolare L~\tilde L senza pesare con le probabilità.
  • Pensare che il codice di Huffman sia unico, o che l'efficienza possa superare 1.
  • Usare log⁡2M\log_2M per un codice binario (=1=1) senza scriverlo nell'efficienza, o dimenticarlo per M>2M>2.

Versione ripasso

Schema e grandezze

Codice a prefisso

  • Nessuna parola è prefisso di un'altra. Un codice a prefisso è decodificabile in modo istantaneo; non vale il contrario ({0,01}\{0,01\} è decodificabile, ma 00 è prefisso di 0101).
  • Esempio: A→0, B→10, C→110, D→111A\to0,\ B\to10,\ C\to110,\ D\to111 si legge in un solo modo. Con A→0, B→1, C→01, D→10A\to0,\ B\to1,\ C\to01,\ D\to10 la stringa 01010011011010101001101101 è ambigua.

Kraft-McMillan

  • Codice decodificabile ⇒∑iM−li≤1\Rightarrow\sum_i M^{-l_i}\le1. Viceversa, se ∑iM−li≤1\sum_iM^{-l_i}\le1 esiste un codice a prefisso con quelle lunghezze.
  • Costruzione: si assegnano le parole in ordine di lunghezza crescente, scegliendo ogni volta un nodo libero dell'albero binario.
  • Esempi: le lunghezze 1,2,3,31,2,3,3 danno 12+14+18+18=1\frac12+\frac14+\frac18+\frac18=1 (esiste un codice a prefisso). Le lunghezze 2,2,3,3,3,3,4,42,2,3,3,3,3,4,4 danno 98>1\frac98>1: nessun codice decodificabile.
  • La condizione è necessaria ma non sufficiente: {0,01,10}\{0,01,10\} ha somma 11, ma 010010 è ambiguo.

Teorema di Shannon

  • Codice decodificabile ⇒L~≥H(x⃗)log⁡2M\Rightarrow\tilde L\ge\frac{H(\vec x)}{\log_2M}. Dimostrazione: da Kraft, si applica il logaritmo (che inverte la disuguaglianza) e la disuguaglianza di Jensen.
  • Esiste un codice a prefisso con L~<H(x⃗)log⁡2M+1\tilde L<\frac{H(\vec x)}{\log_2M}+1.
  • Con M=2M=2: L~=H\tilde L=H se e solo se tutte le probabilità sono potenze di 12\frac12.
  • Lunghezze di Shannon: li=⌈log⁡M1Pi⌉l_i=\left\lceil\log_M\frac1{P_i}\right\rceil. Soddisfano Kraft perché M−li≤PiM^{-l_i}\le P_i.
  • Il teorema dà solo limiti: non dice come costruire il codice migliore.

Codifica di Shannon

  • Esempio P=(0,38; 0,19; 0,17; 0,14; 0,12)P=(0{,}38;\ 0{,}19;\ 0{,}17;\ 0{,}14;\ 0{,}12): log⁡21P=1,40; 2,40; 2,56; 2,84; 3,06\log_2\frac1P=1{,}40;\ 2{,}40;\ 2{,}56;\ 2{,}84;\ 3{,}06, quindi l=(2,3,3,3,4)l=(2,3,3,3,4) e Kraft 0,6875≤10{,}6875\le1.
  • Parole: A=00A=00, B=010B=010, C=011C=011, D=100D=100, E=1010E=1010. L~=2,74\tilde L=2{,}74 bit contro H=2,184H=2{,}184 bit: η=0,797\eta=0{,}797.

Codifica di Shannon-Fano (dall'alto)

  • Si ordinano i simboli per probabilità decrescente, si dividono in due gruppi con probabilità il più possibile vicine, si ripete in ogni gruppo; 00 al ramo di sinistra. Non garantisce l'ottimo.
  • Stesso esempio: {A,B}\{A,B\} (0,570{,}57) contro {C,D,E}\{C,D,E\} (0,430{,}43), poi {A},{B},{C}\{A\},\{B\},\{C\} contro {D,E}\{D,E\}. Parole A=00A=00, B=01B=01, C=10C=10, D=110D=110, E=111E=111; L~=2,26\tilde L=2{,}26 bit.

Codifica di Huffman (dal basso)

  • Si uniscono i due simboli meno probabili in un nodo con probabilità somma; si ripete trattando il nodo come un simbolo; si etichettano i rami con 00 e 11.
  • Teorema 1: in un codice ottimo la parola più probabile non è più lunga. Teorema 2: in un codice ottimo binario i due simboli meno probabili hanno parole di lunghezza massima, uguali tranne l'ultimo bit. Per questo unire i due meno probabili è una scelta ottima e il codice risultante è ottimo.
  • Esempio: D+E=0,26D+E=0{,}26; B+C=0,36B+C=0{,}36; 0,26+0,36=0,620{,}26+0{,}36=0{,}62; A+0,62=1A+0{,}62=1. Codice A=0A=0, B=100B=100, C=101C=101, D=110D=110, E=111E=111: L~=0,38⋅1+0,62⋅3=2,24\tilde L=0{,}38\cdot1+0{,}62\cdot3=2{,}24 bit, η=0,975\eta=0{,}975.
  • Scorciatoia: L~\tilde L è la somma delle probabilità dei nodi interni, 0,26+0,36+0,62+1=2,240{,}26+0{,}36+0{,}62+1=2{,}24.
  • Il codice non è unico (si possono scambiare le etichette e scegliere tra probabilità uguali), ma L~\tilde L sì.
  • Sette simboli P=(0,40; 0,16; 0,15; 0,10; 0,08; 0,06; 0,05)P=(0{,}40;\ 0{,}16;\ 0{,}15;\ 0{,}10;\ 0{,}08;\ 0{,}06;\ 0{,}05): H=2,446H=2{,}446 bit. Lunghezze di Shannon (2,3,3,4,4,5,5)(2,3,3,4,4,5,5): L~=3,00\tilde L=3{,}00. Shannon-Fano: 2,552{,}55. Huffman: unioni 0,11; 0,18; 0,26; 0,34; 0,60; 10{,}11;\ 0{,}18;\ 0{,}26;\ 0{,}34;\ 0{,}60;\ 1, somma 2,492{,}49, η=0,982\eta=0{,}982 (Esercizio - sorgente a sette simboli e codici di Shannon, Shannon-Fano e Huffman).

Raggruppare i simboli

  • Codificando NN simboli alla volta: Hs≤L~N<Hs+1NH_s\le\frac{\tilde L}N<H_s+\frac1N. Il costo è il dizionario di MNM^N parole.
  • Esempio P=(0,4; 0,3; 0,3)P=(0{,}4;\ 0{,}3;\ 0{,}3), H=1,571H=1{,}571 bit: Huffman a un simbolo dà L~=1,6\tilde L=1{,}6 (η=0,982\eta=0{,}982); a coppie 1,591{,}59 bit/simbolo (η=0,988\eta=0{,}988); a terne 1,5811{,}581 bit/simbolo (η=0,993\eta=0{,}993).
  • Sorgente più sbilanciata P=(0,9; 0,1)P=(0{,}9;\ 0{,}1), H=0,469H=0{,}469: un simbolo alla volta 11 bit (η=0,47\eta=0{,}47); a coppie 0,6450{,}645 (0,730{,}73); a terne 0,5330{,}533 (0,880{,}88); a quaterne 0,4930{,}493 (0,950{,}95).

Codifica aritmetica

  • Tutta la sequenza è identificata da un intervallo di [0,1)[0,1). Ogni simbolo restringe l'intervallo al proprio sottointervallo, suddiviso con le stesse proporzioni. Servono circa ⌈log⁡21P⌉+1\lceil\log_2\frac1P\rceil+1 bit per la sequenza, più un simbolo di fine messaggio (STOP).
  • Esempio: pA=0,5p_A=0{,}5, pB=0,3p_B=0{,}3, pC=0,2p_C=0{,}2, sequenza BACABACA: intervallo finale [0,62; 0,635)[0{,}62;\,0{,}635), ampiezza 0,0150{,}015. Servono 88 bit: 0,101000002=0,6250{,}10100000_2=0{,}625 sta nell'intervallo.

Errori tipici:

  • Credere che Kraft dimostri la decodificabilità: serve solo per escludere o costruire codici.
  • Dimenticare che Shannon vale per parola: per simbolo si divide per NN.
  • Unire i due simboli più probabili in Huffman, o non riordinare i nodi nuovi con quelli rimasti.
  • Pensare che il codice di Huffman sia unico, o che l'efficienza possa superare 11.

Per l'entropia usata in tutto il capitolo: Informazione, entropia e informazione mutuaL'informazione di un evento di probabilità $P$ è $i=\log_2\frac1P$ bit; l'entropia $H(x)=\sum p\log_2\frac1p$ è l'informazione media e misura l'incertezza: $0\le H\le\log_2M$, massimo se i simboli sono equiprobabili. Per due variabili: $\max{H(x),H(y)}\le H(x,y)\le H(x)+H(y)$, $H(x|y)=H(x,y)-H(y)$ e l'informazione mutua $I(x;y)=H(x)-H(x|y)=H(x)+H(y)-H(x,y)\ge0$ (zero se e solo se indipendenti). Per una sorgente di $F_s$ simboli/s: rate di informazione $F_sH_s$, rate nominale $F_s\log_2M$, efficienza $\eta=\frac{H_s}{\log_2M}$.Informazione, entropia e informazione mutua →.

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata