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