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

Podobne dokumenty