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.