Kody Marek Śmieja Teoria informacji 1 / 35
Entropia Entropia określa minimalną statystyczną długość kodowania (przyjmijmy dla prostoty że alfabet kodowy A = {0, 1}). Definicja Niech X = {x 1,..., x n } będzie dyskretną przestrzenią probabilistyczną, gdzie p i = p(x i ) jest prawdopodobieństwem otrzymania x i. Wtedy entropia X (rozkładu p 1,..., p n na X ) wyraża się wzorem: h(x ) = h(p 1,..., p n ) = i p i ( log 2 p i ). Będziemy pisać zamiennie h(zbiór) = h(rozkład pr.) = h(zmienna los) 2 / 35
Informacja Definicja Ilość informacji zawarta w elemencie x jest równa i(x) := log p(x). Jednostką informacji jest bit, jeśli rozważamy logarytm o podstawie 2. Ilość informacji jest równa ilości bitów potrzebnych do jej zapisania. Jeśli x i y są niezależne, to mamy addytywność informacji: i(xy) = log p(xy) = log p(x)p(y) log p(x) log p(y) = i(x) + i(y). Entropia to średnia ilość informacji zawarta w zbiorze danych. Im entropia większa tym większa jest niepewność co do danych. 3 / 35
Szacowanie z dołu Wniosek Jeśli źródło jest bez pamięci, tzn. aktualnie generowany symbol nie zależy od poprzednich, to statystyczna długość dowolnego prefiksowego kodu nie może być niższa niż entropia źródła: L h(x ) Wynika to z procedury minimalizacyjnej Ciekawsze jest, że można pokazać również oszacowanie na długość kodu z góry Jeśli występują zależności pomiędzy symbolami, to można zbudować efektywniejszy kod (kodowanie kilu symbnoli na raz) Wówczas można dokonać preprocessingu danych w ich uproszczenia i likwidacji zależności 4 / 35
Górne oszacowanie Weźmy kodowanie o długościach l i = log n p i. Z tw. Krafta można zbudować kod realizujący te długości. Wtedy: h(p 1,..., p n ) = i p i ( log 2 p i ) i p i l i i p i ( log 2 p i + 1) = i p i ( log 2 p i ) + i p i = h(p 1,..., p n ) + 1 Wniosek Można zbudować prefiksowy kod binarny na X, którego długość kodu spełnia: h(x ) L < h(x ) + 1 5 / 35
Rozkład dwupunktowy X = {x, y}, z rozkładem p(x) = p, p(y) = 1 p. max h(p, 1 p) = log 2 = 1 dla p = 1 2. Aby przesłać jeden symbol potrzebujemy średnio 1 bit 6 / 35
Wnioski W ogólności jednostajny rozkład maksymalizuje entropię (niepewność) dowód trudniejszy Dla n-elementowego źródła S, mamy h(s) log 2 n Jeśli jeden symbol jest bardziej prawdopodobny od drugiego to tą długość można zmniejszyć 7 / 35
Kodowanie Shannona Kodowanie, w którym długość kodu każdego symbolu x k wynosi l k = log 2 p k. Nie jest optymalne, bo kodowanie Huffmana daje niższą średnią długość Długość kodu każdego symbolu znana, co pozwala na jego użycie w wielu własnościach i przykładach 8 / 35
Algorytm Ustawiamy symbole x i według malejących prawdopodobieństw p i. Innymi słowy zakładamy, że p 1... p m. Jako długość kodu x i bierzemy l i = log 2 p i Aby poznać jawny wzór na kod definiujemy prawd. kumulatywne: P k = i<k p i Zauważmy, że P k < 1. Jako kod Q k dla x k bierzemy pierwsze l k cyfr po przecinku z rozwinięcia binarnego liczby P k Pamiętamy słowinik kodów w nagłówku Kody różnych symboli są różne (ćwiczenie) 9 / 35
Przykład S = {a, b, c, d}, P = {0.45, 0.3, 0.2, 0.05} l a = log 0.45 = 2, l b = 2, l c = 3, l d = 5 P a = 0, P b = 0.45, P c = 0.75, P d = 0.95 a = 0.00000, b = 0.01110, c = 0.11000, d = 0.11110 a = 00, b = 01, c = 110, d = 11110 Efektywność = (entropia źródła) / (średnia długość kodu) =... 10 / 35
Własności Kodowanie Shannona jest prefiksowe - ćwiczenie Średnia długość kodu szacuje się przez: p i log 2 p i p i ( log 2 p i ) + 1 = h(x ) + 1 i i 11 / 35
Optymalność Kodowanie Shannona nie jest optymalne biorąc pod uwagę średnią długość kodu, ale jest bardzo dobre biorąc pod uwagę długość kodu każdego symbolu z osobna. Optymalność poszczególnych kodów Nich l(x) będzie długością kodu symbolu x w kodowaniu Shannona, a l (x) będzie długością kodu x w innym kodowaniu prefiksowym. Wtedy: P(l(X ) l (X ) + c) 1 2 c 1, dla c N 1, gdzie X to zmienna losowa oznaczająca symbol. Dla przykładu prawdopodobieństwo, że l (X ) jest co najmniej 5 bitów 1 krótsze niż l(x ) jest nie większe niż 2 = 1 5 1 16. 12 / 35
Dowód P(l(X ) l (X ) + c) = P( log p(x ) l (X ) + c) P( log p(x ) l (X ) + c 1) = P(p(X ) 2 l (X ) c+1 ) = x:p(x) 2 l (x) c+1 p(x) x:p(x) 2 l (x) c+1 2 l (x) (c 1) x 2 l (x) 2 (c 1) 2 (c 1). Ostatnia nierówność wynika z nierówności Krafta 13 / 35
Kodowanie Huffmana Optymalna technika kodowania prefiksowego dla zadanego rozkładu (mierzona średnią długością kodu) Obecnie podstawa wielu kompresorów np. bzip2, jpeg. Opiera się na konstrukcji drzewa (binarnego), w którym liście reprezentują symbole a ścieżka od korzenia do liści to ich kody 14 / 35
Algorytm Kody dwóch najrzadziej występujących symboli różnią się tylko na ostatniej pozycji. Algorytm rekurencyjny: Rozważ dwa najrzadziej występujące symbole rozróżniając je na końcu przez 0 i 1. Połącz oba w jeden symbol pomocniczy (kumulując ich prawdopodobieństwa) i rozważ teraz rekurencyjnie mniejszy alfabet Powtarzaj aż zostanie tylko jeden symbol 15 / 35
Przykład S = {a, b, c, d}, P = {0.45, 0.3, 0.2, 0.05} - zobaczyć 16 / 35
Własności optymalnych kodów Cechy kodowania optymalnego: jeśli p i > p j, to l i l j D: Gdyby nie zachodziło, to zamieniamy kod x i z kodem x j zmniejszając oczekiwaną długość dwa najdłuższe słowa kodowe mają równą długość D: W przeciwnym razie można by skrócić dłuższy z nich do długości krótszego (kod prefiksowe: żadne nie jest przedrostkiem innego) dla dowolnego najdłuższego słowa kodowego istnieje inne słowo o tej samej długości które różni się tylko na ostatnim bicie D: Inaczej, można by ściąć ostatni bit i ciągle mielibyśmy kod przedrostkowy Huffman spełnia te warunki (można pokazać, że to on jest takim optymalnym kodem, Cover, str 123) 17 / 35
Własności kodu Huffmana Kodowanie Huffmana nie jest jednoznaczne Nie mniej jednak, wartość oczekiwana kodu nie zależy od sposobu konstrukcji kodu Huffmana Można zastosować do innego alfabetu niż binarny: zamiast 2 symboli łączymy ze sobą n symboli Można kodować bloki symboli zamiast pojedynczych symboli Ćwiczenie: czy jest prawdą, że w kodowaniu Huffmana długość każdego symbolu jest nie większa niż log 2 p k? 18 / 35
Możliwie krótki kod Wiemy, że można zbudować kod na X, którego statystyczna długość L spełnia: h(x ) L < h(x ) + 1. Pytanie: czy można pokazać lepsze oszacowanie i zbliżyć się bardziej do entropii? Tak, ale trzeba budować kody na X k = X... X. Innymi słowy, zamiast kodować litery kodujemy słowa (albo dłuższe ciągi liter). 19 / 35
Entropia dwuwymiarowa Niech X = {x i }, Y = {y i } będą dyskretnymi przestrzeniami prob. z roskładami p = {p i }, q = {q i }, odpowiednio. Rozkład na X Y definiujemy jako p(x i, y j ) = p i q j, czyli zakładamy, że p i q są niezależne. Twierdzenie Mamy h(x Y ) = h(x ) + h(y ) Dowód: h(x Y ) = i p i q j log(p i q j ) j = i p i log p i j q j log q j = h(x ) + h(y ) 20 / 35
Entropia n-wymiarowa Rozumując przez indukcję można pokazać, że h(x 1... X k ) = h(x 1 ) +... + h(x k ) Bez założenia niezależności można pokazać nierówność. Czyli lepiej kodować dłuższe bloki od pojedynczych symboli 21 / 35
Kodowanie długich ciągów Shannon noiseless coding theorem Dla źródła bez pamięci można zbliżyć się dowolnie blisko entropii tzn. dla każdego n N istnieje kodowanie na X n takie, że średnia ilość bitów L 1 przypadających na element X spełnia: L 1 h(x ) + 1 n 22 / 35
Dowód Kodujemy słowa n-elementowe, czyli elementy X n Na podstawie poprzedniego twierdzenia entropia X n wynosi: h(x n ) = nh(x ). Zatem istnieje kodowanie na X n, którego długość L n spełnia: L n h(x n ) + 1 = nh(x ) + 1. Stąd, na jeden element z X będziemy potrzebowali (bo policzyliśmy ilość bitów na n-elementow ciąg). nh(x )+1 n Ostatecznie średnia długość kodu elementu z X spełnia: bitów L 1 h(x ) + 1 n. 23 / 35
Koszt kodowania a długość kodu Można byłoby sądzić, że warto kodować jak najdłuższe ciągi znaków, ale... Ilość możliwych n-elementowych ciągów ze zbioru m-elementowego wynosi m n, czyli słownik kodów rośnie m n 1 -razy Zatem zwiększamy znacząco pamięć potrzebną na pamiętanie słownika Ponadto, odkodowywanie jest wolne, bo trzeba przeszukiwać większy słownik Pomysł: można kodować wybrane długie ciągi np. te najczęściej występujące. 24 / 35
Kodowanie arytmetyczne Kodowanie Huffmana jest optymalne dla zapisu pojedynczych symboli, ale i tak traci się nawet do 1 bita w stosunku do entropii Jak widzieliśmy kodując większe fragmenty danych można zbliżyć się do entropii, kosztem złożoności pamięciowej i czasowej Kodowanie arytmetyczne koduje również bloki kodu (cały tekst) na raz, ale złożoność jest wyższa Idea polega na przypisaniu do tekstu liczby z przedziału [0, 1), która jednoznacznie identyfikuje tekst. 25 / 35
Idea Dla prawdopodobieństw symboli p 1,..., p m definiujemy prawdopodobieństwo skumulowane: P k = i<k p i. Czytając ciąg symboli będziemy tworzyć ciąg zstępujących podprzedziałów [0, 1). Jako kod przyjmiemy liczbę n stanowiącą długość tekstu oraz liczbę z (znacznik), czyli liczbę z utworzonego przedziału 26 / 35
Kodowanie Niech I 0 = [b 0, e 0 ) = [0, 1) oraz niech dany będzie tekst x Bierzemy pierwszą literę x k x która ma prawdopodobieństwo p k. Wtedy tworzymy: I 1 = [b 1, e 1 ) = b 0 + I 0 [P k, P k+1 ), gdzie I oznacza długość przedziału. Bierzemy następną literę x s, która wypada z prawdopodobieństwem p s. Tworzymy: I 2 = b 1 + I 1 [P l, P l+1 ). Po przeczytaniu m symboli otrzymamy przedział I n = [b n, e n ) [0, 1). 27 / 35
Własności Dla rożnych wiadomości tej samej długości otrzymujemy parami rozłączne przedziały. Natomiast jeśli jedna wiadomość jest prefiksem drugiej to odpowiednie przedziały zawierają się w sobie Zatem, ciąg jest jednoznacznie identyfikowany przez dowolną liczbę z I n (znacznik) oraz długość wiadomości n. Co więcej, długość przedziału kodującego jest równa prawdopodobieństwu odpowiadającego ciągu symboli. 28 / 35
Weźmy alfabet a, b, c z prawdopodobieństwami 0.7, 0.1, 0.2. Zakodujmy tekst abc. Na początku mamy przedział I 0 = [0, 1) oraz P 1 = 0, P 2 = 0.7, P 3 = 0.8, P 4 = 1. Bierzemy a i kodujemy za pomocą I 1 = [0, 0.7) Bierzemy b i kodujemy za pomocą I 2 = 0 + 0.7 [0.7, 0.8) = [0.49, 0.56) Bierzemy c i kodujemy za pomocą I 3 = 0.49 + 0.07 [0.8, 1) = [0.546, 0.56) Jako znacznik możemy przyjąć średnią I 3, tj. z = 0.553 oraz n = 3. 29 / 35
Dekodowanie Niech I 0 = [b 0, e 0 ) = [0, 1) oraz niech dany będzie znacznik z oraz długość n. Rozważamy przedziały postaci I i 1 = b 0 + I 0 [P i, P i+1 ) oraz wybieramy taki, który spełnia z I k 1. Odkodowujemy x k oraz definiujemy I 1 := I k 1 Ponownie rozważamy przedziały I i 2 = b 1 + I 1 [P i, P i+1 ) oraz wybieramy taki, który spełnia z I l 2. Odkodowujemy x l oraz definiujemy I 2 := I l 2 Kończymy gdy odkodowaliśmy n symboli. 30 / 35
Przykład Weźmy alfabet a, b, c z prawdopodobieństwami 0.7, 0.1, 0.2. Wtedy P 1 = 0, P 2 = 0.7, P 3 = 0.8, P 4 = 1. Niech z = 0.55, n = 3. Na początku I 0 = [b 0, e 0 ) = [0, 1) oraz rozważamy trzy przedziały 0 + 1 [P k, P k+1 ). Mamy z = 0.55 [0, 0.7) = 0 + 1 [0, 0.7). Zatem odkodowujemy a oraz kładziemy I 1 = [b 1, e 1 ) = [0, 0.7). Następnie z = 0.55 [0.49, 0.56) = 0 + 0.7 [0.7, 0.8). Zatem odkodowujemy b oraz kładziemy I 2 = [b 2, b 3 ) = [0.49, 0.56) Ostatecznie z = 0.55 [0.546, 0.56) = 0.49 + 0.07 [0.8, 1). Zatem odkodowujemy c. Jako że n = 3, to kończymy wypisując abc. 31 / 35
Reprezentacja znacznika Zakodowaliśmy n symboli i pytamy jak teraz zakodować znacznik z I n = [b n, e n )? Ponieważ długość I n wynosi e n b n, to istnieje w [b n, e n ) liczba, której ilość niezerowych cyfr po przecinku w rozwinięciu binarnym jest nie większa niż log 2 (e n b n ). Ćwiczenie: Proszę to sprawdzić. Zatem podajemy rozwinięcie binarne po przecinku dowolnego z I n długości log 2 (e n b n ) + 1, co gwarantuje jednoznaczność odkodowania n symboli. 32 / 35
Przykład Weźmy alfabet a, b, c z prawdopodobieństwami 0.7, 0.1, 0.2. Kod dla tekstu abc to np. 0.553 = (0.100011011) 2. Mamy, P(abc) = 0.014 Zatem bierzemy log 2 0.014 + 1 = 8 bitów po przecinku, czyli 10001101. 33 / 35
Długość kodu Pamiętamy, że kodując ciągi długości n za pomocą kodów Huffmana dostajemy oszacowanie na średnią długość kodu jednego symbolu: h(x ) L H h(x ) + 1 n Ćwiczenie: Średnia długość kodu symbolu Dla kodowania arytmetycznego średnia długość L A kodu jednego symbolu spełnia L A h(x ) + 2 n Wniosek: Dla kompresji długich ciągów kodowanie arytmetyczne może być efektywniejsze niż kodowanie Huffmana. 34 / 35
Inne kodowania Kodowanie Huffmana traci do 1 bita na entropię Kodowanie arytmetyczne jest wolne Są inne schematy kodowania, które starają się minimalizować powyższe wady np. kodowanie ułamkowe/asymetryczne) (Jarek Duda) 35 / 35