Komprese dat Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI přednášky
Statistické metody Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 1 / 23
Tunstallův kód = zdrojová slova proměnné délky kódována na kódová slova pevné délky k log m n kódových symbolů = blokový kód, variable-to-fixed code (n je velikost zdrojové abecedy, m je velikost kódové abecedy) chyby v kódových slovech se při dekódování nešíří robustnost požadavky: 1 každou (neprázdnou) posloupnost zdrojových symbolů musí být možné vyjádřit jako (případně prefix) zřetězení právě jedné posloupnosti zdrojových slov kódovaných na kódové slovo jednoznačná kódovatelnost 2 průměrná délka zdrojových slov kódovaných na kódové slovo je maximální = optimální kód delší zdrojová slova mají větší pravděpodobnost výskytu 3 je použito maximum kódových slov, ideálně všech m k optimalita prefixový pro zdrojová slova kódovaná na kódové slovo, jednoznačná kódovatelnost k průměrná délka kódu:, t počet zdrojových slov w t i=1 P (w i délky l(w i ) s i)l(w i ) pravděpodobností výskytu P (w i ) pouze statický a semi-adaptivní model Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 2 / 23
Tunstallův kód B. P. Tunstall Input : číslo k Uses : zdrojová abeceda A, n = A, pravděpodobnosti P (A + ) výskytu slova z A, velikost m kódové abecedy Output: C(U) T A; i 0; while n + (i + 1)(n 1) m k do x w T, P (w) P (w ), w T ; T (T \ {x}) {xy y A}; i i + 1; C(T ) {kódová slova délky k} libovolně; PRIKLAD: k = 4, A = {a, b, r, u, o}, p(a) = 7 20, p(b) = 5 20, p(r) = 5 20, p(u) = 2 p(o) = 1 20, m = 2, vstup barbaraabarboraubaru, redundance 20, Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 3 / 23
Shannon-Fanovo kódování C. E. Shannon, R. M. Fano první pokus o optimální binární prefixový kód využití distribuční funkce/kumulované pravděpodobnosti (cumulative distribution function) zdroje Input : čísla a, b Uses : zdrojová abeceda A = {a 1,..., a n}, n 2, pravděpodobnosti {p 1,..., p n}, p i p j pro i < j, výskytu a i Output : kód C(A) if a + 1 = b then C(a a) 0; C(a b ) I; j najdi j takové, že i=a p b i i=j+1 p i je minimální; C(A) zavolej se rekurzivně s a, j a s j + 1, b; C(a i ) 0C(a i ) pro i = a,..., j; C(a i ) IC(a i ) pro i = j + 1,..., b; Run with: 1, n PRIKLAD: A = {a, b, r, u, o}, p(a) = 7 20, p(b) = 5 20, p(r) = 5 20, p(u) = 2 20, p(o) = 1 20, vstup barbaraabarboraubaru, redundance optimální při k p k = j i=a p i b i=j+1 p i = l p l, k, l {a,..., b}, {k} {l} =, minimální Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 4 / 23
Huffmanovo kódování David A. Huffman: A method for the construction of minimum-redundancy codes. Proceedings of the I.R.E., pp. 1098 1102, 1952. optimální prefixové, vyplývá z vlastností optimálního prefixového kódu (viz Věta dříve) a následujícího Lemma Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 5 / 23
Huffmanovo kódování David A. Huffman: A method for the construction of minimum-redundancy codes. Proceedings of the I.R.E., pp. 1098 1102, 1952. optimální prefixové, vyplývá z vlastností optimálního prefixového kódu (viz Věta dříve) a následujícího Lemma Lemma Nechť C : A B +, kde A = {a 1,..., a n }, n m 2, a i = a i A, i < n, pravděpodobnosti výskytu symbolů a i jsou p i = p i, i < n, p n = n j=n m +1 p j, A = {a 1,..., a n }, n = n + m 1, s pravděpodobnostmi výskytu p i symbolů a i, kde p n m +1,..., p n jsou nejmenší, m {2, 3,..., m}, m n (mod (m 1)), B = {b 1,..., b m }, je optimální prefixový kód ze zdrojové abecedy A do kódové abecedy B. Pak kód C : A B +, C(a i ) = C (a i ), i < n, C(a n m +j) = C (a n )b j, j m, ze zdrojové abecedy A do kódové abecedy B je také optimální. Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 5 / 23
Huffmanovo kódování Statický a semi-adaptivní model Input : abeceda A = {a 1,..., a n }, pravděpodobnosti {p 1,..., p n } výskytu a i Uses : zdrojová abeceda A = {a 1,..., a n }, pravděpodobnosti {p 1,..., p n } výskytu a i, kódová abeceda B = {b 1,..., b m } Output : kód C(A ) setřiď a i a p i tak, že p i p j pro i < j; if n m then C(a i ) b i pro i = 1,..., n ; else if n = n then m (n 2) mod (m 1) + 2; else m = m C(A ) zavolej se rekurzivně s A \ {a n m +2,..., a n }, {p 1,..., p n m, n i=n m +1 p i }; C(a n m +i ) C(a n m +1 )b i pro i = 1,..., m ; Run with: A = {a 1,..., a n }, {p 1,..., p n } PRIKLAD: A = {a, b, r, u, o}, p(a) = 7 20, p(b) = 5 20, p(r) = 5 20, p(u) = 2 20, p(o) = 1 20, m = 2, vstup barbaraabarboraubaru, m = 3, vstup??, redundance Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 6 / 23
Huffmanovo kódování Proč m a ne m? Protože při tomto počtu nejdelších kódových slov bude u všech kratších kódových slov a prefixů využito všech m symbolů kódové abecedy a kód má být optimální prefixový. Huffmanův strom T H (A) = V H (A), E H (V H (A)) = reprezentace Huffmanova kódu C(A) formou m-árního stromu: listové uzly v l (a i ) V H (A) pro symboly a i A, i = 1,..., n vnitřní uzly v(a n ) V H(A) pro všechny a n (ve všech rekurzivních voláních) + kořenový uzel v r V H (A) hrany v(a n ), v(a n m +i ) b i E H (V H (A)) a v r, v(a i ) b i E H (V H (A)) označené b i B z uzlu pro a n následujícího rekurzivního volání do uzlů pro a n m +i, i = 1,..., m při n > m a z kořenového uzlu do uzlů pro a i, i = 1,..., n při n m C(a) = zřetězení b B označujících hrany na cestě stromem z v r do v l (a) PRIKLAD Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 7 / 23
Huffmanovo kódování minimální rozdíly v délkách kódových slov (pro jejich minimální bufferování při pevné rychlosti přenosu/ukládání): třídění a i a p i tak, že původní a n bude po zatřídění a i, i < j pro všechna j, pro která p j = p i m = 2 a p i > n j=i+2 p j, p i p j pro i < j (speciálně p i = 2 i, i = 1,..., n 1 a p n = 2 (n 1) ) unární číselný kód i 1 pro a i, i = 1,..., n 1 a n I pro a n m = 2 a p 1 < p n 1 + p n, p i p j pro i < j (speciálně p i = 1 n ) blokový kód délky k = log 2 n pro a 1,..., a 2 k a délky k + 1 pro a 2 k +1,..., a n PRIKLADY Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 8 / 23
Huffmanovo kódování Adaptivní model binární kód triviálně: znovuvytváření kódu pro každý další symbol na vstupu výpočetně náročné Faller, Gallager, Knuth, Vitter vlastnost Huffmanova stromu (tzv. sibling property): p n... p n m +1 p n... p n m +1 následujícího rekurzivního volání musí stále platit v následujících algoritmech zajištěno pomocí (aktuálního) počtu n(x) výskytů symbolu x a čísla i(v(x)), v(x) V H (A) speciální (escape) symbol e značící neexistující/první výskyt symbolu T H (A) {v l (e)},, C(e) prázdný řetězec; n(e) 0; i(v l (e)) 1; while načti ze vstupu symbol a A do if v l (a) V H (A) then zapiš na výstup C(e) a kód a; else zapiš na výstup C(a); zavolej následující algoritmus; Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 9 / 23
Huffmanovo kódování Adaptivní model binární kód if v l (a) V H (A) then V H (A) V H (A) {v l (a), v(x)}; n(a) n(x) 1; i(v(x)) i(v l (e)); i(v l (a)) i(v(x)) + 1; i(v l (e)) i(v l (a)) + 1; E H (V H (A)) (E H (V H (A)) \ { u, v l (e) b }) { v(x), v l (e) I, v(x), v l (a) 0, u, v(x) b }; else v(x) v l (a); while v(x) v r do if v(x), v l (e) E H (V H (A)) then najdi v(y) takové, že i(v(y)) < i(v(z)), v(z) V H (A), n(y) = n(z); if v(y) v(x) v(y), v(x) E H (V H (A)) then v v(x); v(x) v(y); v(y) v; i i(v(x)); i(v(x)) i(v(y)); i(v(y)) i; n(x) n(x) + 1; v(x) u, u, v(x) E H (V H (A)); n(x) n(x) + 1; PRIKLAD Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 10 / 23
Huffmanovo kódování Adaptivní model binární kód T H (A) {v l (e)}, ; n(e) 0; i(v l (e)) 1; while není konec vstupu do v v r ; while v v l (a) do načti ze vstupu symbol b B; v u, v, u b E H (V H (A)); if a = e then načti ze vstupu kód symbolu a A; dekóduj kód a a zapiš na výstup a; else zapiš na výstup symbol a A; zavolej předchozí algoritmus; PRIKLAD Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 11 / 23
Huffmanovo kódování Aplikace často v návaznosti na jiné metody, např. na diferenční kódování (obraz, zvuk) Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 12 / 23
Aritmetické kódování průměrná délka optimálního prefixového kódu, např. Huffmanova, je minimálně rovna entropii zdroje a nejvýše o 1 větší než entropie (Shannon noisless coding theorem, viz Věta dříve) platí těsnější, nejvýše o nejvyšší pravděpodobnost p max 0.5 zdrojových symbolů nebo o p max + 0.086, p max < 0.5 změna zdrojové abecedy na k-tice (nezávislých) symbolů z původní abecedy A pro přiblížení se entropii ale zvyšuje velikost abecedy, a tím i Huffmanova stromu, na A k, např. pro p 1 = 0.95, p 2 = 0.03, p 3 = 0.02 je entropie přibližně 0.335 b/symbol, průměrná délka Huffmanova kódu 1.05 b/symbol, kódu pro 9 dvojic symbolů přibližně 0.611 b/symbol a kódu pro??tic symbolů přibližně? b/symbol! výhodnější kódovat zdrojová slova než samostatné symboly ale nevytvářet kód pro všechna slova dané délky, např. Huffmanův! kód pouze pro zdrojová slova na vstupu vhodné pro malé zdrojové abecedy, např. binární, s velkými rozdíly v pravděpodobnostech symbolů = kódování zdrojových slov do čísel z podintervalů [0, 1) kódovaných do binárního kódu Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 13 / 23
Aritmetické kódování Pasco, Rissanen, 1976, Rissanen, Langdon, 1979 využití distribuční funkce/kumulované pravděpodobnosti (cumulative distribution function) F X (i) = i k=1 P (X = k), P (X = k) = P (a k ) = p k zdroje (nezávisle se stejným pravděpodobnostním rozložením se vyskytujících) symbolů z abecedy A = {a 1, a 2,..., a n } jako náhodných proměnných X(a i ) = i, F X (0) = 0 l p 0; u p 1; while načti ze vstupu symbol a i A do l l p + (u p l p )F X (i 1); u l p + (u p l p )F X (i); l p l; u p u; // přeškálování [l, u) zapiš na výstup C = binární reprezentace jakéhokoliv čísla z [l, u) s minimem bitů; PRIKLAD Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 14 / 23
Aritmetické kódování C(A + ) je prefixový binární kód ze zdrojových slov nad abecedou A, průměrná délka pro slova délky k je H(A k ) l(c(a k )) < H(A k ) + 1 průměrná délka na symbol z A je H(A) l < H(A) + 1 k pro dekódování je nutné znát délku L kódovaného zdrojového slova uložit spolu s komprimovanými daty nebo speciální zdrojový symbol značící konec vstupu l p 0; u p 1; j 0; načti ze vstupu binární reprezentaci čísla x [0, 1); while j < L do najdi i {1,..., n} takové, že F X(i 1) x lp u p l p < F X(i); zapiš na výstup symbol a i A; j j + 1; if j < L then l l p + (u p l p)f X(i 1); u l p + (u p l p)f X(i); l p l; u p u; // přeškálování [l, u) PRIKLAD Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 15 / 23
Aritmetické kódování u kódování i dekódování žádoucí průběžný výstup během čtení vstupu, ne až po načtení celého vstupu kód čísla z [l, u) průběžně [l, u) se s délkou zdrojového slova zmenšuje, ale uložení necelých čísel je v praxi s omezenou přesností omezení délky slova nebo přeškálování [l, u): 1 u < 0.5: x 2x, x {l, u} 2 l 0.5: x 2(x 0.5), x {l, u} 3 l 0.25 u < 0.75: x 2(x 0.25), x {l, u} c-krát c-krát c-krát c-krát {}}{{}}{{}}{{}}{ případy 3... 31 = 12... 2 a 3... 32 = 21... 1 Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 16 / 23
Aritmetické kódování c 0; // while... while u < 0.5 l 0.5 (l 0.25 u < 0.75) do if l 0.25 u < 0.75 then // případ 3 c c + 1; d 0.25; else if u < 0.5 then // případ 1 b 0; d 0; else // případ 2 b I; d 0.5; zapiš na výstup b; while c > 0 do zapiš na výstup inverzi b; c c 1; l 2(l d); u 2(u d); zapiš na výstup C = I; Jan PRIKLAD Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 17 / 23
Aritmetické kódování načti ze vstupu log 2 p min bitů binární reprezentace čísla x [0, 1), p min nejnižší pravděpodobnost zdrojových symbolů; // while... while u < 0.5 l 0.5 (l 0.25 u < 0.75) do if l 0.25 u < 0.75 then d 0.25; else if u < 0.5 then d 0; else d 0.5; l 2(l d); u 2(u d); načti ze vstupu další bit b anebo b 0; x 2(x d) + b 1 2 log 2 p min ; PRIKLAD Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 18 / 23
Aritmetické kódování Celočíselná implementace zobrazení [0, 1) na [0, M 1) (0.25 M 4, 0.5 M 2, 0.75 3M 4 ), M 4 1 p min, M typicky 2 8, 2 16, 2 32 nebo 2 64 podle datového typu pro čísla z [0, M 1) odhad F X (i) s frekvencemi/četnostmi f(a k ) = n(a k) výskytu symbolu a A j=1 n(a k A j) místo pravděpodobností P (a k ) l l p + (u p l p + 1)F X (i 1), u l p + (u p l p + 1)F X (i) 1, u 2(u d) + 1, x 2(x d) + b kvůli celočíselné aritmetice načti ze vstupu log 2 M bitů binární reprezentace čísla x [0, M 1) x l p+1 u p l p+1, při M = 2 k pro nějaké k 2: u < M 2 nejvýznamnější bit l i u je 0 l M 2 nejvýznamnější bit l i u je I l M 4 u < 3M 4 druhý nejvýznamnější bit l je I a u je 0 2x a 2(x M 2 ) bitový posun x doleva o 1 bit, 2(x M 4 ) navíc inverze (nového) nejvýznamnějšího bitu PRIKLAD Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 19 / 23
Aritmetické kódování Adaptivní model průběžný odhad F X (i) s frekvencemi/četnostmi f(a k ) = n(a k) A výskytu symbolu j=1 n(a j) a k A místo pravděpodobností P (a k ) inicializace na známý odhad nebo počet n(a) = 1 výskytu každého symbolu a A inkrementace n(a) po (de)kódování symbolu a uložení p min spolu s komprimovanými daty, u celočíselné implementace nesmí p min klesnout pod 4 1 M v praxi n(a j) n(a j) 2 pro n(a j ) > 1 při A j=1 n(a j) = M 4 Aplikace ve standardech komprese multimediálních dat (obraz, video, zvuk) Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 20 / 23
Aritmetické kódování QM kódování = modifikované adaptivní binární aritmetické kódování (Q kódování, skew kódování), tj. pro binární zdrojovou abecedu s adaptivním modelem A = u l místo u: l l p + A p F X (i 1) a A A p p i místo 2 symbolů A, a 1 = 0 a a 2 = I, a 1 = více (MPS) a a 2 = méně (LPS) pravděpodobný symbol s průběžně odhadovanými frekvencemi/četnostmi 1 q a q výskytu l l p a A A p (1 q) pro MPS l l p + A p (1 q) a A A p q pro LPS x l p A p < 1 q pro MPS a 1 q pro LPS potlačení násobení (i pro nebinární zdrojové abecedy) udržování hodnoty A v [0.75, 1.5) a zanedbání násobení A p l l p a A A p q pro MPS l l p + A p q a A q pro LPS x l p < 1 q pro MPS a 1 q pro LPS přeškálování l, A: A < 0.75: A 2A, l 2l pro l < 0.5 a l 2(l 0.5) pro l 0.5 Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 21 / 23
Aritmetické kódování QM kódování while A < 0.75 do if l < 0.5 then b 0; d 0; else b I; d 0.5; zapiš na výstup b; l 2(l d); A 2A; zapiš na výstup C = I; načti ze vstupu log 2 q bitů binární reprezentace čísla x [0, 1); // while... while A < 0.75 do if l < 0.5 then d 0; else d 0.5; l 2(l d); A 2A; načti ze vstupu další bit b anebo b 0; 1 x 2(x d) + b ; 2 log 2 q Jan PRIKLAD Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 22 / 23
Aritmetické kódování QM kódování inicializace q = 0.5 a aktualizace q podle tabulky hodnot při přeškálování, ne po (de)kódování každého symbolu při častějším výskytu LPS než MPS, q > A q, prohození symbolů včetně aktuálních hodnot l a A, při přeškálování celočíselná implementace: zobrazení [0, 1.5) na [0, M 1) (0.25 M 6, 0.5 M 3, 0.75 M 2, 1 2M 3 ), M 4 1 3 q, i pro hodnoty q použití ve standardu JPEG (JBIG) komprese obrazu Jan Outrata (Univerzita Palackého v Olomouci) Komprese dat Olomouc, únor březen 2016 23 / 23