Teoria dell’informazione: ottimizzazione di codice. Introduzione. La teoria dell’informazione ha per oggetto lo studio delle leggi matematiche che regolano l’elaborazione e la trasmissione dell’informazione. In particolare, essa sistematizza i metodi di misurazione e rappresentazione dell’informazione (codifica) e formula relazioni fra variabili matematiche per ottenere un utilizzo ottimale dei sistemi di comunicazione nella trasmissione dei messaggi. La teoria dell’informazione riguarda tutte le forme di trasmissione e memorizzazione di messaggi, comprese la televisione e le registrazioni magnetiche e ottiche dei dati. Essa interessa campi estremamente eterogenei come la cibernetica, la crittografia, la linguistica, la psicologia e la statistica. L’informazione, ovvero l’insieme dei messaggi trasmessi, può essere costituita da voce o musica trasmesse per telefono o radio, da immagini diffuse con sistemi televisivi, da dati digitali trasferiti attraverso le reti di comunicazione, ma anche dagli impulsi nervosi degli organismi viventi. Note storiche. Il nucleo della teoria dell’informazione fu elaborato nel 1948 dall’ingegnere elettrotecnico statunitense Claude E. Shannon. L’intenso sfruttamento dei canali di comunicazione, quali le reti telefoniche e i sistemi di radiocomunicazione, iniziato negli anni Trenta e continuato nel dopoguerra, poneva in primo piano la necessità della messa a punto di sistemi sempre più efficaci per la trasmissione dei messaggi. Si deve a Shannon la prima espressione di un sistema per la generazione e trasmissione delle informazioni in forma di modello, che comprende una sorgente dell’informazione, un codificatore, un canale di trasmissione, un decodificatore e un destinatario (od osservatore), il quale, rilevando, interpretando e utilizzando l’informazione per fini propri, interagisce con essa, contribuendo in parte a determinarne il contenuto trasferito. Misura dell’informazione. Il contenuto informativo di un messaggio è legato alla sua probabilità di mostrarsi entro un insieme di messaggi possibili: maggiore è la probabilità di realizzarsi, minore è il contenuto informativo. È abbastanza intuitivo che sarà il messaggio meno probabile, fra diverse alternative, a portare la massima quantità d’informazione quando si verificherà, mentre il contenuto informativo di un messaggio atteso con certezza è 0. Esempio 1: lancio di una moneta. Indipendenza degli eventi ed equiprobabilità, introduzione del bit come unità d’informazione binaria ed esempio di codifica. Quando lancio una moneta il messaggio “testa o croce” descrive il risultato, ma non ha contenuto informativo, mentre i due messaggi distinti “testa” oppure “croce” sono ugualmente possibili, cioè equiprobabili, con probabilità pari a ½, e da quanto detto finora dovrebbero portare il massimo dell’informazione. Inoltre facendo due lanci successivi essi sono indipendenti tra loro, cioè il secondo lancio non dipenderà da quello che è uscito al primo lancio. Nel nostro esempio, se “croce” è rappresentato da 0 e “testa” da 1, il messaggio può essere rappresentato per mezzo dei due soli simboli 0 e 1, ovvero mediante le cifre del sistema binario; la scelta tra questi simboli corrisponde alla cosiddetta unità di informazione binaria, o bit. Se la moneta viene lanciata tre volte di fila, ho 8 = 23 risultati (o messaggi) equiprobabili rappresentabili come 000, 001, 010, 011, 100, 101, 110 o 111. Questi messaggi corrispondono ai numeri 0, 1, ..., 7 scritti in notazione binaria. La probabilità di occorrenza di ogni messaggio è di un ottavo, quale sarà invece il contenuto informativo, cioè la quantità d’informazione? Per ora possiamo solo dire che: p 1 8 q 1 Quantità di informazione q inversamente proporzionale a p. p Esempio 2: alfabeto inglese. Supponendo di essere in una trasmissione di un impulso attraverso un canale di comunicazione idealmente privo di errori. Trasmettiamo una lettera dell’alfabeto inglese (26 simboli) da una sorgente binaria. Supponiamo che ogni simbolo sia equiprobabile (anche se nella realtà non è così), avremo che la probabilità di occorrenza di ogni simbolo nel messaggio è: p 1 26 q con 1 bit p Matematicamente abbiamo quindi bisogno di una legge che possa esprimere la relazione tra quantità d’informazione e probabilità di occorrenza dell’evento messaggio. Avendo un numero di simboli N = 2m, con m intero, per ogni simbolo occorrono m bit (quantità d’informazione). Ricordando che logaan = n q = m = logaan = log22m = log2N = log2 1 = - log2 p p q = log2 1 = - log2p p Quindi negli esempi delle monete q = 1/8 bit e nell’esempio dell’alfabeto inglese q = log2 1 = 4.70 26 bit. Dati N simboli equiprobabili (p= 1/N): I = n log2 1 = n log2 N bit p Quantità d’informazione necessaria per trasmettere n simboli. Entropia. Precedentemente abbiamo supposto l’equiprobabilità e l’indipendenza dei simboli trasmessi. Negli alfabeti linguistici in realtà non avviene questo. In un testo scritto in italiano ad esempio è più semplice imbattersi nelle vocali i, a, e, o piuttosto che nelle consonanti q oppure z. Dati N simboli non equiprobabili Qi = - log2pi bit Quantità d’informazione per ogni simbolo dove pi sono le probabilità di ogni simbolo. Da qui si calcola la media pesata N H pi log 2 i 1 N 1 pi log 2 pi bit/simbolo p i 1 Entropia 2 H è detta entropia, cioè la quantità media d’informazione associata ad ogni simbolo emesso da una sorgente Esempio 3: una sorgente emette una sequenza di quattro simboli A, B, C, D Probabilità simbolo p(A) = 0,0625 Qi QA = - log2 0.0625 = 4 bit p(B) = 0.25 QB= - log2 0.25 = 2 bit p(C) = 0.25 QB = - log2 0.25 = 2 bit p(D) = 0.4375 QB = - log2 0,4375 = 1.19 bit Entropia H = 0.0625∙ 4 + 0.025∙2 + +0.25∙2 + 0.4375∙1.19 = 1.77 bit/simbolo Se la sorgente emette messaggi equiprobabili, l’entropia della sorgente diventa massima: H Max I log 2 N N Codifica di sorgente e ottimizzazione di codice. Chiamata parola ogni sequenza di bit rappresentante un simbolo del codice utilizzato dalla sorgente, supposta binaria, il codice deve essere tale che il ricevitore distingua una parola dall’altra. Allora ogni parola deve essere: a) riconoscibile tra quelle che appartengono al codice stesso b) identificabile indipendentemente dalla posizione che occupa nel messaggio Esempio 4: A = 11, B = 0, C = 1, D = 00, E = 11 A ed E non rispettano a) Esempio 5: A = 0, B =1, C = 10, D = 00 E = 11 non rispettano b). Infatti ED BCA EAA BBD BBAA 1100 Esempio 6: A = 001, B = 110, C = 010, D = 100, E =111 rispetta le due condizioni. E’ a lunghezza fissa Facilmente decodificabile dal ricevente. Domanda: quando una codifica è ottimale? Per rispondere dobbiamo prima introdurre il concetto di bontà di codice definendo la sua lunghezza come la lunghezza media delle sue parole. N L p ( si ) Li bit/parola dove Li numero bit della parola si con probabilità di occorrenza p(si). i 1 Esempio 7. Nell’esempio 6 essendo a lunghezza fissa e con simboli equiprobabili, L = 5(1/5*3) =3. Ridondanza. Nell’esempio numero 3 abbiamo che H = 1.77 bit/simbolo, se noi indichiamo con HMax la massima quantità di informazione si ha HMax = log 4 = 2 bit/simbolo. Con un codice binario posso codificare con m bit, 2m simboli, cioè sono necessari m = 2 = HMax bit, superiore all’effettiva 3 quantità d’informazione necessaria H, quindi la sorgente emette una percentuale di bit sovrabbondante (ridondanza), occupando inutilmente il canale di comunicazione. R= 1 - H H Max Esempio 8. Se si trasmettono messaggi che consistono in combinazioni casuali delle 26 lettere dell’alfabeto inglese, del segno di spazio e cinque segni di interpunzione(:;,’.), e se si assume che la probabilità di ogni messaggio sia la stessa, l’entropia è data dall’espressione H = log232 = 5. Sono necessari quindi cinque bit per codificare ogni carattere: 00000, 00001, 00010, ..., 11111. Può accadere che il numero di simboli necessari per trasmettere e memorizzare in modo efficace l’informazione sia inferiore a quello ottenuto con la valutazione dell’entropia del sistema: è quindi necessario ridurre il numero di bit usati per la codifica. Questo è possibile nell’elaborazione dei testi, ad esempio, poiché la distribuzione delle lettere dell’alfabeto non è completamente casuale (ad esempio, alcune sequenze di lettere sono più probabili di altre). Esempio 9. Il codice Morse codifica le parole di una lingua in punti e linee. Partendo, in questo caso, dalla conoscenza della distribuzione di probabilità delle lettere nella lingua inglese, si è deciso di codificare la lettera e, che è la più probabile, con un solo punto , mentre la q , che è la meno probabile, è codificata con due linee un punto una linea (--.-). Naturalmente, dato che il codice Morse è stato concepito pensando alla lingua inglese, non è detto che esso sia molto efficiente quando il messaggio da codificare è scritto in un'altra lingua. Esempio 10. In generale il linguaggio comune è molto ridondante. È proprio questa ridondanza che permette ad una persona di capire messaggi lacunosi o di decifrare una calligrafia poco chiara. Pensando all'uso che la lingua italiana fa della lettera `q' che è sempre seguita da una `u': nessuno avrebbe difficoltà nel capire il significato della parola ``q*adro'', nonostante essa non sia scritta correttamente. La presenza di ridondanza in una lingua, in un testo scritto, o in una qualunque stringa di simboli non è però negativa, anzi, essa svolge il compito fondamentale di rendere robusto il messaggio contenuto in quella stringa. Nei moderni sistemi di comunicazione si parla di ridondanza artificiale per indicare quella ridondanza che viene introdotta di proposito nei messaggi codificati per ridurre gli errori di trasmissione. Efficienza e ottimalità. Una caratteristica fondamentale di un codice è la sua efficienza che è pari al rapporto tra l’entropia e la lunghezza media: H L In un codice ottimale η si avvicinerà a 1 La ridondanza può essere scritta come R 1 1 H L In un codice ottimale R si avvicinerà a 0 L’ottimizzazione di codice: algoritmo di Huffman. Il codice di Huffman è un codice univocamente decodificabile a prefisso. Questo significa che nessuna parola del codice è il prefisso di un'altra parola del codice stesso, fatto molto comodo perché, in fase di decodifica, consente di evitare perdite di tempo. 4 Esempio 11. Supponiamo di avere un codice non univocamente decodificabile in cui esistono le due parole 10 e 100; quando il decodificatore ha letto le prime due cifre si trova a dover necessariamente aspettare di vedere la terza per sapere di quale parola si tratta, in quanto 10 è un prefisso di 100. Questa attesa del decodificatore si chiama ritardo di decodifica e si manifesta ogni qualvolta non sia possibile riconoscere una parola di codice subito dopo aver letto la sua ultima lettera. Per ottenere la codifica di Huffman costruiamo un albero. E’ necessario disporre di simboli, o blocchi, da codificare e delle loro probabilità. Nell'esempio che consideriamo abbiamo un alfabeto di 6 simboli e partiamo dalla seguente distribuzione di probabilità: Lettera A B C D E F Totale Probabilità 0.025 0.0.35 0.040 0.20 0.30 0.40 1.00 Possiamo ora descrivere l'algoritmo di Huffman. Si dispongono le singole unità fondamentali (che possono essere lettere o blocchi di caratteri) in ordine di probabilità decrescente. Si attribuisce il valore 0 al primo bit di A e 1 al primo bit di B. Si uniscono le due unità aventi le due probabilità minori in un nuovo blocco cui viene assegnata la somma delle probabilità delle unità che lo hanno formato; se questa è maggiore della successiva viene assegnato 1, 0 altrimenti. Si va avanti fino a che non abbiamo raggiunto in cima all’albero 1 che deve essere per forza la somma di tutte le probabilità. Vedi schema a seguire 5 Albero di Huffman 1 1 PE +PD + PC + PB + PA = 0.60 > PF 0 PD + PC + PB + PA = 0.30 < =PE 0 Verso lettura codice 0 Verso costruzione codice 1 PC + PB + PA = 0.10 < PD 1 1 0 PB+PA = 0.060 > PC 1 PF = 0.40 A 10010 B 10011 C 1000 D 101 E 11 F 0 PE = 0.30 PD = 0.20 PC = 0.040 PB = 0.035 0 PA = 0.025 N.B: a) Nessuna parola di codice è il prefisso di un'altra parola b) Alle parole meno probabili sono stati assegnati più bit che a quelle più probabili c) esistono molti metodi per costruire un albero di Huffman. Abbiamo illustrato quello dall’approccio più semplice 6 Assegnazione esercizi per casa 1) Una sorgente binaria emette sette simboli A B, C, D, E, F, G le cui probabilità di occorrenza pi sono riportate nella seguente tabella con le rispettive codifiche. Determinare: a) L’entropia di sorgente b) Il contenuto informativo del messaggio m = ACAEFC c) La lunghezza media L, l’efficienza e la ridondanza di codice Simbolo A B C D E Probabilità 0.30 0.23 0.20 0.11 0.08 Codifica 00 01 10 F G 0.06 0.02 110 1110 11110 11111 2) Una sorgente binaria emette cinque simboli A B, C, D, E, F, G le cui probabilità di occorrenza pi sono riportate nella seguente tabella con le rispettive codifiche. Determinare: a) la codifica secondo l’algoritmo di Huffmann b) Il contenuto informativo del messaggio m = ACAEC c) La lunghezza media L, l’efficienza e la ridondanza di codice Simbolo A B C D E Probabilità 0.08 0.11 0.16 0.26 0.39 8.2 II Fase (mezz’ora frontale per la correzione con gli studenti degli esercizi svolti per casa) Esercizio1 N H pi log 2 pi -0.30∙log20.30 - 0.23∙log20.23 - 0.20∙log20.20 - 0.11∙log20.11 i 1 0.08∙log20.08 – 0.06∙log20.06 - 0.02∙log20.02 = 2.471 bit/simbolo. La probabilità di m = ACAEFC è data dal prodotto delle probabilità di ogni parola. P(m) = 0.30∙0.20∙0.30∙0.08∙0.06∙0.20 = 1.728 10-5 Il contenuto informativo Q(m) = - log2 P(m) =15.82 bit Q(m) =15.82 bit > 6∙H = 6∙2.471 = 14.826 bit Contenuto maggiore rispetto alla quantità d’informazione media Lunghezza media codice N L p ( si ) Li =0.30∙2 + 0.25∙2 + 0.20∙2 + 0.11∙3 + 0.08∙4 + 0.06∙5 + 0.02∙5 = 2.55 bit/simbolo i 1 H 2.471 0.969 L 2.55 Efficienza codice Ridondanza R=1- 96.9% H = 1-0.969 = 0.031 L 3.1% Esercizio 2 La codifica di Huffmann secondo schema precedente ad albero A = 1010, B = 1011, C = 100, D = 11, E = 0. 7 N H pi log 2 pi -0.39∙log20.39 - 0.26∙log20.26 - 0.16∙log20.16 - 0.11∙log20.11 i 1 0.08∙log20.08 = 2.1 bit/simbolo. P(m) = 0.39∙0.16∙0.39∙0.08∙0.16 = 3.11 ∙ 10-4 Q(m) = - log2 P(m) =11.548 bit > 5∙H = 5∙2.1 = 10.5 bit Contenuto maggiore rispetto alla quantità d’informazione media Lunghezza media codice N L p ( si ) Li =0.39∙1 + 0.26∙2 +0.16∙3 + 0.11∙4 + 0.08∙4 = 2.15 bit/simbolo i 1 H 2.1 0.9767 97.67 % L 2.15 H Ridondanza R = 1 = 1-0.9767 = 0.0233 2.33% L Efficienza codice Spunti per un approfondimento. L’utilizzo dell’algoritmo di Huffman nella compressione dati. L’algoritmo di Huffman nelle sue varianti è utilizzato per la compressione dei dati, cioè per quella tecnica preposta alla riduzione del numero di bit necessari per immagazzinare un'informazione, generalmente applicata per ridurre le dimensioni di un file. Le varie tecniche di compressione cercano di organizzare in modo più efficiente le informazioni al fine di ottenere una memorizzazione che richieda minor uso di risorse (memoria e velocità di trasmissione). Visto il crescente utilizzo di materiale multimediale è utile essere consapevoli del fatto che molto di questo materiale è compresso utilizzando principi in precedenza. Possiamo introdurre genericamente le seguenti due grandi categorie delle tecniche di compressione. Lossy: i dati sono compressi attraverso un processo con perdita d'informazione che sfrutta le ridondanze nell'utilizzo dei dati. Le tecniche con perdita di informazione ottengono delle compressioni molto spinte dei file a scapito dell'integrità del file stesso. Il file prima della compressione e il file dopo la decompressione sono simili ma non identici. Normalmente è utilizzata per comprimere i file multimediali. I files multimediali in origine sono troppo grandi perché possano essere agevolmente trasmessi o memorizzati quindi si preferisce avere una piccola riduzione della qualità, ma nello stesso tempo files più leggeri. Esempi di queste tecniche sono le immagini in formato JPEG o il formato MP3 per i brani musicali. Es. L’occhio umano non coglie la differenza Utilizzo di 64 grigi Utilizzo di 256 grigi 8 Lossless: i dati sono compressi attraverso un processo senza perdita d'informazione che sfrutta le ridondanze nella codifica del dato. Un loro esempio è il formato ZIP per i files o il GIF per le immagini. A partire da un file in uno di questi formati, è sempre possibile ricostruire esattamente il file d'origine. Si sottolinea come l’algoritmo di Huffman fa parte delle tecniche lossless, anche se è utilizzato frequentemente all’interno di tecniche più complesse di tipo lossy. Ad esempio nella riduzione dei files musicali in formato MP3 esso è associato a tecniche di codifica percezionale, ossia basate sul “tagliare” suoni non percepibili all’orecchio umano). Testi di riferimento (bibliografia, sitografia) Langella L.- Giuliano G. - Pojana G.- Scaccianoce R.: Informatica e sistemi automatici, Milano Edizioni Calderini, 2004 http://pil.phys.uniroma1.it/~baronka/tesi_laurea/node25.html http://www.dia.unisa.it/~ads/TesineAsd2/Introduzione.htm, http://www.beta.it/beta/bs019598/0496/b496grf1.htm http://office.microsoft.com/it-it/excel/default.aspx 9 Simulazione su foglio excel Utilizzando le conoscenze viste a lezione, date le probabilità di sei simboli A, B, C, D, E, F come da celle B3-B8, costruire il foglio Excel in figura utilizzando le formule adatte e le proprietà di calcolo automatico del foglio elettronico. Le soluzioni sono in allegato 1. Si richiede cioè Problema 1 1. 2. 3. 4. 5. 6. La quantità d’informazione per simbolo La costruzione dell’albero di Huffman con relativa codifica Il numero di bit per simbolo La bontà del codice, l’entropia della sorgente, l’efficienza e la ridondanza di codice Il codice ASCII per ciascuna lettera del messaggio (decimale e binario) Data una codifica su 3 bit (celle K18-K23) notare l’evidente efficienza dell’algoritmo di Huffman rispetto ad essa. Problema 2 Dato il messaggio FFEABCDBACDEEFFF 1. 2. 3. 4. Separare ciascuna lettera del messaggio Calcolare l’occorrenza per simbolo e il totale dei simboli Calcolare la frequenza di ogni simbolo. Calcolare secondo la codifica di Huffman del problema 1 la quantità d’informazione e la probabilità dell’intero messaggio 5. Scrivere in un'unica stringa il messaggio secondo Huffman Nel caso siate in difficoltà nel reperimento di alcune formule utilizzate la guida in linea di Excel o consultate http://office.microsoft.com/it-it/excel/default.aspx 10 Allegato 1 : soluzione per le formule più significative utilizzate nel foglio elettronico (si riportano soltanto quelle iniziali per quelle copiate tramite trascinamento e riempimento automatico). Cella D3 F8 G8 H8 I8 F6 G5 H4 I3 J3 K3 L3 M3 N3 M11 M12 M13 B14 C14 B20 B21 D21 B24 C24 F33 Formula - LOG(B3;2) SE(($B$8+$B$7)>$B$6;1;0) SE(($B$8+$B$7+$B$6)>$B$5;1;0) SE(($B$8+$B$7+$B$6+$B$5)>$B$4;1;0) SE(($B$8+$B$7+$B$6+$B$5+$B$4)>$B$3;1;0) SE(($B$8+$B$7)>$B$6;0;1) SE(($B$8+$B$7+$B$6)>$B$5;0;1) SE(($B$8+$B$7+$B$6+$B$5)>$B$4;0;1) SE(($B$8+$B$7+$B$6+$B$5+$B$4)>$B$3;0;1) CONCATENA(I3;H3;G3;F3;E3) (LUNGHEZZA(J3)) B3*K3 CODICE(C3) DECIMALE.BINARIO(M3;8) B3*(LOG(1/B3;2))+B4*(LOG(1/B4;2))+B5*(LOG(1/B5;2))+ +B6*(LOG(1/B6;2)+B7*(LOG(1/B7;2))+B8*(LOG(1/B8;2)) $M$11/L9*100 100-M12 LUNGHEZZA($A$12)LUNGHEZZA(SOSTITUISCI($A$12;A14;"")) B14/$B$20 LUNGHEZZA(A12) PRODOTTO(C14:C19) -LOG(C21;2) STRINGA.ESTRAI($A$12;A24;1) SE(B24=$C$3;$J$3;SE(B24=$C$4;$J$4;SE(B24=$C$5;$J$5; SE(B24=$C$6;$J$6;SE(B24=$C$7;$J$7;SE(B24=$C$8;$J$8; " ")))))) =CONCATENA(C24;C25;C26;C27;C28;C29;C30;C31;C32; C33;C34;C35;C36;C37;C38;C39;C40;C41;C42;C43) Intestazione Quantità d’informazione per simbolo Costruzione albero Codifica del simbolo Numero bit simbolo Lunghezza parole ASCII ASCII binario Entropia Efficienza Ridondanza Occorrenza per lettera Frequenza Totale lettere Probabilità messaggio Informazione messaggio Lettera Codifica Codifica messaggio 11