Algorytm grupowania danych typu kwantyzacji wektorów Wstęp

Transkrypt

Algorytm grupowania danych typu kwantyzacji wektorów Wstęp
Algorytm grupowania danych typu kwantyzacji wektorów
Wstęp
Definicja problemu: Typowe, rozważane dotychczas problemy koncentrowały się na
nauczeniu na podstawie zbioru treningowego i zbioru etykiet klasyfikacji wzorców, które
należały do jednej z kilku kategorii (np. automatyczne przypisywanie odpowiedniego gatunku
kwiatów). Innym typem często spotykanych problemów jest znalezienie w danych
treningowych charakterystycznych grup cechujących się pewnymi podobnymi
właściwościami, przy czym nie mamy wstępnej informacji o przynależności danego wektora
do danej kategorii. Informacje o kategoriach w tym przypadku są niedostępne.
Przykładem zastosowania metod klasteryzacji danych jest problem znajdywania grup
podobnych dokumentów zwracanych przez wyszukiwarkę. (np. http://clusty.com/ )
Algorytm VQ
Algorytm VQ (Victor quantization) działa podobnie do algorytmu LVQ, w którym pominięto
część odpowiadającą za karanie pozostawiając jedynie część nagradzającą (w zależności od
etykiety klasy). Takie rozwiązanie powoduje że wektory kodujące podążają za jednorodnymi
grupami danych.
Optymalizacja wektorów kodujących odbywa się wg. zależności:
pi  pi    x j  pi  (1)
Gdzie
 - współczynnik uczenia
pi – i-ty wektor kodujący leżący najbliżej wektora treningowego xj
Wartości  powinny być aktualizowane wg. zależności  

po każdej iteracji
1 
algorytmu.
Algorytm VQ do działania wymaga zdefiniowania odpowiednich wartości 0 oraz liczby
wektorów kodujących l_w.
Opis algorytmu
Uczenie
1. Wylosuj położenie l_w neuronów - w tym celu najlepiej jest wykorzystać istniejące
już wektory danych i losowo wybrać ze zbioru danych wektory których położenie
będzie inicjowało położenie neuronów
2. Iteracyjnie l-razy
Dla każdego wektora treningowego
Znajdź najbliższy wektor kodujący (dla danej metryki)
Dokonaj aktualizacji położenia (wag) neuronu zgodnie z zależnością (1)
Dokonaj aktualizacji wsp.  wg. zależności (2)
Testowanie (określanie przynależności danego wektora testowego do danej grupy)
1. Ponumeruj wektory kodujące
2. Dla każdego wektora testowego
a. Policz odległości pomiędzy wektorem testowym a wszystkimi neuronami
(wektorami kodującymi)
b. Znajdź neuron leżący najbliżej wektora testowego (min(odległości(x,y)))
c. Przypisz numer najbliższego wektora kodującego do danego wektora
testowego
W matlabie
1. Wczytaj dane
2. Dokonaj standaryzacji / normalizacji danych
3. Wywołaj funkcję vq=vq_ucz(tr,…);
4. Wywołaj funkcje wyn=vq_test(vq,tr)
Funkcja:
function res=vq_ucz(tr,l_w,d_t,l_it)
%uczenie
%
tr – zbiór danych uczacych – UWAGA: tutaj nie ma części X
i Y zbioru danych, gdyż nie znamy wyjścia
% l_w – wektor opisujący liczbę wektorów kodujących
% d_t – typ funkcji odległości
% l_it – liczba iteracji
tr = tr.X;
P=[];
%Inicjowanie położenia wektorów kodujących
rp = randperm(size(tr,1));
rp = rp(1:l_w);
P=[P ; tr(rp,:)];
%uczenie
for i=1:l_it
%dla każdego wektora treningowego
%policz odległości wektora treningowego do wszystkich
wektorów kodujących
d = odległość między tr(i,:) a wszystkimi wektorami P
% znajdż najbliższy wektor kodujący
[min_d,min_id] = min(d);
%min_d – minimalna odległość
%min_id – indeks najbliżej leżącego wektora kodującego
%dokonaj aktualizacji najbliższego wektora kodującego
(wekotra o indeksie min_id) wg. zależności (1)
%zmodyfikuj wsp. uczenia wg. zalezności (2)
end;
res.P = P;
res.dist = d_t;
function wyn = vq_test(vq,tr) %testowanie
%vq – nauczony model VQ
P = vq.P;
tr = tr.X;
d_t = vq.dist;
res = zeros(size(tr,1),1);
for i=1:size(tr,1)
d = odległości wektora tr(i,:) do wszystkich wektorów
kodujących P
%znajdź najbliżej leżący wektor do wekora tr(i,:)
[min_d,min_id] = min(d);
%min_d – minimalna odległość
%min_id – indeks najbliżej leżącego wektora kodującego
res(i) = min_id;
end;
wyn.X = tr;
wyn.Y = res;
Algorytm k-śrtednich (k-means)
Jest wiele odmian algorytmu k-średnich, jego najczęściej spotykana wersja działa na zasadzie
wsadowej (batch) tzn. że najpierw tworzona jest tablica/macierz przynależności U o
wymiarach: l_w x l_n gdzie l_w to liczba klasterów, l_n – to liczba wektorów danych.
Macierz ta ma postać binarną tzn. przyjmuje wartości 1 jeśli dany wektor danych należy do
grupy związanej z danym wektorem kodującym oraz 0 jeśli dany wektor danych nie należy do
danej grupy (danego wektora kodującego).
p1 p2 p3
x1 0
x2 1

x3 1

x4 0
x5 0
1 0
0 0
0 0

0 1
1 0
Każdy wiersz powyższej macierzy powinien spełniać zależność iż suma elementów wiersza
musi być mniejsza od liczby wektorów danych.

l_n
U

j1,l _ w
i 1
j ,i
l_n
Takie ograniczenie pozwala zabezpieczyć się aby pojedynczy klaster nie zagarnął wszystkich
wektorów danych. Drugie ograniczenie służy zapewnieniu by dany wektor przynależał
dokładnie do jednej grupy, a sprowadza się ono do zależności

i1,l _ n
l_w
U
j 1
j ,i
1
Algorytm k-średnich działa na zasadzie realizacji dwóch kroków 1) wyznaczenia położenia
środków centrów klasterów P na podstawie macierzy U 2) aktualizacji macierzy U na
podstawie nowych środków centrów P
Opis algorytmu
Uczenie
1. Zainicjuj położenie centrów P
2. Dokonaj aktualizacji macierzy U, (przypisz dane do odpowiednich środków klasterów
P)
3. Wyznacz położenia środków klasterów - oblicz wartość średnią z wszystkich
przypadków należących do danego klastera
4. Porównaj położenia środków centrów klastra z poprzedniej iteracji i obecnej. Jeśli nie
uległy zmianie to koniec
5. Idź do 2
W matlabie
5. Wczytaj dane
6. Dokonaj standaryzacji / normalizacji danych
7. Wywołaj funkcję ks = ksrednich_ucz(tr,…);
8. Wywołaj funkcję res = ksrednich_ucz(ks,tr);
Funkcja:
function res=ksrednich_ucz(tr,l_w,d_t)
%uczenie
% l_w – wektor opisujący liczbę wektorów kodujących
% d_t – typ funkcji odległości
tr = tr.X;
l_n = size(tr,1);
%zainicjowanie macierzy U
U = false(l_n,l_w); %
%Inicjowanie położenia wektorów kodujących
rp = randperm(size(tr,1));
rp = rp(1:l_w);
P = tr(rp,:);
%uczenie
While true
%dla każdego wektora treningowego znajdź najbliższy środek
klastra i dokonaj aktualizacji macierzy U
d = odległość(P(k,:),tr(j,:))
U(j,:) = 0;
U(j,k_min) = 1;
End;
%Dokonaj aktualizacji środków centrów P
for i=1:l_w
P(i,:)=mean(tr(U(i,:),:));
%Jeżeli żaden z wektorów danych nie należy do klastra
definiowanego przez i-ty wektor P to zainicjuj P
jeszcze raz
If any(isnan(P(i,:)))
r = round((rand(1)*(n-1)))+1;
P(i,:) = tr(r,:);
End;
end;
%dodaj warunek zakończenia procesu uczenia polegający na
niezmienności macierzy U, tzn jeśli w klejnych iteracjach
pętli while U nie zmienia się zakończ pętlę.
End
res.P = P;
res.dist = d_t;
function wyn=ksrednich_test(ks,tr)
%testowanie
tr = tr.X;
P = ks.P;
d_t = ks.dist;
res = zeros(size(tr,1),1);
for i=1:size(tr,1)
d = odległości wektora tr(i,:) do wszystkich wektorów
kodujących P
%znajdź najbliżej leżący wektor do wekora tr(i,:)
[min_d,min_id] = min(d);
%min_d – minimalna odległość
%min_id – indeks najbliżej leżącego wektora kodującego
res(i) = min_id;
end;
wyn.X = tr;
wyn.Y = res;
Zadanie:
1. Wczytaj zbiór danych Iris
2. Wykonaj obliczenia tylko dla dwóch atrybutów i-tegi i j-tego zbioru danych
Np. Data.X = Data.X(:,[3 4])
Dla obydwu algorytmów klasteryzacji
3. Do reprezentacji wyników wykorzystaj funkcję plot_clust(data,res)
Gdzie:
Data – zbiór danych uczących
Res – wynik klasteryzacji
4. Zbadaj wpływ funkcji odległości na jakość uczenia algorytmu VQ
5. Zbadaj wpływ liczby wektorów kodujących na jakość klasteryzacji