Kompresja danych Instytut Informatyki UWr Studia dzienne Wykad

  • Slides: 37
Download presentation
Kompresja danych Instytut Informatyki UWr Studia dzienne Wykład nr 3: kody Golomba, kody Tunstalla

Kompresja danych Instytut Informatyki UWr Studia dzienne Wykład nr 3: kody Golomba, kody Tunstalla

Kodowanie długości serii (RLE=run length encoding) n Przykłady ciągów binarnych z dużą przewagą zer:

Kodowanie długości serii (RLE=run length encoding) n Przykłady ciągów binarnych z dużą przewagą zer: – – n faksy (tekst drukowany) grafika (monochromatyczna, nie tylko) Kodowanie długości serii: Dla danych postaci 00000001001000001000. . . kodujemy długości kolejnych ciągów zer: 7 8 2 10 17. . .

Kodowanie długości serii c. d. Problemy: n jak kodować liczby oznaczające długości serii aby

Kodowanie długości serii c. d. Problemy: n jak kodować liczby oznaczające długości serii aby uzyskać maksymalną kompresję? – n Jaki rozkład prawdopodobieństwa? alfabet wejściowy potencjalnie nieskończony (dowolnie długie ciągi zer. . . )

RLE: rozkład prawdopodobieństwa Ciąg wartości niezależnych: n P(0)=p n P(1)=1 -p Wtedy: P( 0

RLE: rozkład prawdopodobieństwa Ciąg wartości niezależnych: n P(0)=p n P(1)=1 -p Wtedy: P( 0 n 1 ) = pn ( 1 -p ) Kiedy długie serie: p bliskie jedynki

Kod Golomba rzędu m Kodowanie liczby n: n Niech n = q m +

Kod Golomba rzędu m Kodowanie liczby n: n Niech n = q m + r dla 0 r m. (inaczej: q to wyni, a r reszta z dzielenia n przez m) n Kod liczby n składa się z 2 części: – – unarnego kodowania q: 1 q 0 Kody stałe liczby r o długościach log m i logm , symetrycznie odbite kody stałe w dynamicznym kodowaniu Huffmana (kod prefiksowy!) UWAGA: nieskończony zbiór słów kodowych!

Kod Golomba: własności: n n nieskończony zbiór słów kodowych! kod prefiksowy (p n): –

Kod Golomba: własności: n n nieskończony zbiór słów kodowych! kod prefiksowy (p n): – – i = n / m p / m = j : 1 i 0 1 j 0 n / m p / m : różne reszty z dzielenia (resztom odpowiada kod prefiksowy)

Kod Golomba: przykład Niech m = 5, wtedy reszty r kodujemy wg tabeli: r

Kod Golomba: przykład Niech m = 5, wtedy reszty r kodujemy wg tabeli: r Kod(r) 0 00 1 01 2 10 3 110 4 111

Kod Golomba: przykład Dla danych postaci 00000001001000001000. . . kodujemy długości kolejnych ciągów zer:

Kod Golomba: przykład Dla danych postaci 00000001001000001000. . . kodujemy długości kolejnych ciągów zer: 7 8 2 10 12. . . (razem 8 + 9 + 3 + 11+ 18 = 49 bitów): 10 10 10 110 00 110 10 ( 4 + 5 + 3 +5 + 5 = 22 bity)

Kod Golomba: przykład c. d. Zakodujmy teraz dane 7 8 2 10 12. .

Kod Golomba: przykład c. d. Zakodujmy teraz dane 7 8 2 10 12. . . (49 bitów) używając kodu rzędu 10: 0 1101 0 1110 0 010 10 000 10 010 ( 5 + 4 +5 + 5 = 24 bity) Ale dla m=256 mielibyśmy (co najm. ): 9 + 9 + 9 = 45 bitów q Kod(q) 0 000 1 001 2 010 3 011 4 100 5 101 6 1100 7 1101 8 1110 9 1111

Kod Golomba: parametry W ciągu wartości niezależnych (P(0)=p) mamy: P( 0 n 1 )

Kod Golomba: parametry W ciągu wartości niezależnych (P(0)=p) mamy: P( 0 n 1 ) = pn (1 - p) Czyli w ciągu liczb odpowiadających długościom serii: P( n ) = pn (1 - p) Pytania: n Czy kod Golomba może być przy takim rozkładzie optymalny? n Jeśli tak: jak dobrać wartość m?

Kod Golomba: optymalność Warunek konieczny optymalności: n Wierzchołki o większych wagach (prawdopodobieństwach) wyżej niż

Kod Golomba: optymalność Warunek konieczny optymalności: n Wierzchołki o większych wagach (prawdopodobieństwach) wyżej niż te o mniejszych wagach Dla uproszczenia, niech m=2 k dla naturalnej k: n kody odpowiadające liczbom qm, qm+1, …, qm+m-1 to liście na poziomie (q+1) + log m

Kod Golomba: optymalność c. d. Rozważmy liście położone najwyżej (1+log m): n n Prawdopodobieństwa:

Kod Golomba: optymalność c. d. Rozważmy liście położone najwyżej (1+log m): n n Prawdopodobieństwa: (1 -p), (1 -p)p 1, …, (1 -p)pm-1 Suma wag 2 liści xm-1, xm o najmniejszych wagach powinna być większa od wagi liścia x 1 o największej wadze: (1 -p) pm-1+ (1 -p) pm-2 (1 -p) pm-1+ pm-2 1

Kod Golomba: optymalność c. d. Chcemy podpinać liście jak najwyżej: n Prawdopodobieństwa liści na

Kod Golomba: optymalność c. d. Chcemy podpinać liście jak najwyżej: n Prawdopodobieństwa liści na poziomie 2+logn: (1 -p)pm, (1 -p) pm+1, …, (1 -p)p 2 m-1 n Aby nie było możliwe umieszczenie ich wyżej, suma wag 2 liści xm, xm-1 o największych wagach powinna być mniejsza od wagi liścia x 1 o największej wadze (na poziomie 1+logn): (1 -p) pm+1 < 1

Kod Golomba: optymalność c. d. Warunki konieczne optymalności: pm+1 < 1 pm-1+ pm-2 Po

Kod Golomba: optymalność c. d. Warunki konieczne optymalności: pm+1 < 1 pm-1+ pm-2 Po przekształceniach: pm < 1/(1+p) pm-2 m - log(1+p) / log p > m-2 w przybliżeniu m - 1 / log p > m-2

Kod Golomba: optymalność c. d. Okazuje się, że powyższe warunki konieczne dobrze przybliżają warunki

Kod Golomba: optymalność c. d. Okazuje się, że powyższe warunki konieczne dobrze przybliżają warunki wystarczające. . . Tw. [Gallager, van Voorhis 75] Kod Golomba rzędu m jest optymalnym kodem prefiksowym dla ciągów losowych liczb naturalnych o rozkładzie P(i)=(1 -p)pi-1, gdy m = - log(1+p) / log p w przybliżeniu (dla p bliskiego 1): m = - 1 / log p

Kod Golomba: inna interpretacja Możemy kod Golomba potraktować jako kod przekształcający ciągi o różnych

Kod Golomba: inna interpretacja Możemy kod Golomba potraktować jako kod przekształcający ciągi o różnych długościach w ciągi o różnych długościach: input output 0 m 1 0 m-1 1 0 K(m-1) 0 m-2 1 0 K(m-2) . . . 01 0 K(1) 1 0 K(0) gdzie K(i) to kod stały i dla reszt z dzielenia przez m.

Inna interpretacja: przykład m=5 input output 00000 1 00001 0 111 0001 0 110

Inna interpretacja: przykład m=5 input output 00000 1 00001 0 111 0001 0 110 001 0 10 01 1 0 00 Kodujemy 00000001 001 000001000. . . jako 1 010 1 0110 010 1 1 000

Kod Golomba: jak liczyć śr. długość (bps) Teraz kodujemy ciągi zer i jedynek (nie

Kod Golomba: jak liczyć śr. długość (bps) Teraz kodujemy ciągi zer i jedynek (nie liczby oznaczające ich długości!). Liczba bitów przypadająca na jeden symbol danych wejściowych: S(K) = sr(output) / sr(input) gdzie n sr(output) i sr(output) to średnia długość ciągu wejściowego / wyjściowego (ważona wg prawdopodobieństw) ta definicja jednak ma sens!!!

Kod Golomba: średnia długość (bps) Przykład: m=5 input output P(input) 00000 1 p 1

Kod Golomba: średnia długość (bps) Przykład: m=5 input output P(input) 00000 1 p 1 = p 5 00001 0 111 p 2 = p 4(1 -p) 0001 0 110 p 3 = p 3(1 -p) 001 0 10 p 4 = p 2(1 -p) 01 0 01 p 5 = p(1 -p) 1 0 00 p 6 = (1 -p) sr(input)= 6 * p 1 + 5 * p 2 + 4 * p 3 + 3 * p 4 + 2 * p 5 + 1 * p 6 sr(output)= 1 * p 1 + 4 * p 2 + 4 * p 3 + 3 * p 4 + 3 * p 5 + 3 * p 6

Kod Golomba w praktyce n n n kodujemy bloki postaci 0 p 1, czyli

Kod Golomba w praktyce n n n kodujemy bloki postaci 0 p 1, czyli kodowany „tekst” musi kończyć się jedynką wydajne dla p bliskich 1 (wtedy szansa na długie bloki) stopień kompresji zależy nie tylko od częstości wystąpień symboli ale też od ich „ustawienia” (porównaj z kodami kodującymi bloki ustalonej długości) przydatny nie tylko przy rozkładzie geometryczn. jak dobrać parametr m dla danych o nieznanym rozkładzie? wersja dynamiczna?

Kod Golomba: podsumowanie Własności: n nieskończony zbiór słów kodowych, prosta i skończona reprezentacja LUB

Kod Golomba: podsumowanie Własności: n nieskończony zbiór słów kodowych, prosta i skończona reprezentacja LUB n kod ze zmienną długością części kodowanej i kodującej n tylko dla ciągów binarnych (lub ciągu liczb) n optymalny dla rozkładu P(i) = pi(1 -p), gdy m odpowiednio dobrane n zastosowania: – – obrazy binarne (p. kody Rice’a) faksy

Kody Tunstalla: motywacja Dotychczas: n kody o stałej długości: k symboli wejściowych na p

Kody Tunstalla: motywacja Dotychczas: n kody o stałej długości: k symboli wejściowych na p symboli wyjściowych (zazwyczaj k=1), k, p ustalone n kody o zmiennej długości: k symboli wejściowych (k ustalone) na. . . zmienną liczbę symboli wyjściowych n kody o zmiennej długości wejścia i wyjścia: p. kod Golomba Wady: n kody o stałej długości: brak kompresji n kody o zmiennej długości: wrażliwość na błędy

Kody Tunstalla Nowe podejście: n długość słowa kodowego stała n liczba znaków tekstu wejściowego

Kody Tunstalla Nowe podejście: n długość słowa kodowego stała n liczba znaków tekstu wejściowego kodowana przez jedno słowo kodowe: zmienna Cel: kompresja przy niskich kosztach błędów zapisu/transmisji (typu „przekłamanie bitu”) Porównaj: alfabet Braile’a

Kody Tunstalla: definicja Dane: n alfabet a 1, . . . , a. N

Kody Tunstalla: definicja Dane: n alfabet a 1, . . . , a. N i prawdopodobieństwa p 1, . . . , p. N. n n : długość słowa kodowego (taka, że liczba słów kodowych, 2 n, jest większa od N).

Kody Tunstalla: definicja Tworzenie kodu. n Przyporządkowanie symbolom alfabetu N różnych słów kodowych (o

Kody Tunstalla: definicja Tworzenie kodu. n Przyporządkowanie symbolom alfabetu N różnych słów kodowych (o długości n). n Dopóki liczba niewykorzystanych słów kodowych większa od N-1: – wybierz słowo kodowe e odpowiadające ciągowi o największym prawdopodobieństwie – usuń e z kodu – dodaj do kodu elementy e a 1, e a 2, . . . , e a. N o prawdopodobieństwach P(e) P(a 1), , P(e) P(a. N) UWAGA: zostawiamy (co najmniej) jedno niewykorzystane słowo kodowe!

Kody Tunstalla: przykład n n alfabet a, b, c i prawdopodobieństwa (N = 3)

Kody Tunstalla: przykład n n alfabet a, b, c i prawdopodobieństwa (N = 3) P(a) = 0. 6, P(b) = 0. 3, P(c )=0. 1 n = 3 : kod ma 8 słów kodowych. Etapy tworzenia kodu: n a 0. 6, b 0. 3, c 0. 1 n aa 0. 36, ab 0. 18, ac 0. 06, b 0. 3, c 0. 1 n aaa 0. 216, aab 0. 108, aac 0. 036, ab 0. 18, ac 0. 06, b 0. 3, c 0. 1

Kody Tunstalla: przykład input output aaa 000 aab 001 aac 010 ab 011 ac

Kody Tunstalla: przykład input output aaa 000 aab 001 aac 010 ab 011 ac 100 b 101 c 110 ? ? ? ? 111 bloki wejściowe

Kody Tunstalla: po co wolne słowo kodowe? Zakodujmy tekst: ab c aab b aa

Kody Tunstalla: po co wolne słowo kodowe? Zakodujmy tekst: ab c aab b aa Mamy: input output aaa 000 aab 001 aac 010 ab 011 110 001 101 ? ? ac 100 b 101 Wniosek: c 110 n na końcu kodowanego tekstu ? ? ? ? 111 może pojawić się fragment o długości nie większej od najdłuższego bloku kodowanego jednym słowem, któremu brak słowa kodowego!

Kody Tunstalla: po co wolne słowo c. d. Rozwiązanie: n wolne słowo kodowe koduje

Kody Tunstalla: po co wolne słowo c. d. Rozwiązanie: n wolne słowo kodowe koduje informację o wystąpieniu „ogona” nie mającego słowa kodowego n „ogon” kodujemy przy pomocy ustalonych kodów stałych dla wszystkich liter alfabetu wejściowego ab c aab b aa kodujemy 011 110 001 111 kod(a)

Kody Tunstalla: własności własność prefiksowa: żadne słowo wejściowe odpowiadające słowu kodowemu nie jest prefiksem

Kody Tunstalla: własności własność prefiksowa: żadne słowo wejściowe odpowiadające słowu kodowemu nie jest prefiksem innego słowa wejściowego (nie mylić z kodem prefiksowym!) n – – n słowo rozszerzane usuwamy z kodu zachowanie tej zasady oznacza, że niektóre słowa kodowe zostaną niewykorzystane metoda zachłanna: minimalizacja liczby bitów przypadających na jeden symbol wejściowy

Kody Tunstalla: średnia długość (bps) Ogólnie: liczba bitów przypadająca na jeden symbol danych wejściowych:

Kody Tunstalla: średnia długość (bps) Ogólnie: liczba bitów przypadająca na jeden symbol danych wejściowych: S(K) = sr(output) / sr(input) ale sr(output) = n : każde słowo kodowe ma tę samą długość n sr(input) : średnia ważona wg prawdopodobieństw długości bloków wejściowych odpowiadających słowom kodowym czyli n S(K) = n / sr(input)

Kody Tunstalla: optymalność Rozważmy optymalność wśród kodów: 1. o stałej długości słów kodowych 2.

Kody Tunstalla: optymalność Rozważmy optymalność wśród kodów: 1. o stałej długości słów kodowych 2. o zmiennej długości bloków wejściowych 3. własności prefiksowej: żaden blok wejściowy nie jest prefiksem innego bloku wejściowego 4. każdy tekst można zakodować za wyjątkiem „ogona”, który jest prefiksem jakiegoś bloku wejściowego Kod optymalny: o najmniejszej średniej długości, czyli o największej średniej długości bloku wejściowego.

Kody Tunstalla: optymalność c. d. zbudujmy drzewo bloków wejściowych n wtedy każdy wierzchołek wewnętrzny

Kody Tunstalla: optymalność c. d. zbudujmy drzewo bloków wejściowych n wtedy każdy wierzchołek wewnętrzny ma N potomków odpowiadających wszystkim literom alfabetu (wynika z warunku 4) Korzystając z powyższej: n Tw. Kod Tunstalla jest optymalny wśród kodów spełniających warunki 1 -4 Metoda dowodu: indukcja ze względu na liczbę słów kodowych

Kody Tunstalla: bps (przykład) input output P( input ) aaa 000 0. 216 aab

Kody Tunstalla: bps (przykład) input output P( input ) aaa 000 0. 216 aab 001 0. 108 aac 010 0. 036 ab 011 0. 18 ac 100 0. 06 b 101 0. 3 c 110 0. 1 ? ? ? ? 111 sr(input) = 0. 216 * 3 + 0. 108 * 3 + 0. 036 + 0. 18 * 2 + 0. 06 * 2 + 0. 3 * 1 + 0. 1 * 1

Kody Tunstalla: podsumowanie zmienna długość bloków wejściowych, stała wyjściowych: kompresja i odporność na błędy

Kody Tunstalla: podsumowanie zmienna długość bloków wejściowych, stała wyjściowych: kompresja i odporność na błędy n jednoznaczność kodowania: własność prefiksowa bloków wejściowych n jednoznaczność dekodowania: wynika ze stałej długości słów kodowych n optymalność. . . n

Średnia długość: przypomnienie i uogóln. W ogólnym przypadku możemy mieć kod K o zmiennej

Średnia długość: przypomnienie i uogóln. W ogólnym przypadku możemy mieć kod K o zmiennej długości bloków wejściowych i słów kodowych: blok_we słowo_kod P(blok_we) b 1 s 1 p 1 b 2 s 2 p 2 . . bn sn pn S(K)=sr(output) / sr(input) = |b 1| * p 1 +. . . + |bn| * pn sr(output) = |s 1| * p 1 +. . . + |sn| * pn

Jeszcze inne podejście. . . najlepszą kompresję da rozszerzony kod Huffmana dla rozszerzenia Pk,

Jeszcze inne podejście. . . najlepszą kompresję da rozszerzony kod Huffmana dla rozszerzenia Pk, gdzie k to długość tekstu n ale z tym wiąże się gigantyczny czas i pamięć n . . . można temu zaradzić, stosując kody arytmetyczne n w których słowo kodowe odpowiada całemu tekstowi!