kodowanie arytmetyczne
Transkrypt
kodowanie arytmetyczne
Podstawy i własności Implementacja Kodowanie informacji Tomasz Jurdziński Wykład 4: kodowanie arytmetyczne Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Motywacja Motywacje 1 2 średnia długość kodu Huffmana może odbiegać o pmax + 0.086 od entropii, gdzie pmax = maxi =1,...,n {pi } - może to powodować duże odchylenia od wartości entropii efekt ten można zniwelować poprzez zastosowanie kodów Huffmana, w którym alfabet stanowia˛ ciagi ˛ symboli określonej długości - ale wtedy rośnie gwałtownie rozmiar alfabetu. Kodowanie arytmetyczne: zastosowanie podejścia z punktu 2. bez konieczności tworzenia słów kodowych dla wszystkich ciagów ˛ symboli. Uogólnienie kodowania Shannona. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Ogólnie Pierwsze spojrzenie tekst zostaje odwzorowany na liczbe˛ z przedziału [0, 1) nazywana˛ ZNACZNIKiem. zakodowana˛ postać tekstu tworzy ZNACZNIK, reprezentowany z odpowiednio dobrana˛ dokładnościa˛ oraz n - długość kodowanego tekstu. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Jedna litera Znacznik dla jednej litery alfabetu: elementy alfabetu numerujemy a1 , a2 , . . . , an ; oznaczmy ich prawdopodobieństwa przez p1 , p2 , . . . , pn ; literze ai przyporzadkowujemy ˛ dowolna˛ liczbe˛ z przedziału [F (i), F (i + 1)), gdzie F (i) = ∑i−1 j =1 pi Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Znacznik dla ciagu ˛ Kodowanie ciagu ˛ x1 . . . xn nad alfabetem a1 , . . . , am : 1 z = [0, 1); l = 0; p = 1; 2 Dla i = 1, 2, . . . , n: 1 2 3 3 niech xi = aj l = l + F (j)(p − l) p = l + F (j + 1)(p − l) znacznik = (l + p)/2 (lub dowolna liczba z przedziału [l, p)) Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Przykład P(a) = 0.7, P(b) = 0.1, P(c) = 0.2. Kodujemy tekst abc. Tekst a b c Lewy 0 0 0.49 0.546 Jurdziński Prawy 1 0.7 0.56 0.560 Znacznik 0.5 0.35 0.53 0.553 Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Jednoznaczność Lemat Dla ustalonej długości tekstu n, każdy ciag ˛ jest odwzorowany na przedział rozłaczny ˛ z przedziałami odpowiadajacymi ˛ innym ciagom. ˛ Gwarantuje to jednoznaczność kodowania. Dowód Indukcja ze wzgledu ˛ na długość kodowanego tekstu. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Dekodowanie Dekodowanie ciagu ˛ o długości n ze znacznika z: 1 l = 0; p = 1; 2 Dla i = 1, 2, . . . , n: 1 2 3 4 3 wybierz j takie, że l + F (j)(p − l) ≤ z < l + F (j + 1)(p − l) przyjmij, że xi = aj l = l + F (j)(p − l); p = l + F (j + 1)(p − l). Ciag ˛ oryginalny to x1 . . . xn . Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Przykład Niech z = 0.55 dla P(a) = 0.7, P(b) = 0.1, P(c) = 0.2 i n = 3. Tekst a b c Lewy 0 0 0.49 0.546 Jurdziński Prawy 1 0.7 0.56 0.560 Znacznik Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Własności kodowania arytmetycznego 1 2 Wygenerowanie znacznika dla konkretnego ciagu ˛ nie wymaga wyznaczania badź ˛ pamietania ˛ znaczników innych ciagów ˛ Problem! Komputerowa reprezentacja znacznika może wymagać dużej pamieci ˛ - jak dobrać wartość znacznika aby zminimalizować potrzebna˛ pamieć? ˛ Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Długość znacznika Twierdzenie Niech x = x1 . . . xn bedzie ˛ ciagiem ˛ danych o prawdopodobieństwie wystapienia ˛ P(x) = ∏ni=1 P(xi ). Zaokraglenie ˛ z 0 znacznika z dla ciagu ˛ x do m(x) = dlog 1/P(x)e + 1 bitów (polegajace ˛ na usunieciu ˛ dalszych bitów) gwarantuje jednoznaczność kodowania. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Dowód Oznaczenia: z = (l + p)/2 - znacznik; z 0 - zaokraglenie ˛ do m = m(x) bitów. Wystarczy pokazać, że l ≤ z0 < p dla l i p wyznaczonych przy omawianiu algorytmu. Jest to równoważne warunkowi: |z − z 0 | < (p − l)/2. Zauważmy, że z 0 ≤ z < p oraz 0 <= z − z 0 < 2m . Pozostaje lewy koniec przedziału... Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Dowód c.d. Zauważmy: z 0 ≤ z < p; p − l = P(x) (dla ciagów ˛ jednoliterowych z definicji, dla dłuższych dowód indukcyjny) z(x) − l = P(x)/2, z 0 (x) > z(x) − 1/2m(x ) ≥ z(x) − 1/2log(1/P (x ))+1 > z(x) − 1/(2 ∗ 1/P(x)) = z(x) − P(x)/2 = (p + l)/2 − (p − l)/2 = l. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Jednoznaczność kodowania z zaokragleniem ˛ Ostatecznie, jednoznaczność wynika z: rozłaczności ˛ przedziałów. 0 faktu, że z należy do przedziału odpowiadajacego ˛ danemu tekstowi. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Kod prefiksowy Twierdzenie Kod arytmetyczny jest (dla ustalonej długości kodowanego tekstu) przy zaokraglaniu ˛ do dlog 1/P(x)e + 1 bitów jest kodem prefiksowym. Dowód Wynika z nastepuj ˛ acych ˛ faktów: przybliżenie z 0 znacznika z do dlog 1/P(x)e + 1 bitów znajduje sie˛ w przedziale przypisanym ciagowi ˛ x, przedziały różnych ciagów ˛ sa˛ rozłaczne. ˛ 0 każde słowo (liczba) o prefiksie z też mieści sie˛ w przedziale przypisanym ciagowi ˛ x. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Przykład Znacznik dla P(a)=0.7, P(b)=0.1, P(c)=0.2 i tekstu abc to 0.553, binarnie 0.100011011. Liczba “potrzebnych” bitów to d(log 1/0.014)e + 1 = 8. Czyli zakodowana postać tekstu to 10001101. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Liczby rzeczywiste Kod arytmetyczny a entropia Kod a entropia Średnia liczba bitów na jeden symbol kodu arytmetycznego (z zaokragleniem) ˛ dla ciagów ˛ o długości n jest ≤ H(P) + 2/n, gdzie P to rozkład prawdopodobieństwa dla alfabetu wejściowego. Dowód ∑{x | |x|=n} P(x)m(x) = ≤ = = ∑{x | |x|=n} P(x)(dlog 1/P(x)e + 1) ∑{x | |x|=n} P(x)(log(1/P(x)) + 1 + 1) − ∑{x | |x|=n} P(x) log P(x) + 2 ∑{x | |x|=n} P(x) H(P n ) + 2 A zatem, liczba bitów na symbol jest nie wieksza ˛ niż H(P) + 2/n. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Problemy z implementacja˛ wraz ze wzrostem długości ciagu ˛ potrzebna coraz wieksza ˛ precyzja reprezentacji liczb; a czas operacji arytmetycznych jest proporcjonalny do długości liczb... dla efektywności transmisji danych - potrzebny przyrostowy algorytm kodowania (znacznik powstaje wraz z wydłużaniem sie˛ ciagu, ˛ nie dopiero po przeczytaniu całego ciagu). ˛ Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Przeskalowanie E1 (x) = 2x: [l, p) ⊆ [0, 0.5) ⇒ l = 0.0l 0 , p = 0.0p0 ⇒ 2 · p = 0.p0 , 2 · p = 0.p0 E2 (x) = 2(x − 0.5): [l, p) ⊆ [0.5, 1) ⇒ l = 0.1l 0 , p = 0.1p0 ⇒ 2(l − 1/2) = 0.l 0 , 2(p − 1/2) = 0.p0 E3 (x) = 2(x − 0.25): l ∈ [0.25, 0.5), p ∈ [0.5, 0.75) ⇒ l = 0.01l 0 , p = 0.10p0 ⇒ 2(l − 1/4) = 0.0l 0 , 2(p − 1/4) = 0.1p0 Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Kodowanie z przeskalowaniem Na poczatku: ˛ licznik := 0, l = 0, p = 1, kod jest słowem pustym. Po zakodowaniu każdej litery: Dopóki [l, p) ⊆ [0, 0.5) lub [l, p) ⊆ [0.5, 1) lub [l, p) ⊆ [0.25, 0.75): 1 Jeśli [l, p) ⊆ [0, 0.5): 1 2 3 2 Jeśli [l, p) ⊆ [0.5, 1): 1 2 3 3 zamień [l, p) na [E1 (l), E1 (p)), gdzie E1 (x) = 2x. dołacz ˛ do kodu słowo 01licznik licznik := 0 zamień [l, p) na [E2 (l), E2 (p)), gdzie E2 (x) = 2(x − 0.5). dołacz ˛ do kodu słowo 10licznik licznik := 0 l < 0.5 < p oraz [l, p) ⊆ [0.25, 0.75): 1 2 zamień [l, p) na [E3 (l), E3 (p)), gdzie E3 (x) = 2(x − 0.25) licznik := licznik + 1; Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Przeskalowanie: poprawność Lemat 1 2 3 4 (E1 ) 2 · num(0.0x) = num(0.x) (E2 ) num(0.1x) − 1/2 = num(0.0x); (E3 ) Ciag ˛ przeskalowań E1 E2i jest równoważny E3i E1 . (E3 ) ciag ˛ przeskalowań E2 E1i jest równoważny E3i E2 gdzie num(y ) oznacza wartość liczby zapisanej binarnie jako słowo y . Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Dekodowanie z przeskalowaniem Wejście: znacznik, czyli ciag ˛ binarny bed ˛ acy ˛ zakodowana˛ postacia˛ tekstu; n – długość tekstu. Inicjalizacja: 1 Niech m = maxai dlog(1/P(ai ))e + 3. Odczytujemy pierwsze m bitów znacznika i ustalamy pierwsze przybliżenie znacznika z 0 i pierwszy symbol w tekście, aj . 2 3 l := F (j); p := F (j + 1); licznik := 0; Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Dekodowanie z przeskalowaniem Kontynuacja (powtarzaj aż do odkodowania n liter): 1 jeśli [l, p) spełnia warunki dla przeskalowania E1 lub E2 : 1 2 3 2 3 przeskaluj [l, p) przy pomocy E1 lub E2 , usuń 1 + licznik najbardziej znaczacych ˛ bitów z 0 i dołacz ˛ kolejne 1 + licznik bitów jako najmniej znaczace ˛ bity z 0 licznik := 0 jeśli [l, p) spełnia warunek dla E3 : przeskalowanie E3 dla [l, p) i z 0 i zwiekszenie ˛ licznik o 1; jeśli przedział nie spełnia żadnego z warunków dla E1 , E2 , E3 : odczytujemy kolejne bity z 0 tak aby było ich co najmniej m; na podstawie z 0 wyznaczamy kolejna˛ litere˛ tekstu i kolejny przedział. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Co daje skalowanie wielkość przedziału (p − l) pozostaje nie mniejsza niż pmin /4, gdzie pmin to najmniejsze prawdopodobieństwo pojedynczego symbolu; Uwaga: mały przedział wymaga dużej dokładności (aby wartości l i p nie zrównały sie). ˛ kodowanie progresywne: kod powstaje w trakcie kodowania, nie dopiero na końcu; dekodowanie: operacje na znaczniku długości ≈ log(1/pmin ), nie na „pełnym” znaczniku; dekodowanie bardziej skomplikowane Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Implementacja całkowitoliczbowa Problem Arytmetyka zmiennoprzecinkowa: generuje błedy ˛ zaokragle ˛ ń, wiec ˛ konieczna dokładna implementacja (komplikacje...); Cel przeskalować przedział [0, 1) na zbiór naturalnych liczb m-bitowych, czyli [0, 2m − 1], binarnie [0m , 1m ]. Pytanie jak dobrać parametr m aby zachować jednoznaczność kodowania (nie możemy uzyskać przedziału o wielkości 0). Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Implementacja całkowitoliczbowa c.d. Założenia prawdopodobieństwa wyliczone na podstawie cz˛estości wystepowania... ˛ niech ci to liczba wystapie ˛ ń symbolu ai , C = ∑ni=1 ci wówczas pi = ci /C niech fi = ∑ji−1 = 1 ci Dobór parametru m dla jednego symbolu: 2m > C (najmniejszy przedział to 1/C) dla k symboli: 2m > C k ... :( ale przeskalowanie gwarantuje, że po każdym kroku mamy przedział nie mniejszy niż pmin /4 (czyli 1/4C) zatem wystarczy, że: 2m > 4C. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Implementacja całkowitoliczbowa c.d. Algorytm: jak zaokraglamy ˛ Kodowanie ciagu ˛ x1 . . . xn nad alfabetem a1 , . . . , ar : 1 l = 0; p = 2m − 1; 2 Dla i = 1, 2, . . . , n: 1 2 3 3 niech xi = aj j k (p−l+1)·f (j) l =l+ C j k (p−l+1)·f (j+1) p=l+ −1 C znacznik: dowolna liczba całkowita z przedziału [l, p] Uwaga Musimy też stosować przeskalowania (w przeciwnym razie potrzebne bardzo duże m i rośnie czas obliczeń). Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Implementacja całkowitoliczbowa c.d. Jak zaokraglamy ˛ dlaczego −1: ponieważ [l, p) reprezentujemy jako [l, p − 1]; dlaczego (p − l+1) a nie (p − l): z powyższego powodu; dlaczego f (j)/C i f (j + 1)/C: ponieważ odpowiadaja˛ skumulowanym prawdopodobieństwom F (j) i F (j + 1). Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Kodowanie adaptacyjne Idea W każdym kroku używamy cz˛estości (a tym samym prawdopodobieństw) wyliczonych z już odkodowanej cz˛eści tekstu. Modyfikacja algorytmu (de)Kodujac ˛ k -ty symbol, dzielimy aktualny przedział zgodnie z cz˛estościami dla pierwszych (k − 1) symboli. Problem zerowego prawdopodobieństwa Jak kodować symbol pojawiajacy ˛ sie˛ po raz pierwszy: przydzielić cz˛estości 1: niepraktyczne przy dużym alfabecie; zarezerwować symbol specjalny o cz˛estości (np.) 1, który poprzedza pierwsze pojawienie sie˛ symbolu; po zakodowaniu tego symbolu kodujemy nowy symbol wg rozkładu jednostajnego. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Kodowanie z uwzglednieniem ˛ kontekstu Założenie Tekst nie jest ciagiem ˛ wartości niezależnych. Zależności dotycza˛ sasiednich ˛ liter. Idea Dla każdego symbolu ai , badamy prawdopodobieństwo pojawienia sie˛ symboli a1 , . . . , an bezpośrednio za ai . Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Kontekst c.d. Przykład a b c a b c .4 .2 .4 .1 .8 .1 .25 .25 .5 Modyfikacja algorytmu (de)kodujac ˛ k -ty symbol, dzielimy aktualny przedział zgodnie z cz˛estościami dla wystapie ˛ ń symboli za symbolem (k − 1)szym. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Kontekst i adaptacja a implementacje Adaptacja i kontekst a implementacja dodatkowe struktury danych i ich modyfikacje: niekonieczne! algorytm z przeskalowaniem: wystarczy znać najmniejsze prawdopodobieństwo; implementacja całkowitoliczbowa: wystarczy znać długość kodowanego tekstu. Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Kodowanie arytmetyczne a kodowanie Huffmana Co lepsze? gdy grupujemy m symboli: Huffman koduje ze średnia˛ H(P) + 1/m, kodowanie arytmetyczne H(P) + 2/m ale grupowanie dla dużych m w Huffmanie nierealistyczne kod arytmetyczny bardziej elastyczny: wersja adaptacyjna: dużo łatwiej przy kodowaniu arytmetycznym; uwzglednienie ˛ kontekstu: kodowanie arytmetyczne ma mniejsze wymagania pamieciowe. ˛ Jurdziński Kodowanie arytmetyczne Podstawy i własności Implementacja Kodowanie arytmetyczne: zastosowania bezstratna kompresja obrazów (JBIG): wariant predykcyjny; progresywna transmisja obrazów; algorytm PPM (kodowanie arytmetyczne z kontekstem): jedna z najlepszych metod kompresji tekstów w jezyku ˛ naturalnym. problem: patenty! Jurdziński Kodowanie arytmetyczne