Kodowanie Shannona
Z Wikipedii
Kodowanie Shannona, to metoda kodowania źródłowego, którą Claude E. Shannon przedstawił jako jeden z dowodów swojego twierdzenia o dyskretnym kodowaniu w kanałach bezszumowych, które brzmi:
- Dla źródła sygnału S można znaleźć takie kody prefiksowe dla słów złożonych z k symboli źródłowych, żeby zachodziło:
- gdzie H(S) to entropia źródła, a Lk - średnia długość kodów.
Kodowanie Shannona nie tworzy optymalnych kodów; nieco lepsze wyniki daje modyfikacja znana jako kodowanie Shannona-Fano. Znacznie lepszą efektywnością charakteryzują się kodowanie Huffmana oraz kodowanie arytmetyczne.
Spis treści |
[edytuj] Kodowanie Shannona
Dane jest źródło i stowarzyszone z nimi prawdopodobieństwa
.
- Prawdopodobieństwa (a wraz z nimi symbole) są sortowane w porządku niemalejącym, tj.
.
- Następnie dla tak uporządkowanych danych oblicza się niepełne prawdopodobieństwo komulatywne:
- jest to suma wszystkich prawdopodobieństw od 1. do i-1 elementu.
- Kodowanie Shannona polega na wzięciu
(długość Shannona) pierwszych bitów binarnego rozwinięcia liczby Pi (brane są bity po przecinku).
[edytuj] Przykład
Niech S = {a,b,c,d}, p = {0.45,0.3,0.2,0.05} (entropia H(S) = 1.72); prawdopodobieństwa są już podane niemalejąco.
Prawdopodobieństwa kumulatywne:
- P1(a) = 0
- P2(b) = p1 = 0.45
- P3(c) = p1 + p2 = 0.45 + 0.3 = 0.75
- P4(d) = p1 + p2 + p3 = 0.45 + 0.3 + 0.2 = 0.95
I ich rozwinięcia binarne (wzięte 5 pierwszych bitów po przecinku):
- P1(a) = 0.000002
- P2(b) = 0.011102
- P3(c) = 0.110002
- P4(d) = 0.111102
Długości Shannona (długości kodów w bitach):
Ostatecznie kody mają postać:
- kod(a) = 002
- kod(b) = 012
- kod(c) = 1102
- kod(d) = 111102
Średnia długość kodu (k = 1). Po podstawieniu do nierówności podanej w twierdzeniu:
stwierdzamy, że otrzymany kod rzeczywiście ją spełnia.
Jednak, jak wspomniano, efektywność kodowania Shannona nie jest duża - dla danych z tego przykładu wynosi .
[edytuj] Kodowanie Shannona-Fano
Robert Fano zaproponował algorytm, który daje trochę lepsze wyniki kodowania - kody mogą być krótsze o 1 bit niż kody tworzony metodą Shannona, także rozkład bitów może się różnić.
Kodowanie Shannona-Fano przedstawia się następująco:
- s - ciąg symboli ze zbioru S posortowanych wg prawdopodobieństw pi
- Shanon-Fano(s):
- Jeśli s zawiera dwa symbole do słowa kodu pierwszej litery dodaj 1, do słowa kodu drugiej litery - 0.
- W przeciwnym razie jeśli s zawiera więcej niż dwa symbole, podziel go na dwa podciągi s1 i s2 tak, żeby różnica między sumą prawdopodobieństw liter z s1 i s2 była najmniejsza. Do słów kodu symboli z s1 dodaj 1, do kodów symboli z s2 - 0. Wywołaj rekurencyjnie funkcje: Shannon-Fano(s1) oraz Shannon-Fano(s2).
[edytuj] Przykład
Niech S = {a,b,c,d}, p = {0.45,0.3,0.2,0.05}.
Początkowo ciąg s = abcd (porządek według malejącego prawdopodobieństwa).
Składa się z więcej niż 2 liter, zatem trzeba go podzielić. Możliwe są następujące sytuacje: 1) s1 = a, s2 = b (różnica prawdopodobieństw 0.1), 2) s1 = ab, s2 = cd (różnica prawdopodobieństw 0.5) oraz 3) s1 = abc, s2 = d (różnica prawdopodobieństw 0.9) - wybierany jest ta para, dla której różnica prawdopodobieństw jest najmniejsza, a więc pierwszą parę. Do słów kodu liter z s1 = a dopisywane są 0, do słów kodu liter z s2 = bcd - 1:
a = 0 b = 1 c = 1 d = 1
Teraz wywoływana jest funkcja Shannon-Fano(s1) - ten ciąg ma długość 1 i nie jest już dalej przetwarzany. Następnie wykonywane jest Shannon-Fano(s2) - s2 jest dłuższy niż 2 i musi zostać podzielony.
Sytuacja jest podobna jak w poprzednim kroku, bo s12 = b i s22 = cd. Do słów kodu liter z s12 = b dopisywane są 0, do słów kodu liter z s22 = cd - 1:
a = 0 b = 10 c = 11 d = 11
Wywoływana jest funkcja Shannon-Fano(s12) - ten ciąg ma długość 1, nie jest już dalej przetwarzany. Następnie wykonywane jest Shannon-Fano(s22) - s22 ma długość 2, więc tutaj kodowanie kończy się - do słowa kodu pierwszego symbolu (c) dopisywane jest 0, a do słowa kodu drugiego kodu (d) - 1:
a = 0 b = 10 c = 110 d = 111
Średnia długość kodu . W tym przypadku efektywność kodowania wynosi
, jest więc znacznie lepsza niż kodowania Shannona.
[edytuj] Bibliografia
Adam Drozdek, Wprowadzenie do kompresji danych, WNT 1999