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 j1,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 i1,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