Definicja ♦ ♦ ♦ Jeśli wtedy
Transkrypt
Definicja ♦ ♦ ♦ Jeśli wtedy
Definicja Jeśli wtedy Cel kompresji: zredukowanie do minimum oczekiwanego (średniego) kosztu gdzie li jest długością słowa kodu ci kodującego symbol ai Definicja Definicje Efektywność kodowania określamy jako H Lśr 100% 1 2 Kod jest przedrostkowy, jeśli nie możemy otrzymać żadnego słowa kodu z innego słowa kodu poprzez dodanie do niego zer lub jedynek (tzn. Żadne słowo kodu nie jest przedrostkiem innego słowa kodu) Definicja Twierdzenie Może istnieć wiele takich kodów Ważne twierdzenie – nazywa się nierównością Krafta Przykład. Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję” Jakżeż ja się uspokoję - Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje - Jakżeż ja się uspokoję… Założenia: • Każdy symbol odpowiada jednemu znakowi • Prawdopodobieństwo wystąpienia każdego symbolu jest jednakowo prawdopodobne • Przyjmujemy kod ASCII rozszerzony o „polskie litery”, czyli ISO 8859-2 Przykład. Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję” Jakżeż ja się uspokoję - Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje - Jakżeż ja się uspokoję… Założenia: • Każdy symbol odpowiada jednemu znakowi • Prawdopodobieństwo wystąpienia każdego symbolu jest jednakowo prawdopodobne • Przyjmujemy kod ASCII rozszerzony o „polskie litery”, czyli ISO 8859-2 Przykład. Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję” Jakżeż ja się uspokoję - Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje - Jakżeż ja się uspokoję… Założenia: • Każdy symbol odpowiada jednemu znakowi • Prawdopodobieństwo wystąpienia każdego symbolu jest jednakowo prawdopodobne • Przyjmujemy kod ASCII rozszerzony o „polskie litery”, czyli ISO 8859-2 Model bardziej złożony Przykład. Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję” Jakżeż ja się uspokoję - Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje - Jakżeż ja się uspokoję… Założenia: • Każdy symbol odpowiada jednemu znakowi • Prawdopodobieństwo wystąpienia każdego symbolu jest jednakowo prawdopodobne • Przyjmujemy kod ASCII rozszerzony o „polskie litery”, czyli ISO 8859-2 Model bardziej złożony Model bardziej złożony Dodatkowe koszty Częstość występowania symboli w sekwencji: Rozważmy model wykorzystujący informacje o częstości występowania symboli Przykładowy kod Dodatkowe koszty Definicja Zalety •Bardzo szybkie kodowanie dzięki prostocie konstrukcji kodów i ich regularności •Brak potrzeby przesyłania informacji o budowie kodu do dekodera Wady •Zwykle słaby współczynnik kompresji •Możliwa ekspansja danych jeśli rozkład prawdopodobieństwa występowania symboli nie pasuje do założonego przy konstrukcji kodu Kod unarny Cechy Zastosowania Długość: x bitów Kod binarny Cechy Zastosowania Długość: Definicja Komentarz: Cechy Zastosowania Długość: Definicja Komentarz: Cechy Zastosowania Długość: Liczby Fibonacciego definiuje następująca zależność rekurencyjna: przy czym Każda liczba całkowita dodatnia może być zapisana jako suma różnych liczb Fibonacciego Definicja Przykład Odwrócona reprezentacja Zeckedndofra W trakcie kodowania wygodniejsza jest reprezentacja, w której najmniej znaczący bit znajduje się na początku Przykład Każdą liczbę całkowitą można przedstawić w odwróconej reprezentacji Zeckendorfa w taki sposób, aby nie zawierała dwóch następujących po sobie jedynek. Definicja Komentarz Definicja Komentarz Zalety Wady •Prosta budowa •Nieco trudniejszy w obliczaniu niż wcześniejsze kody •Stosunkowo dobry współczynnik kompresji dla danych, dla których prawdopodobieństwo występowania symboli maleje dla kolejnych symboli alfabetu Definicja Zalety Wady Podstawowe twierdzenie Shannona o kodowaniu bezszumowym Dla bezpamięciowego źródła S o entropii H(S) możliwe jest przypisanie ciągom k symboli źródła, słów kodu przedrostkowego tak, że spełnione jest H( S ) ≤ L k / k < H( S ) + 1 / k asymptotycznie, możliwe jest uzyskanie średniej długości kodu (w przeliczeniu na pojedynczy symbol) równej entropii źródła optymalna długość słowa kodowego dla symbolu o prawdopodobieństwie p równa jest –log (p) (czyli autoinformacji dla tego symbolu) można zbudować koder entropijny o efektywności bliskiej 100% Jak wygenerować kod przedrostkowy? Problem: ◦ Mamy wyznaczony przez model rozkład prawdopodobieństwa symboli źródła p1, p2, p3, p4 ... pN, : ∑pi = 1 ◦ Znamy optymalne długości słów kodowych (tj. przybliżone długości słów optymalnego kodu przedrostkowego) l1, l2, l3, l4 ... lN : li = –log (pi) ◦ Wiemy jaki warunek muszą spełniać długości słów kodowych aby istniał kod jednoznacznie dekodowalny (nierówność Krafta) ∑2-l ≤ 1 Chcemy wyznaczyć ◦ Kod przedrostkowy o minimalnej średniej długości kodu szukamy: dokładnych długości słów szukamy: postaci (kolejnych bitów) słów i Algorytm Shannona-Fano generuje kod przedrostkowy dla zadanego rozkładu prawdopodobieństwa symboli alfabetu. Krok 1: Ustaw symbole alfabetu źródła w ciąg s uporządkowane zgodnie z prawdopodobieństwem ich użycia; Krok 2: AlgorytmShannonaFano(ciąg s) if (s zawiera dwa symbole) dołącz 0 do słowa kodowego jednego z symboli, 1 do słowa drugiego symbolu; elseif (s zawiera więcej niż dwa symbole) podziel s na dwa podciągi s1 i s2 tak, by różnica między sumą prawdopodobieństw symboli w podciągach była najmniejsza; dołącz 0 do słów kodowych symboli w s1 i 1 do słów symboli w s2; AlgorytmShannonaFano(s1); AlgorytmShannonaFano(s2); endif; Przykład: kodujemy ciąg abracadabra W tabeli mamy ciąg symboli alfabetu źródła i kolejne kroki budowania słów kodowych ciąg s częstość symbolu ciąg s1 i s2 słowo symbolu ciąg s111 i s112 słowo symbolu d r b a 1/11 1/11 2/11 2/11 5/11 c d r b a 0 ciąg s11 i s12 słowo symbolu c 0 c 00 0 d 00 c 000 0 r 01 1 b 01 d 001 ciąg s121 i s122 r słowo symbolu 010 011 010 011 wynik 000 001 b 1 Przykład: kodujemy ciąg abracadabra Można wygenerować kod o innych długościach słów ciąg s częstość symbolu ciąg s1 i s2 słowo symbolu ciąg s111 i s112 słowo symbolu ciąg s1111 i s1112 d r b a 1/11 1/11 2/11 2/11 5/11 c d r b a 0 ciąg s11 i s12 słowo symbolu c 0 c 00 0 d 00 c 000 c 0 r 00 d 000 1 b 01 r 001 d słowo symbolu 0000 0001 wynik 0000 0001 001 01 1 Algorytm Huffmana generuje kod przedrostkowy dla zadanego rozkładu prawdopodobieństwa symboli alfabetu 1. 2. 3. 4. W algorytmie Huffmana buduje się drzewo binarne, zwane drzewem Huffmana. Każdemu z liści odpowiada pojedynczy symbol alfabetu źródła. Z każdym węzłem skojarzona jest waga równa łącznemu prawdopodobieństwu liści w poddrzewie dla którego ten węzeł jest korzeniem Utwórz n drzew, gdzie n jest rozmiarem alfabetu źródła. Każdemu z symboli alfabetu źródła odpowiada pojedyncze drzewo składające się wyłącznie z korzenia i mające wagę równą prawdopodobieństwu wystąpienia danego symbolu. Wyznacz dwa drzewa o najmniejszych wagach i utwórz z nich nowe drzewo, w którym dwa właśnie wyznaczone drzewa te są synami korzenia o wadze równej sumie ich wag. Powtarzaj krok 2 aż pozostanie tylko jedno drzewo (n – 1 razy). Słowo kodowe kodu Huffmana dla danego symbolu znajduje się przechodząc ścieżką od korzenia drzewa Huffmana do liścia odpowiadającego temu symbolowi (i-ty bit słowa kodowego ma wartość 0, jeżeli i-ta krawędź ścieżki prowadzi do lewego syna i-tego węzła, a 1 — jeżeli do prawego). Przykład: kodujemy ciąg abracadabra 2. Wyznacz dwa drzewa o najmniejszych wagach i utwórz z nich nowe drzewo, w którym dwa właśnie wyznaczone drzewa te są synami korzenia o wadze równej sumie ich wag. Powtarzaj krok 2 aż pozostanie tylko jedno drzewo (n – 1 razy). 4/11 0 1 2/11 0 1 5/11 2/11 1/11 1/11 2/11 a b c d r Przykład: kodujemy ciąg abracadabra 2. Wyznacz dwa drzewa o najmniejszych wagach i utwórz z nich nowe drzewo, w którym dwa właśnie wyznaczone drzewa te są synami korzenia o wadze równej sumie ich wag. 1 Powtarzaj krok 2 aż 0 1 pozostanie tylko jedno drzewo (n – 1 razy). 6/11 0 1 4/11 0 1 2/11 0 1 5/11 2/11 1/11 1/11 2/11 a b c d r 3. Słowo kodowe kodu Huffmana dla danego symbolu znajduje się przechodząc ścieżką od korzenia drzewa Huffmana do liścia odpowiadającego temu symbolowi (i-ty bit słowa kodowego ma wartość 0, jeżeli i-ta krawędź ścieżki prowadzi do lewego syna i-tego węzła, a 1 — jeżeli do prawego). 1 0 1 6/11 0 1 4/11 0 1 symbol 2/11 0 1 słowo kodowe a 0 b 100 c 1010 5/11 2/11 1/11 1/11 2/11 d 1011 a b c d r r 11 Własności kodów Huffmana Podobnie, jak algorytm Shannona-Fano, przedstawiony algorytm jest niedeterministyczny niedeterminizm można łatwo usunąć – kanoniczne kodowanie Huffmana Efektywnośc kodów Huffmana jest typowo nieznacznie większa niż Shannona-Fano (dla przykładu „abracadabra” jest taka sama) algorytm Huffmana jest prostszy symbol Shannon-Fano (1) Shannon-Fano (2) Huffman a 1 1 0 b 011 01 100 c 000 0000 1010 d 001 0001 1011 r 010 001 11 Zalety o prosty o szybki Wady o nieefektywny, gdy prawdopodobieństwo wystąpienia jednego z symboli alfabetu źródła jest duże (ale można kodować ciągi symboli) o dwuprzebiegowy (koszt transmisji modelu może być duży, nie do zastosowania wprost do kodowania on-line) Użycie algorytmu Huffmana w adaptacyjnym modelu jest możliwe Metoda brute-force – każdorazowo po zakodowniu symbolu buduj od nowa drzewo Huffmana ( Uwaga na Zero Frequency Problem ) ... ale w praktyce zbyt kosztowne Ale mamy algorytm generujący kod zbliżony do kodu Huffmana, nadający się do zastosowania w algorytmie adaptacyjnym. Drzewo Huffmana budowane jest przyrostowo – możliwa jest „aktualizacja modelu” •został wynaleziony niezależnie przez Fallera i Gallagera • udoskonalony przez Cormacka i Horspoola oraz (niezależnie) przez Knutha • następnie udoskonalony przez Vittera Na czym polega? Budujemy przyrostowo drzewo binarne, którego węzły zawierają liczniki częstości, a liście są dodatkowo skojarzone z symbolami alfabetu źródła Drzewo ma własność rodzeństwa, gdy: 1. każdy węzeł nie będący liściem ma 2 potomków; 2. przechodząc węzły w kolejności z góry do dołu, a na danym poziomie od prawej do lewej, otrzymamy ciąg węzłów o nierosnących licznikach. Drzewo mające własność rodzeństwa jest drzewem Huffmana (tw. FalleraGallagera) Przykład: drzewo mające własność rodzeństwa 11 6 5 a 2 4 r 2 2 b 1 1 c d Budowane drzewo zawiera liść (0-węzeł) reprezentujący wszystkie symbole, które jeszcze nie wystąpiły w kodowanym ciągu Kodowanie rozpoczynamy od drzewa składającego się wyłącznie z 0- węzła Używamy pomocniczej struktury węzły, listy dwukierunkowej zawierającej węzły drzewa uporządkowane w kolejności przeglądania drzewa z góry do dołu, a na danym poziomie od prawej do lewej Podlistę listy węzły składającą się z wszystkich węzłów o wartości licznika i nazywamy blokiem-i , a pierwszy węzeł takiego bloku liderem DynamiczneKodowanieHuffmanaFGK(symbol s) p = liść zawierający symbol s; wyprowadź słowo kodowe dla s (*); if p jest 0-węzłem utwórz nowy węzeł q dla symolu s; q.licznik = 1; p = nowy węzeł w miejscu 0-węzła będący rodzicem 0-węzła i węzła q; p.licznik = 1; else p.licznik++; endif while p nie jest korzeniem if p narusza własność rodzeństwa if lider bloku-i zawierającego p nie jest rodzicem p zamień p z liderem; endif endif p = rodzic(p); p.licznik++; endwhile a p r b 0 1 1 2 p 0 1 1 q 1 1 a 1 a 0 1 q b Przykład: kodujemy ciąg abrr, wstawienie symbolu b a 0 1 b r 2 2 2 p 1 a 0 2 1 2 1 1 a p 1 a 1 1 b 1 1 b 0 1 b 0 r wstawienie symbolu r (przywróć własność rodzeństwa) 1 r r 2 3 2 p p 2 1 1 a a 1 1 1 r wstawienie symbolu r 2 a 1 1 1 1 b 0 1 2 b b 0 1 r 0 1 r r 3 1 3 1 2 a 3 a 1 1 b 1 r 2 a 1 1 0 1 2 1 1 b 0 2 p r b 0 2 p r ponowne wstawienie symbolu r (przywróć własność rodzeństwa) 3 4 p 1 2 2 a 2 r 1 1 1 1 b 0 2 p r b 0 1 a ponowne wstawienie symbolu r (przywróć własność rodzeństwa) 4 2 2 r 1 1 b 0 1 a postać drzewa po przetworzeniu ciągu abrr Dodatkowe założenie: w bloku-i węzłów najpierw znajdują się węzły wewnętrzne, później liście minimalizujemy głębokość drzewa bardziej złożone staje się przywracanie własności rodzeństwa ciąg o długości s zakodujemy na nie więcej niż h+s bitach, gdzie h to liczba bitów dla kodowania statycznego Huffmana Algorytm adaptacyjny można zbudować z kilku stałych modeli Ale po kolei ... ◦ ◦ ◦ ◦ Zmodyfikowane kody binarne Rodzina kodów Golomba Rodzina kodów Golomba-Rice’a Model danych dla parametrycznej rodziny kodów (model algorytmu FELICS) Prefiksowy kod dla skończonego alfabetu, np. dla liczb 0 .. j-1 ◦ słowa kodowe o długości log(j) lub log (j) bitów, gdzie j to rozmiar alfabetu ◦ właściwie to rodzina kodów Symbol (długość słowa kodowego kodu binarnego dla alfabetu j symboli to log(j) ) Alfabet 0 .. 4 0 .. 5 0 .. 6 0 .. 7 0 .00 .00 .00 .000 1 .01 .01 .010 .001 2 .10 .100 .011 .010 3 .110 .101 .100 .011 4 .111 .110 .101 .100 .111 .110 .101 .111 .110 5 6 7 .111 Generowanie słowa kodowego kodujemy liczbę i zmodyfikowanym kodem binarnym dla liczb 0 .. j – 1, przyjmijmy N = log(j) i n = 2 N jeżeli i < n – j zakoduj i za pomocą N – 1 -bitowego kodu binarnego else zakoduj i + n – j za pomocą N -bitowego kodu binarnego Własności zmodyfikowanego kodu binarnego ◦ długość słowa kodowego: log(j) lub log (j) ◦ dla j = 2 N kod staje się N -bitowym kodem binarnym ◦ liczba dłuższych słów kodowych jest zawsze parzysta ◦ parametryczna rodzina kodów przeznaczona do kodowania nieujemnych liczb całkowitych nieskończona parametrem kodu jest całkowite m, m > 0 ◦ zawiera kody optymalne dla wykładniczego rozkładu prawdopodobieństwa symboli (dla niektórych parametrów rozkładu) (nadaje się do źródeł o rozkładzie nierosnącym) ◦ słowa kodowe łatwe w generacji i dekodowaniu Generowanie słowa kodowego kodujemy liczbę x kodem Golomba z parametrem m prefiks słowa: x/ m zakodowane unarnie (kod α Eliasa) sufiks słowa: x mod m zakodowane zmodyfikowanym kodem binarnym dla przedziału [0, m – 1] np. 8 kodem Golomba z parametrem 3 8/3 = 2 110 8 mod 3 = 2 11 Jest to szczególny przypadek kodu Golomba zauważony już przez Golomba i niezależnie od niego odkryty przez Rice’a. Kody Golomba są szczególnie proste, gdy m = 2 k kodujemy liczbę x kodem Golomba-Rice’a z parametrem k prefiks słowa: x/ 2 k sufiks słowa: x mod 2 k zakodowane unarnie (kod α Eliasa) x >> k zakodowane zmodyfikowanym kodem binarnym dla przedziału [0, m – 1] k najmniej znaczących bitów x Dla skończonego alfabetu używamy tylko części nieskończonej rodziny. Przyjmijmy rozmiar alfabetu 2 N • dla rodziny Golomba kody o m > 2 N-1 mają słowa kodowe wszystkich symboli alfabetu dłuższe od kodu o m = 2 N-1 • dla kodów GolombaRice’a kody o k > N – 1 mają słowa wszystkich symboli alfabetu dłuższe od kodu o k = N – 1 • sensowne jest używanie początkowych 2 N-1 kodów • sensowne jest używanie początkowych N kodów (k = 0 .. N – 1 ) Rodziny Golomba-Rice’a można użyć do kodowania ciągów symboli o wykładniczym rozkładzie prawdopodobieństwa. (rozkład często spotykany w kompresji obrazów, dźwięków ... ) Jeżeli parametr rozkładu jest nieznany, lub zmienia się w trakcie pracy źródła to parametr kodu Golomba-Rice’a trzeba dobierać adaptacyjnie. Jak to zrobić? Wybierajmy ten kod, który jest najlepszy dla już przetworzonych symboli Jak to zrobić? Algorytm modelowania zastosowany przez Howarda i Vittera w algorytmie bezstratnej kompresji obrazów FELICS. Idea Dla każdego kodu z rodziny utrzymuj licznik (tablica liczników) ◦ licznik liczby bitów, którą by uzyskano, kodując dotychczas przetworzoną część ciągu tym kodem. Po zakodowaniu symbolu zwiększ licznik każdego z kodów o długość słowa kodowego właśnie zakodowanego symbolu w kodzie odpowiadającym licznikowi Do kodowania symbolu użyj kodu o najmniejszym liczniku ◦ Udoskonalenie: okresowo, gdy wartość najmniejszego z liczników przekroczy pewien próg, podziel wszystkie liczniki przez 2 unikniemy przepełnienia zwiększymy znaczenie symboli kodowanych niedawno ◦ Ww. metoda to tylko część całego algorytmu (i tylko część modelu) ◦ Metoda z FELICS nadaje się do każdej rodziny ◦ Jeszcze prostsza metoda istnieje dla rodziny Golomba-Rice’a zastosowana przez Weinberger, Seroussi, Sapiro w algorytmie LOCO(JPEG-LS) niezależnie od rozmiaru alfabetu mamy 2 liczniki (licznik zakodowanych symboli i licznik sumy wartości tych symboli) Warto się zapoznać Idea kodowania arytmetycznego Koncepcja implementacji dla liczb o ograniczonej precyzji Wybrane algorytmy ◦ MQ-Coder ◦ Range-Coder ◦ Szybki model dla kodera arytmetycznego