Kodowanie informacji
Tomasz Jurdzi ´nski
Wykład 3: kodowanie arytmetyczne
Jurdzi ´nski Kodowanie arytmetyczne
Motywacja
Motywacje
1 ´srednia długo´s´c kodu Huffmana mo˙ze odbiega´c o pmax+0.086 od entropii, gdzie pmax=maxi=1,...,n{pi} - mo˙ze to powodowa´c du˙ze odchylenia od warto´sci entropii
2 efekt ten mo˙zna zniwelowa´c poprzez zastosowanie kodów Huffmana, w którym alfabet stanowi ˛a ci ˛agi symboli okre´slonej długo´sci - ale wtedy ro´snie gwałtownie rozmiar alfabetu.
Kodowanie arytmetyczne:
zastosowanie podej´scia z punktu 2. bez konieczno´sci tworzenia słów
Ogólnie
Pierwsze spojrzenie
tekst zostaje odwzorowany na liczb ˛e z przedziału [0, 1) nazywan ˛a ZNACZNIKiem.
zakodowan ˛a posta´c tekstu tworzy ZNACZNIK, reprezentowany z odpowiednio dobran ˛a dokładno´sci ˛a oraz n - długo´s´c
kodowanego tekstu.
Jurdzi ´nski Kodowanie arytmetyczne
Jedna litera
Znacznik dla jednej litery alfabetu:
elementy alfabetu numerujemy a1,a2, . . . ,an; oznaczmy ich prawdopodobie ´nstwa przez p1,p2, . . . ,pn;
literze ai przyporz ˛adkowujemy dowoln ˛a liczb ˛e z przedziału [F (i), F (i + 1)), gdzie F (i) = ∑i−1j=1pi
Znacznik dla ci ˛ agu
Kodowanie ci ˛agu x1. . .xn nad alfabetem a1, . . . ,am:
1 z = [0, 1); l = 0; p = 1;
2 Dla i = 1, 2, . . . , n:
1 niech xi=aj
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))
Jurdzi ´nski Kodowanie arytmetyczne
Przykład
P(a) = 0.7, P(b) = 0.1, P(c) = 0.2. Kodujemy tekstabc.
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´s´c
Lemat
Dla ustalonej długo´sci tekstu n, ka˙zdy ci ˛ag jest odwzorowany na przedział rozł ˛aczny z przedziałami odpowiadaj ˛acymi innym ci ˛agom.
Gwarantuje to jednoznaczno´s´c (de)kodowania.
Dowód
Indukcja ze wzgl ˛edu na długo´s´c kodowanego tekstu.
Jurdzi ´nski Kodowanie arytmetyczne
Dekodowanie
Dekodowanie ci ˛agu o długo´sci n ze znacznika z:
1 l = 0; p = 1;
2 Dla i = 1, 2, . . . , n:
1 wybierz j takie, ˙ze l + F (j)(p − l) ≤ z < l + F (j + 1)(p − l)
2 przyjmij, ˙ze xi=aj
3 l = l + F (j)(p − l);
4 p = l + F (j + 1)(p − l).
3 Ci ˛ag oryginalny to x1. . .xn.
Przykład
Niech z = 0.55 dla P(a) = 0.7, P(b) = 0.1, P(c) = 0.2 i n = 3.
Tekst l p p − l
0 1 1
a 0 0.7 0.7
b 0.49 0.56 0.07
c 0.546 0.560 0.014
Jurdzi ´nski Kodowanie arytmetyczne
Własno´sci kodowania arytmetycznego
1 Wygenerowanie znacznika dla konkretnego ci ˛agu nie wymaga wyznaczania b ˛ad´z pami ˛etania znaczników innych ci ˛agów
2 Problem! Komputerowa reprezentacja znacznika mo˙ze wymaga´c du˙zej pami ˛eci - jak dobra´c warto´s´c znacznika aby
zminimalizowa´c potrzebn ˛a pami ˛e´c?
Długo´s´c znacznika
Twierdzenie
Niech x = x1. . .xnb ˛edzie ci ˛agiem danych o prawdopodobie ´nstwie wyst ˛apienia P(x ) = ∏ni=1P(xi). Zaokr ˛aglenie z0znacznika z dla ci ˛agu x do m(x ) = dlog 1/P(x )e + 1 bitów (polegaj ˛ace na usuni ˛eciu
dalszych bitów) gwarantuje jednoznaczno´s´c kodowania.
Jurdzi ´nski Kodowanie arytmetyczne
Dowód
Oznaczenia:
z = (l + p)/2 - znacznik;
z0- zaokr ˛aglenie do m = m(x ) bitów.
Wystarczy pokaza´c, ˙ze
l ≤ z0<p dla l i p wyznaczonych przez algorytm.
Jest to równowa˙zne warunkowi:
|z − z0| < (p − l)/2.
Zauwa˙zmy, ˙ze z0≤ z < p oraz 0 <= z − z0<2m. Pozostaje lewy
Dowód c.d.
Zauwa˙zmy:
z0≤ z < p;
p − l = P(x ) (dla ci ˛agów jednoliterowych z definicji, dla dłu˙zszych dowód indukcyjny)
z(x ) − l = P(x )/2,
z0(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 ´nski Kodowanie arytmetyczne
Jednoznaczno´s´c kodowania z zaokr ˛ agleniem
Ostatecznie, jednoznaczno´s´c wynika z:
rozł ˛aczno´sci przedziałów.
faktu, ˙ze z0nale˙zy do przedziału odpowiadaj ˛acego danemu tekstowi.
Kod prefiksowy
Twierdzenie
Kod arytmetyczny jest (dla ustalonej długo´sci kodowanego tekstu) przy zaokr ˛aglaniu do dlog 1/P(x )e + 1 bitów jest kodem prefiksowym.
Dowód
Wynika z nast ˛epuj ˛acych faktów:
przybli˙zenie z0znacznika z do dlog 1/P(x )e + 1 bitów znajduje si ˛e w przedziale przypisanym ci ˛agowi x ,
przedziały ró˙znych ci ˛agów s ˛a rozł ˛aczne.
ka˙zde słowo (liczba) o prefiksie z0te˙z mie´sci si ˛e w przedziale przypisanym ci ˛agowi x .
Jurdzi ´nski Kodowanie arytmetyczne
Przykład
Znacznik dla P(a)=0.7, P(b)=0.1, P(c)=0.2 i tekstuabc to 0.553, binarnie 0.100011011. Liczba “potrzebnych” bitów to
d(log 1/0.014)e + 1 = 8. Czyli zakodowana posta´c tekstu to10001101.
Kod arytmetyczny a entropia
Kod a entropia
Srednia liczba bitów na jeden symbol kodu arytmetycznego (z´ zaokr ˛agleniem) dla ci ˛agów o długo´sci n jest ≤ H(P) + 2/n, gdzie P to rozkład prawdopodobie ´nstwa dla alfabetu wej´sciowego.
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(Pn) +2
A zatem, liczba bitów na symbol jest nie wi ˛eksza ni˙z H(P) + 2/n.
Jurdzi ´nski Kodowanie arytmetyczne
Problemy z implementacj ˛ a
wraz ze wzrostem długo´sci ci ˛agu potrzebna coraz wi ˛eksza precyzja reprezentacji liczb; a czas operacji arytmetycznych jest proporcjonalny do długo´sci liczb...
dla efektywno´sci transmisji danych - potrzebny przyrostowy algorytm kodowania (znacznik powstaje wraz z wydłu˙zaniem si ˛e ci ˛agu, nie dopiero po przeczytaniu całego ci ˛agu).
Przeskalowanie
[l, p) ⊆ [0, 0.5) ⇒ l = 0.0l0,p = 0.0p0⇒ 2 · p = 0.p0,2 · l = 0.l0 [l, p) ⊆ [0.5, 1) ⇒ l = 0.1l0,p = 0.1p0⇒
2(l − 1/2) = 0.l0,2(p − 1/2) = 0.p0 l ∈ [0.25, 0.5), p ∈ [0.5, 0.75) ⇒ l = 0.01l0,p = 0.10p0⇒
2(l − 1/4) = 0.0l0,2(p − 1/4) = 0.1p0
Jurdzi ´nski Kodowanie arytmetyczne
Kodowanie z przeskalowaniem
Na pocz ˛atku: licznik := 0, l = 0, p = 1, kod jest słowem pustym.
Po zakodowaniu ka˙zdej litery:
Dopóki [l, p) ⊆ [0, 0.5) lub [l, p) ⊆ [0.5, 1) lub [l, p) ⊆ [0.25, 0.75):
1 Je´sli [l, p) ⊆ [0, 0.5):
1 zamie ´n [l, p) na [E1(l), E1(p)), gdzie E1(x ) = 2x .
2 doł ˛acz do kodu słowo 01licznik
3 licznik := 0
2 Je´sli [l, p) ⊆ [0.5, 1):
1 zamie ´n [l, p) na [E2(l), E2(p)), gdzie E2(x ) = 2(x − 0.5).
2 doł ˛acz do kodu słowo 10licznik
3 licznik := 0
3 l < 0.5 < p oraz [l, p) ⊆ [0.25, 0.75):
Przeskalowanie: poprawno´s´c
Lemat
1 (E1) 2 · num(0.0x ) = num(0.x )
2 (E2) num(0.1x ) − 1/2 = num(0.0x );
3 (E3) Ci ˛ag przeskalowa ´n E1E2i jest równowa˙zny E3iE1.
4 (E3) ci ˛ag przeskalowa ´n E2E1i jest równowa˙zny E3iE2
gdzie num(y ) oznacza warto´s´c liczby zapisanej binarnie jako słowo y .
Jurdzi ´nski Kodowanie arytmetyczne
Dekodowanie z przeskalowaniem
Wej´scie: znacznik, czyli ci ˛ag binarny b ˛ed ˛acy zakodowan ˛a postaci ˛a tekstu.
Inicjalizacja:
1 Niech m = maxaidlog(1/P(ai))e. Odczytujemy pierwsze m bitów znacznika i ustalamy pierwsze przybli˙zenie znacznika z0i pierwszy symbol w tek´scie, aj.
2 l := F (j); p := F (j + 1);
3 licznik := 0;
Dekodowanie z przeskalowaniem
Kontynuacja (powtarzaj a˙z do odczytania wszystkich bitów):
1 je´sli [l, p) spełnia warunki dla przeskalowania E1lub E2:
1 przeskaluj [l, p) przy pomocy E1lub E2,
2 usu ´n 1 + licznik najbardziej znacz ˛acych bitów z0i doł ˛acz kolejne 1 + licznik bitów jako najmniej znacz ˛ace bity z0
3 licznik := 0
2 je´sli [l, p) spełnia warunek dla E3: przeskalowanie E3dla [l, p) i z0 i zwi ˛ekszenie licznik o 1;
3 je´sli przedział nie spełnia ˙zadnego z warunków dla E1, E2, E3: odczytujemy kolejne bity z0tak aby było ich co najmniej m; na podstawie z0wyznaczamy kolejn ˛a liter ˛e tekstu i kolejny przedział.
Jurdzi ´nski Kodowanie arytmetyczne
Co daje skalowanie
wielko´s´c przedziału (p − l) pozostaje nie mniejsza ni˙z min(− log pmin,1/4), gdzie pminto najmniejsze prawdopodobie ´nstwo pojedynczego symbolu;
Uwaga: mały przedział wymaga du˙zej dokładno´sci (aby warto´sci l i p nie zrównały si ˛e).
kodowanieprogresywne: kod powstaje w trakcie kodowania, nie dopiero na ko ´ncu;
dekodowanie: operacje na znaczniku długo´sci log(1/pmin), nie na „pełnym” znaczniku;
dekodowanie bardziej skomplikowane
Kodowanie arytmetyczne a kodowanie Huffmana
Co lepsze?
gdy grupujemy m symboli:
Huffman koduje ze ´sredni ˛a H(P) + 1/m, kodowanie arytmetyczne H(P) + 2/m
ale grupowanie dla du˙zych m w Huffmanie nierealistyczne wersja adaptacyjna: du˙zo łatwiej przy kodowaniu
arytmetycznym;
uwzgl ˛ednienie kontekstu: kodowanie arytmetyczne ma mniejsze wymagania pami ˛eciowe.
Jurdzi ´nski Kodowanie arytmetyczne