Kodowanie informacji Tomasz Wykład 4: kodowanie arytmetyczne
Motywacja Podstawy i własności Liczby rzeczywiste Motywacje 1 średnia długość kodu Huffmana może odbiegać o p max + 0.086 od entropii, gdzie p max = max i=1,...,n {p i } - może to powodować duże odchylenia od wartości entropii 2 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. : zastosowanie podejścia z punktu 2. bez konieczności tworzenia słów kodowych dla wszystkich ciagów symboli. Uogólnienie kodowania Shannona.
Ogólnie Podstawy i własności Liczby rzeczywiste Pierwsze spojrzenie tekst zostaje odwzorowany na liczbę 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.
Jedna litera Podstawy i własności Liczby rzeczywiste Znacznik dla jednej litery alfabetu: elementy alfabetu numerujemy a 1,a 2,...,a n ; oznaczmy ich prawdopodobieństwa przez p 1,p 2,...,p n ; literze a i przyporzadkowujemy dowolna liczbę z przedziału [F(i),F (i + 1)), gdzie F (i) = i 1 j=1 p i
Znacznik dla ciagu Podstawy i własności Liczby rzeczywiste Kodowanie ciagu x 1...x n nad alfabetem a 1,...,a m : 1 z = [0,1); l = 0; p = 1; 2 Dla i = 1,2,...,n: 1 niech x i = a j 2 l = l + F (j)(p l) 3 p = l + F (j + 1)(p l) 3 znacznik = (l + p)/2 (lub dowolna liczba z przedziału [l,p))
Przykład Podstawy i własności Liczby rzeczywiste P(a) = 0.7, P(b) = 0.1, P(c) = 0.2. Kodujemy tekst abc. Tekst Lewy Prawy Znacznik 0 1 0.5 a 0 0.7 0.35 b 0.49 0.56 0.53 c 0.546 0.560 0.553
Jednoznaczność Podstawy i własności Liczby rzeczywiste 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 względu na długość kodowanego tekstu.
Dekodowanie Podstawy i własności Liczby rzeczywiste Dekodowanie ciagu o długości n ze znacznika z: 1 l = 0; p = 1; 2 Dla i = 1,2,...,n: 1 wybierz j takie, że l + F (j)(p l) z < l + F (j + 1)(p l) 2 przyjmij, że x i = a j 3 l = l + F (j)(p l); 4 p = l + F (j + 1)(p l). 3 Ciag oryginalny to x 1...x n.
Przykład Podstawy i własności Liczby rzeczywiste Niech z = 0.55 dla P(a) = 0.7, P(b) = 0.1, P(c) = 0.2 i n = 3. Tekst Lewy Prawy Znacznik 0 1 a 0 0.7 b 0.49 0.56 c 0.546 0.560
Liczby rzeczywiste Własności kodowania arytmetycznego 1 Wygenerowanie znacznika dla konkretnego ciagu nie wymaga wyznaczania badź pamiętania znaczników innych ciagów 2 Problem! Komputerowa reprezentacja znacznika może wymagać dużej pamięci - jak dobrać wartość znacznika aby zminimalizować potrzebna pamięć?
Długość znacznika Podstawy i własności Liczby rzeczywiste Twierdzenie Niech x = x 1...x n będzie ciagiem danych o prawdopodobieństwie wystapienia P(x) = n i=1 P(x i). Zaokraglenie z znacznika z dla ciagu x do m(x) = log1/p(x) + 1 bitów (polegajace na usunięciu dalszych bitów) gwarantuje jednoznaczność kodowania.
Dowód Podstawy i własności Liczby rzeczywiste Oznaczenia: z = (l + p)/2 - znacznik; z - zaokraglenie do m = m(x) bitów. Wystarczy pokazać, że l z < p dla l i p wyznaczonych przy omawianiu algorytmu. Jest to równoważne warunkowi: z z < (p l)/2. Zauważmy, że z z < p oraz 0 <= z z < 2 m. Pozostaje lewy koniec przedziału...
Dowód c.d. Podstawy i własności Liczby rzeczywiste Zauważmy: z 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 (x) > z(x) 1/2 m(x) z(x) 1/2 log(1/p(x))+1 > z(x) 1/(2 1/P(x)) = z(x) P(x)/2 = (p + l)/2 (p l)/2 = l.
Liczby rzeczywiste Jednoznaczność kodowania z zaokragleniem Ostatecznie, jednoznaczność wynika z: rozłaczności przedziałów. faktu, że z należy do przedziału odpowiadajacego danemu tekstowi.
Kod prefiksowy Podstawy i własności Liczby rzeczywiste Twierdzenie Kod arytmetyczny jest (dla ustalonej długości kodowanego tekstu) przy zaokraglaniu do log 1/P(x) + 1 bitów jest kodem prefiksowym. Dowód Wynika z następujacych faktów: przybliżenie z znacznika z do log1/p(x) + 1 bitów znajduje się w przedziale przypisanym ciagowi x, przedziały różnych ciagów sa rozłaczne. każde słowo (liczba) o prefiksie z też mieści się w przedziale przypisanym ciagowi x.
Przykład Podstawy i własności Liczby rzeczywiste 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 (log 1/0.014) + 1 = 8. Czyli zakodowana postać tekstu to 10001101.
Kod arytmetyczny a entropia Liczby rzeczywiste 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)( log1/p(x) + 1) {x x =n} P(x)(log(1/P(x)) + 1 + 1) = {x x =n} P(x)logP(x) + 2 {x x =n} P(x) = H(P n ) + 2 A zatem, liczba bitów na symbol jest nie większa niż H(P) + 2/n.
Problemy z implementacja wraz ze wzrostem długości ciagu potrzebna coraz większa 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 się ciagu, nie dopiero po przeczytaniu całego ciagu).
Przeskalowanie Podstawy i własności E 1 (x) = 2x: [l,p) [0,0.5) l = 0.0l,p = 0.0p 2 p = 0.p,2 p = 0.p E 2 (x) = 2(x 0.5): [l,p) [0.5,1) l = 0.1l,p = 0.1p 2(l 1/2) = 0.l,2(p 1/2) = 0.p E 3 (x) = 2(x 0.25): l [0.25,0.5), p [0.5,0.75) l = 0.01l, p = 0.10p 2(l 1/4) = 0.0l, 2(p 1/4) = 0.1p
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 zamień [l,p) na [E 1 (l),e 1 (p)), gdzie E 1 (x) = 2x. 2 dołacz do kodu słowo 01 licznik 3 licznik := 0 2 Jeśli [l,p) [0.5,1): 1 zamień [l,p) na [E 2 (l),e 2 (p)), gdzie E 2 (x) = 2(x 0.5). 2 dołacz do kodu słowo 10 licznik 3 licznik := 0 3 l < 0.5 < p oraz [l,p) [0.25,0.75): 1 zamień [l,p) na [E 3 (l),e 3 (p)), gdzie E 3 (x) = 2(x 0.25) 2 licznik := licznik + 1;
Przeskalowanie: poprawność Lemat 1 (E 1 ) 2 num(0.0x) = num(0.x) 2 (E 2 ) num(0.1x) 1/2 = num(0.0x); 3 (E 3 ) Ciag przeskalowań E 1 E2 i jest równoważny E 3 i E 1. 4 (E 3 ) ciag przeskalowań E 2 E1 i jest równoważny E 3 i E 2 gdzie num(y) oznacza wartość liczby zapisanej binarnie jako słowo y.
Dekodowanie z przeskalowaniem Wejście: znacznik, czyli ciag binarny będacy zakodowana postacia tekstu; n długość tekstu. Inicjalizacja: 1 Niech m = max ai log(1/p(a i )) + 3. Odczytujemy pierwsze m bitów znacznika i ustalamy pierwsze przybliżenie znacznika z i pierwszy symbol w tekście, a j. 2 l := F (j); p := F(j + 1); 3 licznik := 0;
Dekodowanie z przeskalowaniem Kontynuacja (powtarzaj aż do odkodowania n liter): 1 jeśli [l,p) spełnia warunki dla przeskalowania E 1 lub E 2 : 1 przeskaluj [l,p) przy pomocy E 1 lub E 2, 2 usuń 1 + licznik najbardziej znaczacych bitów z i dołacz kolejne 1 + licznik bitów jako najmniej znaczace bity z 3 licznik := 0 2 jeśli [l,p) spełnia warunek dla E 3 : przeskalowanie E 3 dla [l,p) i z i zwiększenie licznik o 1; 3 jeśli przedział nie spełnia żadnego z warunków dla E 1, E 2, E 3 : odczytujemy kolejne bity z tak aby było ich co najmniej m; na podstawie z wyznaczamy kolejna literę tekstu i kolejny przedział.
Co daje skalowanie wielkość przedziału (p l) pozostaje nie mniejsza niż p min /4, gdzie p min 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 się). kodowanie progresywne: kod powstaje w trakcie kodowania, nie dopiero na końcu; dekodowanie: operacje na znaczniku długości log(1/p min ), nie na pełnym znaczniku; dekodowanie bardziej skomplikowane
całkowitoliczbowa Problem Arytmetyka zmiennoprzecinkowa: Cel generuje błędy zaokragleń, więc konieczna dokładna implementacja (komplikacje...); przeskalować przedział [0, 1) na zbiór naturalnych liczb m-bitowych, czyli [0,2 m 1], binarnie [0 m,1 m ]. Pytanie jak dobrać parametr m aby zachować jednoznaczność kodowania (nie możemy uzyskać przedziału o wielkości 0).
całkowitoliczbowa c.d. Założenia prawdopodobieństwa wyliczone na podstawie częstości występowania... niech c i to liczba wystapień symbolu a i, C = n i=1 c i wówczas p i = c i /C niech f i = i 1 j=1 c i Dobór parametru m dla jednego symbolu: 2 m > C (najmniejszy przedział to 1/C) dla k symboli: 2 m > C k... :( ale przeskalowanie gwarantuje, że po każdym kroku mamy przedział nie mniejszy niż p min /4 (czyli 1/4C) zatem wystarczy, że: 2 m > 4C.
całkowitoliczbowa c.d. Algorytm: jak zaokraglamy Kodowanie ciagu x 1...x n nad alfabetem a 1,...,a r : 1 l = 0; p = 2 m 1; 2 Dla i = 1,2,...,n: 1 niech x i = a j (p l+1) f (j) 2 l = l + C (p l+1) f (j+1) 3 p = l + C 1 3 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ń).
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).
Kodowanie adaptacyjne Idea W każdym kroku używamy częstości (a tym samym prawdopodobieństw) wyliczonych z już odkodowanej części tekstu. Modyfikacja algorytmu (de)kodujac k-ty symbol, dzielimy aktualny przedział zgodnie z częstościami dla pierwszych (k 1) symboli. Problem zerowego prawdopodobieństwa Jak kodować symbol pojawiajacy się po raz pierwszy: przydzielić częstości 1: niepraktyczne przy dużym alfabecie; zarezerwować symbol specjalny o częstości (np.) 1, który poprzedza pierwsze pojawienie się symbolu; po zakodowaniu tego symbolu kodujemy nowy symbol wg rozkładu jednostajnego.
Kodowanie z uwzględnieniem kontekstu Założenie Tekst nie jest ciagiem wartości niezależnych. Zależności dotycza sasiednich liter. Idea Dla każdego symbolu a i, badamy prawdopodobieństwo pojawienia się symboli a 1,...,a n bezpośrednio za a i.
Kontekst c.d. Podstawy i własności Przykład a b c a.4.2.4 b.1.8.1 c.25.25.5 Modyfikacja algorytmu (de)kodujac k-ty symbol, dzielimy aktualny przedział zgodnie z częstościami dla wystapień symboli za symbolem (k 1)szym.
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.
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; uwzględnienie kontekstu: kodowanie arytmetyczne ma mniejsze wymagania pamięciowe.
: 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 języku naturalnym. problem: patenty!