Algorytmy Kompresji Danych – Laboratorium Ćwiczenie nr 2

Transkrypt

Algorytmy Kompresji Danych – Laboratorium Ćwiczenie nr 2
Algorytmy Kompresji Danych — Laboratorium
Ćwiczenie nr 2: Modelowanie
1. Zaprojektować i zaimplementować klasy adaptacyjnych probabilistycznych modeli
danych: modelu bezpamięciowego (tj. umownie modelu rzędu 0) oraz modeli
kontekstowych I i II rzędu*.
Opracowane modele powinny realizować następujące funkcje:
• inicjalizacja modelu (w konstruktorze),
• aktualizacja modelu — zapamiętanie informacji że dany symbol wystąpił kolejny
raz (w danym kontekście w przypadku modeli kontekstowych),
• wyznaczenie rozkładu prawdopodobieństwa symboli alfabetu (w przypadku
modeli kontekstowych — dla zadanego kontekstu).
Modele powinny obsługiwać dwa następujące, omówione dalej, parametry przekazywane
podczas inicjalizacji: sposób rozwiązania problemu „ZFP” oraz wartość „progu
zapominania”.
Aby szacować prawdopodobieństwa występowania poszczególnych symboli alfabetu, w
modelach można zliczać liczby wystąpień poszczególnych symboli (w modelach
kontekstowych dla każdego kontekstu z osobna). W takim przypadku operacja
inicjalizacji modelu to po prostu to zerowanie liczników, a aktualizacja modelu polegać
będzie na inkrementacji licznika odpowiadającego danemu symbolowi. Wyznaczanie
rozkładu prawdopodobieństwa dokonywane jest na podstawie liczb wystąpień
poszczególnych symboli, lecz nie jest to operacja trywialna, gdyż model będzie pracował
w (symulowanym) adaptacyjnym algorytmie kompresji. Od momentu inicjalizacji, zawsze
i dla wszystkich symboli alfabetu prawdopodobieństwa muszą by niezerowe. Zatem
konieczne jest zaproponowanie sposobu szacowania prawdopodobieństwa symboli, które
jeszcze nie wystąpiły (i uwzględnianie go przy wyliczaniu prawdopodobieństw symboli o
niezerowych licznikach tak, aby łączne prawdopodobieństwo wszystkich symboli
wynosiło 1). Problem szacowania prawdopodobieństw dla „nowych” symboli nazywany
jest “Zero Frequency Problem” (ZFP).
W opracowanym modelu należy zaimplementować kilka (przynajmniej 2), sposoby
szacowania prawdopodobieństw symboli, które wcześniej nie wystąpiły —
zaimplementować pomysły własne, lub następujące:
• przyjmujemy, że każdy symbol już się przynajmniej raz pojawił — problem
znika,
• przyjmujemy, że łączne prawdopodobieństwo dla wszystkich symboli, których
jeszcze nie było, równe jest prawdopodobieństwu symbolu który pojawił się
dokładnie 1 raz (5 razy, 0.1 razy),
• przyjmujemy, że łączne prawdopodobieństwo dla wszystkich symboli, których
jeszcze nie było wynosi 1/(1+liczba_dotychczasowych_aktualizacji).
Charakterystyka kompresowanych danych często jest różna w różnych fragmentach
kompresowanego pliku. Np., gdy kompresujemy zdigitalizowany obraz przedstawiający
pejzaż, to charakterystyka górnej części obrazu (np. niebo, chmury) będzie inna niż
środka (np. morze) i dołu (plaża) obrazu. Dla takich danych opłaca się większą wagę
przypisywać symbolom, które pojawiły się w kompresowanym pliku później (tj.
znajdujących się bliżej aktualnie kompresowanego symbolu).
Praktycznie mechanizm taki można zrealizować przez okresowe zmniejszanie wartości
liczników symboli. Gdy (w danym kontekście) największy z liczników przekroczy
określoną wartość „próg zapominania” wszystkie liczniki w tym kontekście dzielimy
przez 2.
Modele należy zaimplementować jako klasy pochodne dostarczonej klasy model
(specyfikacja — patrz model.h). Klasy umieścić w dostarczonym programie
(lab2.cpp) do szacowania współczynnika kompresji osiągalnego z użyciem idealnego
kodera.
Program ten, dla zadanego pliku oraz modelu o wybranym rzędzie i zadanych
parametrach, przeprowadza adaptacyjne modelowanie i symulowane kodowanie.
Zamiast przeprowadzania rzeczywistego kodowania entropijnego szacowane są jego
efekty, tj. program zlicza autoinformację kolejnych symboli pliku, wyznaczoną na
podstawie prawdopodobieństw oszacowanych dla nich przez model. Stosując
arytmetyczny koder entropijny możliwe jest uzyskanie współczyników kompresji bliskich
raportowanej przez program „empirycznej entropii pliku”.
2. Dla jednego z plików z korpusu Calgary dobrać eksperymentalnie rząd i parametry
modelu tak, aby zminimalizować raportowany przez program współczynnik kompresji
tego pliku.
3. Zaobserwować jak zmienia się współczynnik kompresji w miarę postępowania
kompresji pliku (program raportuje współczynnik dla początkowych 10, 100, 1000 i
10000 bajtów, a także dla pierwszej i drugiej połówki pliku).
4. Dla tak dobranego rzędu i parametrów sprawdzić wyniki modelu na pozostałych
plikach korpusu Calgary i na wszystkich plikach korpusu Calgary połączonych w “solid
archive”. Porównać te wyniki z wynikami z wynikami programów do kompresji danych
uzyskanymi na poprzednim laboratorium oraz ewentualnie z wynikami modeli
opracowanych przez inne sekcje.
*
Istnieją różne definicje rzędu modelu; tutaj przyjmujemy, że rząd modelu równy jest liczbie symboli
poprzedzających dany (długości kontekstu tego symbolu) branych pod uwagę przy wyznaczaniu
prawdopodobieństwa dla tego symbolu. Zatem budując model rzędu k zakładamy, że ciąg symboli
generowanych przez źródło jest dyskretnym łańcuchem Markowa rzędu k.