Wyklad 10 (kwantyzacja wektorowa)
Transkrypt
Wyklad 10 (kwantyzacja wektorowa)
Kompresja danych Streszczenie Studia Dzienne Wykład 10, 28.04.2006 1 Kwantyzacja wektorowa Kwantyzacja wektorowa: dane dzielone na bloki (wektory), każdy blok kwantyzowany jako jeden element danych. Ogólny schemat kwantyzacji wektorowej dla L-wymiarowych wektorów: • ustalamy M wektorów L-wymiarowych jako wartości rekonstrukcji, nazywanych też wektorami kodowymi; każdemu z wektorów kodowych przyporzadkowujemy ˛ indeks w tablicy tych wektorów, zwanej słownikiem; • dane dzielimy na bloki o długości L; • dla każdego bloku danych znajdujemy najbliższy mu wektor kodowy i on staje si˛e skwantyzowana˛ wartościa˛ tego bloku. Miary jakości kwantyzatora wektorowego: • (średniokwadratowy) bład ˛ kwantyzacji σq2 , w którym odległość mi˛edzy wektoP rami X = (x1 . . . xL ) i Y = (y1 . . . yL ) to kX − Y k; gdzie kXk2 = Li=1 x2i . • (średnia) liczba bitów na próbk˛e: równa L rozmiar kwantyzowanych wektorów. dlog Ke , L gdzie K to rozmiar słownika, a Pogladowe ˛ przykłady przewagi kwantyzacji wektorowej nad skalarna: ˛ • dane skorelowane (np. pary (wzrost,waga), bloki sasiednich ˛ pikseli); • dane nieskorelowane: wartości odwzorowane na konkretny wektor kodowy nie musza˛ być zdefiniowane w postaci przedziałów, „prostopadłościanów”. (p. wektorowa interpretacja kwantyzacji skalarnej). Algorytm Lindego-Buzo-Graya (LBG), inaczej Generalized Lloyd Algorithm (GLA) edu ε, M – liczba wektorów kodoDane: zbiór wektorów uczacych ˛ {Xn }N n=1 , próg bł˛ wych takie, że N À M . Cel: minimalizacja średniej odległości mi˛edzy wektorem uczacym ˛ a reprezentujacym ˛ go wektorem kodowym. (0) (0) = 0. 1. Wybierz dowolnie zbiór wektorów kodowych {Yi }M i=1 . Niech k = 0, D 1 2. Określ obszary kwantyzacji V1 , . . . , VM w nast˛epujacy ˛ sposób: (k) Vi (k) (k) = {Xn | d(Xn , Yi ) < d(Xn , Yj ) dla każd. j 6= i} (k) Załóżmy, że Vi 6= ∅ dla każdego i ∈ [1, M ]. 3. Oblicz średnia˛ odległość mi˛edzy wektorami uczacymi ˛ a odpowiadajacymi ˛ im wektorami kodowymi D(k) = M X 1 X (k) d(Xj , Yi ). N i=1 (k) Xj ∈Vi 4. Jeśli D(k) −D(k−1) D(k) < ε, zakończ obliczenia. 5. niech nowe wektory kodowe to średnie wartości obszarów kwantyzacji: (k+1) Yj = X 1 (k) |Vj | X ∈V (k) i Xi dla j ∈ [1, M ]. j 6. Niech k := k + 1, przejdź do kroku 2 Wynik algorytmu LBG: • zmierza do minimum lokalnego (funkcji bł˛edu, gdzie zmiennymi sa˛ wartości X 1 , . . . , XM ; • rozwiazanie ˛ optymalne - problem NP-trudny. Problemy techniczne w algorytmie LBG: • Wybór poczatkowych ˛ wektorów kodowych. Technika podziałów: zaczynamy z jednym poczatkowym ˛ wektorem kodowym, po zastosowaniu algorytmu LBG dołaczamy ˛ drugi wektor, uzyskany z pierwszego przez dodanie ustalonego „wektora zaburzeń” γ. Majac ˛ 2i wektorów kodowych, stosujemy LBG i uzyskujemy 2i+1 wektorów przez dodanie zaburzenia do każdego z wynikowych wektorów kodowych. Algorytm par najbliższych sasiadów ˛ (PNN): zaczynamy ze zbiorem wektorów kodowych równym zbiorowi uczacemu. ˛ W każdym kroku (aż do uzyskania M wektorów) wybieramy 2 najbliższe wektory kodowe i zast˛epujemy je ich średnia˛ i stosujemy algorytm LBG. Dokładniej, w metodzie zaproponowanej przez Equitza (1989): 2 – łaczymy ˛ takie dwa wektory kodowe, które zminimalizuja˛ wzrost zniekształcenia (D). – korzystamy tu z własności (Equitz), że połaczenie ˛ obszarów reprezentowanych przez Yi i Yj daje nast˛epujacy ˛ wzrost zniekształcenia: ni nj kYi − Yj k2 , ni + nj gdzie ni i nj to liczba elementów w obszarze Vi i Vj . • Problem pustych obszarów kwantyzacji. Metoda: usuwamy wektor kodowy odpowiadajacy ˛ pustemu obszarowi kwantyzacji, zast˛epujemy go losowo wybranym wektorem uczacym ˛ z obszaru kwantyzacji, który zawiera najwi˛ecej wektorów. Typowe zastosowanie: kompresja obrazów (wektory to bloki rozmiaru n × m, co umożliwia wykorzystanie korelacji poziomych i pionowyc); ograniczeniem jest wzrost rozmiaru słownika i dobór słownika (statyczny czy projektowany dla każdego obrazka osobno, co wymaga dołaczenia ˛ słownika do danych). Patrz: http://www.data-compression.com/vqanim.shtml 1.1 Kwantyzatory o strukturze drzewiastej Idea: chcemy zmniejszyć liczb˛e porównań potrzebna˛ do ustalenia obszaru kwantyzacji, do którego należy dany wektor: • w trakcie działania algorytmu LBG: standardowo konieczne policzenie N · M odległości mi˛edzy punktami w każdej iteracji; • w trakcie kodowania: standardowo, każdy kodowany wektor musi być „porównany” ze wszystkimi N wektorami kodowymi. Metoda: tworzymy zbalansowane drzewo binarne, w każdym w˛eźle umieszczamy wektor, w liściach wektory kodowe; dla ustalenia obszaru kwantyzacji danego wektora Z, w każdym kroku przechodzimy do tego dziecka aktualnego wierzchołka w drzewie, który znajduje si˛e bliżej Z (zaczynajac ˛ od korzenia). Cechy: • czas znalezienia obszaru kwantyzacji dla danego wektora redukuje si˛e z M do d2 log M e; • wzrost zniekształceń: podział na obszary kwantyzacji nie zawsze przyparzadko˛ wuje wektor do obszaru o najbliższym mu wektorze kodowym; 3 • wzrost pami˛eci: oprócz wektorów kodowych, potrzeba M −1 wektorów w wierzchołkach wewn˛etrznych. Ogólna metoda tworzenia kwantyzatora drzewiastego o gł˛ebokości k dla zbioru wektorów X : • jeśli k = 0: utwórz kwantyzator z jednym wektorem kodowym równym średniej z wektorów z X ; • wybieramy dwa poczatkowe ˛ wektory kodowe: Y1 : średnia˛ S z wektorów ze zbioru X ; Y2 : wektor otrzymany z S przez dodanie zaburzenia; • tworzymy kwantyzator z dwoma wektorami kodowymi (stosujac ˛ np. algorytm LBG) Y1 , Y2 ; • dzielimy X na X1 , X2 takie, że X1 składa si˛e z wektorów uczacych ˛ bliższych Y1 a X2 składa si˛e z wektorów uczacych ˛ bliższych Y2 • tworzymy (osobno!) kwantyzatory o gł˛ebokości k − 1 dla zbiorów X1 i X2 . Modyfikacje: „przycinanie” – usuwanie obszarów kwantyzacji, do których należy najmniej wektorów uczacych ˛ (zmniejszanie średniej długości słowa kodowego kosztem wzrostu zniekształceń). 1.2 k-d-drzewa Cel: • implementacja oryginalnej metody LBG! • przyspieszenie wyszukiwania najbliższego wektora kodowego (Y∗ ) dla punktu treningowego X∗ (NNS=nearest neighbor search); • nie wymagamy zmniejszenia złożoności najgorszego przypadku, chcemy poprawić złożoność średniego przypadku. 4 Konstrukcja k-d-drzewa Dane Zbiór punktów S = {X1 , . . . , Xn } w przestrzeni d wymiarowej. Algorytm: 1. Jeśli n = 1: utwórz liść zawierajacy ˛ ten wierzchołek, zakończ. 2. Podziel zbiór S na dwa równoliczne podzbiory S1 i S2 : wybierz jedna˛ ze współrz˛ednych i oraz wartość p taka,˛ że dla połowy punktów i-ta współrz˛edna jest mniejsza od p. 3. Utwórz k-d-drzewa dla S1 i S2 . 4. utwórz wierzchołek symbolizujaccy ˛ podział w punkcie p wg współrz˛ednej i; jego lewym i prawym poddrzewem sa˛ k-d-drzwa dla S1 i S2 . Strategie wyboru współrz˛ednej do podziału • wybierz współrz˛edna˛ o najwi˛ekszej rozpi˛etości (maksymalnej różnicy mi˛edzy najwi˛eksza˛ i najmniejsza˛ wartościa˛ w zbiorze S); • round-robin: współrz˛edne 1, 2, . . . , d, 1, 2, . . . , d, 1, 2 . . . Wynik: • gł˛ebokość drzewa: log n; • złożoność czasowa tworzenia drzewa: – sortowanie po wszystkich współrz˛ednych (tylko raz): O(dn log n); – wybór współrz˛ednej: O(d); podział wg wybranej współrz˛ednej O(dn); – razem: O(dn log n). Struktura wierzchołka w k-d-drzewie (node): • axis: współrz˛edna, wg której dzielimy punkty w tym wierzchołku; • value: wartość graniczna (punkty o mniejszej wartości współrz˛ednej axis w lewym poddrzewie); • left, right: lewe i prawe poddrzewo; • point: punkt przechowywany w wierzchołku, gdy wierzchołek jest liściem. Szukanie najbliższego punktu Dane: k-d-drzewo dla zbioru punktów S = {X1 , . . . , Xn }; punkt q. Wynik: element S położony najbliżej punktu q. Algorytm: NNS(q: point; n: node; var p: point; var w: real) Cel: 5 • dla punktu q chcemy znaleźć najbliższy punkt w zbiorze opisanych w (pod)drzewie o korzeniu n, o ile taki punkt jest w odległości mniejszej niż w; • jeśli najbliższy punkt jest w odległości wi˛ekszej niż w: p i w maja˛ pozostać bez zmian; • jeśli najbliższy punkt jest w odległości mniejszej niż w: p ma wskazywać na najbliższy punkt, w ma być równe odległości od q do tego punktu. • wywołanie poczatkowe: ˛ NNS(q,root,?,infinity) 6 NNS(q: point; n: node; var p: point; var w: real) 1. Jeśli n jest liściem: Jeśli d(n.point, q) < w: w ← d(n.point, q), p ← n.point Zakończ. 2. Jeśli w = ∞: Jeśli q(n.axis) ≤ n.value { przec. z lewym} NNS(q,n.left,p,w) Jeśli q(n.axis) + w > n.value: NNS(q,n.right,p,w). Jeśli q(n.axis) > n.value { przec. z prawym} NNS(q,n.right,p,w) Jeśli q(n.axis) − w ≤ n.value: NNS(q,n.left,p,w). 3. Jeśli w 6= ∞: Jeśli q(n.axis) − w ≤ n.value: NNS(q,n.left,p,w). Jeśli q(n.axis) + w > n.value: NNS(q,n.right,p,w). UWAGI: • każde wywołanie rekurencyjne modyfikuje wartości p i w (jeśli znajdzie bliższy punkt niż dotychczas najbliższy); • q(n.axis) oznacza tutaj współrz˛edna n.axis punktu q; a n.axix to współrz˛edna wg której dokonywany jest podział w wierzchołku n. WŁASNOŚĆ: NNS działa w czasie oczekiwanym log n. Zastosowanie w LBG: • w każdej iteracji tworzymy kd-tree dla aktualnego zbioru wektorów kodowych Y1 , . . . , YM : czas O(M log M ). • aby ustalić obszar kwantyzacji dla punktu Xi , znajdujemy najbliższy mu punkt w kd-tree: czas O(log M ). • czas średni całej iteracji LBG: O(M log M + N log M ) = O(N log M ) (ponieważ N > M ). 7