lab 13 - Analiza skupień
Transkrypt
lab 13 - Analiza skupień
Analiza skupień Konspekt do zajęć: Statystyczne metody analizy danych Agnieszka Nowak-Brzezińska 28 maja 2012 1 Wprowadzenie Celem laboratorium jest analiza skupień wybranych zbiorów danych w środowisku R. Jest to metoda dokonująca grupowania (podziału) obiektów danego zbioru na względnie jednorodne klasy. Podstawą grupowania w większości algorytmów jest podobieństwo pomiędzy obserwacjami - wyrażone przy pomocy funkcji (metryki) podobieństwa. Istnieje wiele implementacji algorytmów analizy skupień w środowisku R, w ramach zajęć zostaną omówione te realizujące algorytmy: • niehierarchiczne: k - średnich dostępny z funkcją k-means oraz k-medoidów dostępny z funkcją pam, • hierarchiczne: agnes (ang. AGlomerative NESting) (dostępny z funkcją agnes) oraz hierarchiczny algorytm grupowania dostępny z funkcją hclust i możliwy do prezentacji graficznej dzięki funkcji plot. Każdy z pakietów uzupełniony jest o dokumentację, której znajomość pozwala wykonać poprawne analizy danych: • http://cran.r-project.org/web/packages/cluster/cluster.pdf • http://stat.ethz.ch/R-manual/R-patched/library/stats/html/00Index. html • http://cran.r-project.org/web/packages/mclust/mclust.pdf 2 Analiza skupień Grupowanie (ang. data clustering), zwane również analizą skupień lub klasyfikacją nienadzorowaną polega na podziale pewnego zbioru danych O O = {xi = (xi1 , . . . , xid )|i=1,...,N } gdzie xi jest d-wymiarowym wektorem cech opisujących obiekt należący do zbioru, na pewne podzbiory wektorów (grupy). Podstawowym założeniem dotyczącym wynikowego podziału jest homogeniczność obiektów wchodzących w skład jednej grupy oraz heterogeniczność samych grup – oznacza to, że wektory stanowiące jedną grupę powinny być bardziej podobne do siebie niż do wektorów pochodzących z pozostałych grup. Wynikiem grupowania N -elementowego zbioru O na c grup jest zazwyczaj tzw. macierz podziału B o wymiarze c × N , w 1 której dany element bik oznacza stopień przynależności wektora xk do grupy Gi (wartość 1 świadczy o całkowitej przynależności wektora do grupy, natomiast 0 oznacza, że wektor do danej grupy wogóle nie należy). Ze względu na przyjęte założenia dotyczące przynależności wektorów do grup mówi się o trzech głównych typach podziałów: P odz c (N ) = G1 , . . . , Gc |Gi ⊆O Podział twardy (ang. hard ) uzyskuje się w efekcie takiego grupowania, w którym każdy wektor należy tylko do jednej grupy. Macierz podziału spełnia wtedy następujące warunki: • ∀1 ≤ i ≤ c , 1 ≤ k ≤ N : bik ∈ {0, 1}, co oznacza, że każdy wektor należy albo nie należy do danej grupy, ∑c • ∀1 ≤ k ≤ N : i=1 bik = 1, co oznacza, że wektor należy tylko do jednej grupy, ∑N • ∀1 ≤ i ≤ c : 0 < k=1 bik < N , co z kolei oznacza, że wszystkie grupy są niepuste. Istnieją także podziały: rozmyty oraz posybilistyczny ale z uwagi na fakt, że nie są one tematem tego opracowania, nie będziemy ich opisywać. Biorąc pod uwagę sposób tworzenia skupień, techniki analizy skupień można podzielić na dwie podstawowe kategorie: niehierarchiczne oraz hierarchiczne. Celem algorytmów niehierarchicznych jest znalezienie takiego podziału zbioru na zadaną liczbę podzbiorów, aby uzyskać optymalną wartość pewnego kryterium. Optymalizację kryterium osiąga się np. poprzez iteracyjne przemieszczanie obiektów między grupami. Metody hierarchiczne konstruują (jak sama nazwa sugeruje) pewną hierarchię skupień, która najczęściej reprezentowana jest graficznie w postaci drzewa binarnego nazywanego dendrogramem. W liściach takiego drzewa znajdują się elementy analizowanego zbioru, węzły natomiast stanowią ich grupy. Najbardziej pożądane cechy, jakich oczekuje się od algorytmów grupujących, to m.in.: • jak najmniejsza liczba parametrów, które trzeba dostarczać z zewnątrz, • jak najmniejsza krotność analizy elementów zbioru uczącego, • niewrażliwość na różnice w kształcie, wielkości czy gęstości grup, • zminimalizowany wpływ danych odstających na wynik przetwarzania, • możliwość przetwarzania różnych typów danych (ciągłych, dyskretnych oraz kombinacji obu jednocześnie), • niezależność wyniku od kolejności, w jakiej podawane są dane, • skalowalność rozumiana jako zdolność do przetwarzania bardzo dużych zbiorów danych, • przystosowanie do analizy danych o różnej wymiarowości. 2 2.1 Metody niehierarchiczne Algorytmy w ramach tych metod poszukują najlepszego podziału zadanego zbioru danych poprzez stopniową optymalizację, tzn. poprawę pewnych wskaźników jakości grupowania, uzyskiwanego w kolejnych etapach przetwarzania zbioru wejściowego. Początkowego podziału dokonuje się najczęściej w sposób losowy. Znaczącym z punktu widzenia końcowej klasyfikacji parametrem wejściowym jest liczba k, którą przekazuje się jako wartość zadaną lub wyznacza w sposób losowy — decyduje ona o liczbie skupień otrzymanych w wyniku działania algorytmu. Z tego samego powodu istotnym jest dobór odpowiedniej funkcji kryterialnej, którą mierzona będzie jakość gru powania (stopień rozproszenia wektorów w poszczególnych grupach). Dziedziną funkcji kryterialnej J jest zbiór danych wejściowych O oraz wektor parametrów v = (v1 , . . . , vk ), gdzie k oznacza liczbę grup, a vi wektor parametrów określających i-tą grupę. Składowe wektora v stanowią reprezentacje poszczególnych skupień i nazywane są reprezentantami (prototypami) grup. Doboru odpowiedniej funkcji kryterialnej dokonuje się głównie w zależności od oczekiwanego kształtu grup. 2.1.1 Ogólny schemat postępowania W przypadku metod iteracyjnych algorytm grupowania składa się z następujących kroków: 1. wstępna inicjalizacja : wybierz k obiektów, które będą stanowić prototypy grup, 2. przypisuj pozostałe obiekty do grup tak, aby osiągnąć najlepszy podział (zgodnie z przyjętą funkcją kryterialną), 3. dla każdego otrzymanego skupienia wybierz ponownie prototyp, 4. powtarzaj poprzednie kroki tak długo, jak długo przyjęte kryterium będzie się poprawiać. Wadą metody jest jej zachłanność, przez co w wyniku otrzymuje się jedynie optimum lokalne i nie ma gwarancji osiągnięcia optimum globalnego. Największą jej zaletą jest łatwość implementacji i stosunkowo mała złożoność obliczeniowa. 2.1.2 Algorytm k-średnich Ten klasyczny algorytm analizy skupień, na wstępie ustala wartość parametru k — decydującą o liczbie grup, które zostaną wyodrębnione ze zbioru danych. W sposób losowy wybiera się k reprezentantów tak, aby byli oni możliwie jak najbardziej od siebie oddaleni. Wybrane elementy stanowią zalążki grup (prototypy). W kolejnym kroku każdy element zbioru przypisywany jest do najbliższej mu grupy. Na tym etapie wyznaczone są grupy początkowe. Dla każdej z grup obliczany jest jej środek na podstawie średniej arytmetycznej współrzędnych obiektów do niej należących. Następnie rozważane i ponownie przydzielane do najbliższej (ze względu na odległość od poszczególnych centroidów) grupy są wszystkie obiekty. Tak długo nowe środki grup są wyznaczane i sprawdzana jest poprawność przynależności elementów do grup, jak długo występuje migracja obiektów pomiędzy skupieniami. Jeśli w kolejnych dwóch przebiegach algorytmu nie nastąpi żadna zmiana w dokonanym podziale (mówi się wtedy o 3 osiągnięciu stabilizacji), przetwarzanie dobiega końca. Jak widać, w metodzie tej liczba grup jest stała i zgodna z wartością parametru k, zmieniać się może tylko przynależność obiektów do grup. W metodzie k-średnich (ang. k-means) poszukiwanie optymalnego podziału odpowiada wyznaczeniu takich prototypów grup, które minimalizują następującą funkcję kryterialną: J(v, B) = k ∑ N ∑ bik d2 (vi , xk ). i=1 k=1 W funkcji tej d(v, x) oznacza odległość elementu reprezentowanego przez wektor x od grupy wyznaczonej przez prototyp (centroid, środek grupy) v, N to liczebność zbioru O, B to macierz podziału, a pozostałe parametry mają takie same znaczenie jak podano wcześniej. Zasadę działania metody można opisać następująco: 1. podziel wstępnie zbiór na k skupień, 2. dla każdego skupienia policz jego centroid (środek ciężkości grupy), 3. przypisz każdy z elementów zbioru do najbliższej mu grupy ( odległość od grupy jest w tym przypadku tożsama z odległością od centroidu), 4. powtarzaj dwa poprzednie kroki tak długo, jak długo zmienia się przyporządkowanie obiektów do skupień. Przykład podziału obiektów do k grup przedstawia rysunek 1. Rysunek 1: Przykład podziału obiektów do k skupień Niestety algorytm k-średnich ma wiele wad. Już na wstępie konieczne jest zdefiniowanie liczby grup, chociaż zazwyczaj nie wiadomo, jak wiele grup występuje w przetwarzanym zbiorze. Początkowe centroidy wybierane są w sposób losowy, podczas gdy ich wybór ma decydujący wpływ na jakość otrzymanego grupowania. Metoda jest zbieżna do lokalnego optimum, a jednokrotne wykonanie algorytmu zazwyczaj nie daje w wyniku optymalnego podziału analizowanego zbioru. Ponadto algorytm jest mało odporny na zaszumione dane. Mimo wszystkich wad jest to wciąż jedna z najczęściej wykorzystywanych metod iteracyjnych, ponieważ jest ona prosta w implementacji, a jej niewielka złożoność obliczeniowa wynosi O(tkn), gdzie n jest liczebnością zbioru, k jest liczbą grup i t jest liczbą iteracji, przyczym k, t ≪ n. Konieczność wstępnego określenia 4 liczby podgrup można zrekompensować, wywołując metodę z różnymi wartościami parametru k i oceniając otrzymane podziały za pomocą jakiegoś kryterium oceny jakości grupowania. 2.1.3 Algorytm k-medoidów Wady algorytmu k-średnich są na tyle istotne, że często dąży się do zastosowania innych algorytmów w ramach grupy metod niehierarchicznych, ale takich, które wolne są od tychże wad. Jednym z takim algorymtów jest k-medoid, który to w odróżnieniu od algorytmu k-średnich w kolejnych etapach algorytmu nowe prototypy grup wyznaczane są spośród obiektów należących do rozpatrywanego zbioru. Wystarczającym dla zrozumienia idei tego algorytmu jest wgląd w tutorial dostępny na stronie http://en.wikipedia.org/wiki/K-medoids. W środowisku R realizuje go funkcja pam() z pakietu cluster. 2.2 Metody hierarchiczne Metody niehierarchiczne mają to do siebie, że formują pojedynczy podział, który dostarcza ”płaskiej” charakterystyki zbioru. Tymczasem często spotykaną sytuacją są grupy, które zawierają podgrupy, te z kolei składają się z podgrup itd. Tę właśność doskonale oddają algorytmy hierarchiczne. W zależności od tego jaki zastosujemy algorytm grupowania hierarchicznego: aglomeracyjny czy deglomeracyjny, inny jest przebieg algorytmu, oraz jego ostateczny rezultat. Metody aglomeracyjne rozpoczynają tworzenie hierarchii od podziału zbioru n obserwacji na n jednoelementowych grup, które w kolejnych krokach są ze sobą scalane. Metody deglomeracyjne inicjowane są jedną grupą n-elementową, a hierarchia tworzona jest poprzez sukcesywny podział na coraz mniejsze grupy. W praktyce rzadko dąży się do utworzenia pełnej hierarchii podziałów, ponieważ ostatni jej etap (tzn. n grup jednoelementowych lub jedna grupa n-elementowa) nie wnosi zbyt wielu nowych informacji na temat charakterystyki analizowanego zbioru danych. Zazwyczaj proces tworzenia hierarchii przerywa się w pewnym, z góry założonym momencie, kiedy zostanie spełniony tzw. warunek stopu. Warunkiem takim może być np. pożądana liczba skupień, stopień (nie) podobieństwa pomiędzy wydzielonymi grupami itp. Optymalnym wydaje się kryterium maksymalnego podobieństwa wewnątrz grup - minimalnego między grupami. Inaczej mówiąc, proces aglomeracji jest uzasadniony tak długo dopóki podobieństwo wewnątrz tworzonych grup jest zawsze większe niż podobieństwo między którąkolwiek z grup. 2.2.1 Dendrogram Najbardziej popularnym i naturalnym sposobem reprezentacji wyników grupowania hierarchicznego jest graficzny zapis w postaci drzewa binarnego nazywanego dendrogramem. Zapis taki można wzbogacić o informację dotyczącą stopnia niepodobieństwa (dendrogram niepodobieństwa) pomiędzy poszczególnymi grupami poprzez dodanie osi skojarzonej zużytą miarą niepodobieństwa — poziom łączenia grup odpowiada wówczas wartości ich niepodobieństwa. Fakt, że budujemy drzewo binarne jest bardzo istotny. Okazuje się, że będąc na k-tym poziomie w drzewie wiemy na pewno, że utworzonych jest wówczas c grup, gdzie c = n − k + 1. Wobec tego poziom pierwszy odpowiada podziałowi na n 5 grup, natomiast poziom n-ty jednej grupie. Przykład dendrogramu przedstawia rysunek 2. Rysunek 2: Przykład dendrogramu 2.2.2 Algorytmy aglomeracyjne Najprostsza wersja algorytmu aglomeracyjnego składa się z następujących kroków: 1. niech c będzie oczekiwaną liczbą grup, a N liczebnością analizowanego zbioru (oczywiście c ≤ N ); wstępna inicjalizacja: podziel zbiór na N jedno elementowych grup, 2. znajdź dwie najbliższe (w sensie przyjętej miary) grupy; nazwijmy je Gi oraz Gj , 3. scal ze sobą Gi i Gj zmniejszając w ten sposób liczbę grup o 1, 4. powtarzaj dwa poprzednie kroki tak długo, aż liczba otrzymanych grup osiągnie założoną na wstępie wartość c. Niezwykle istotne są kroki: 2 i 3. Otóż znajdowanie dwóch najbliższych grup, zależy od wybranej metryki podobieństwa bądź odległości. Nie wszystkie bowiem miary nadają się do określonego typu danych. Źle dobrana metryka może wskazywać jako najbardziej w danym momencie podobne do siebie grupy, które tak naprawdę wcale podobnymi nie są. Jeszcze ważniejszym i bardziej wpływowym - jest sposób (określony krokiem 3) scalenia ze sobą grup Gi oraz Gj , gdyż wiąże się on także z budową nowej grupy Gk , ale i jej reprezentanta. W pierwszym kroku algorytmu, podział ma postać: P odz0N (N ) = {Gi = {xi }, i = 1, ..., N } a w kolejnych krokach algorytmu przyjmuje odpowiednio postać: N −t+1 P odztN −t (N ) = {P odzt−1 (N ){Gi , Gj }} ∪ {Gk } , gdzie t oznacza kolejny krok algorytmu, a jednocześnie poziom w hierarchii. W każdym kroku spośród wszystkich par grup (Gr , Gs ) wybiera się taką parę N −t+1 (Gi , Gj ), że D(Gi , Gj ) = min D(Gr , Gs ), Gr, Gs ∈ P odzt−1 , Gr ̸= Gs . W macierzy niepodobieństwa P (t) postaci: P (i, j, t) = D(Gi , Gj ), i, j = 1, ..., N − t, 6 konieczna jest po każdym scaleniu dwóch grup Gi i Gj aktualizacja, polegająca na tym, że w usuwa się z macierzy kolumnę o większym indeksie i lub j, a w kolumnie o mniejszym indeksie wpisujemy wartości odległości każdej grupy do nowo powstałej grupy Gk . Metody łączenia obiektów związane są właśnie z obliczeniem tej odległości. Jeśli Gk = Gi ∪ Gj , Gk ∈ P odztN −t (N ) oraz N −t+1 Gi , Gj , Gs ∈ P odzt−1 (N ) są parami różne, macierz niepodobieństwa jest aktualizowana w następujący sposób: • dla metody najbliższego sąsiada: D(Gk , Gs ) = min{D(Gi , Gs ), D(Gj , Gs )}, • dla metody najdalszego sąsiada: D(Gk , Gs ) = max{D(Gi , Gs ), D(Gj , Gs )}, • dla metody średniej: D(Gk , Gs ) = 21 {D(Gi , Gs ) + D(Gj , Gs )} Metoda najbliższego sąsiada jest najczęściej wykorzystywana, ze względu na małą złożoność, oraz dużą intuicyjność wybranego podobieństwa. Jednak jest też podatna na tzw. zjawisko łańcuchowania, polegające na przypisywaniu długich ciągów punktów do tego samego skupienia (w odróżnieniu od tworzenia zwartych kulistych skupień), co — w zależności od oczekiwanego kształtu grup — może być traktowane jako wada algorytmu. Na przykład, jeśli pomiędzy dwoma wyraźnie odrębnymi, kulistymi skupieniami znajdzie się punkt tworzący pewnego rodzaju most je łączący, metoda dokona niepożądanego scalenia obu skupień i w rezultacie powstanie duża, wydłużona grupa, niezgodna z właściwą charakterystyką zbioru. Inną wadą tej metody łączenia skupień jest podatność na szumy oraz niewielkie zmiany pozycji obiektów. Ilustracją graficzną tej metody jest rysunek 3. Rysunek 3: Metoda najbliższego sąsiada Metoda najdalszego sąsiada — w przeciwieństwie do poprzedniej — nie ma tendencji do przyrostu wydłużonych skupień. Łączone są skupienia zawierające punkty, które w ustalonej przestrzeni metrycznej są położone najdalej od siebie. Metoda wykazuje tendencję do grupowania elementów znajdujących się na brzegach obszaru określoności w jedno skupienie, natomiast bardziej wewnętrzne punkty przydzielane są do reszty zadeklarowanych skupień. Ilustracją graficzną tej metody jest rysunek 4. Metody najbliższego i najdalszego sąsiada reprezentują dwa skrajne podejścia do pomiaru odległości pomiędzy skupieniami. Żadne z nich nie jest pozbawione wad, podczas gdy użycie metod pośrednich wydaje się być najbardziej oczywistym sposobem na ich uniknięcie. Ilustracją graficzną tej metody jest rysunek 5. 7 Rysunek 4: Metoda najdalszego sąsiada Rysunek 5: Metoda średniej odległości Podane miary nie wyczerpują wszystkich możliwości definiowania kryterium kolejnych połączeń. Metody te mogą być zestawiane ze sobą tworząc nowe bardziej specjalizowane rozwiązania. 3 Analiza skupień w środowisku R Zakładamy, że przed wykonywaniem analiz w środowisku R student zapoznał się z podstawowymi algorytmami grupowania. Podstawową kwestią jest podział metod analizy skupień na hierarchiczne i niehierarchiczne (k-optymalizacyjne). Istotnym na tym etapie jest świadomość, że efektem metody hierarchicznej jest algomeracja bądź deglomeracja obiektów, która przyjmuje najczęściej postać dendrogramu (drzewo z korzeniem i liścmi). Metody niehierarchiczne - jak sama nazwa wskazuje - nie budują hierarchii. Tutaj obiekty mogą być prezentowane jako punkty na płaszczyźnie, i zakłada się, że te z punktów, które na wykresie rozrzutu są w dość bliskiej odległości wobec siebie, tworzą skupienie. Problemem jest fakt, że algorytmy (te bardziej klasyczne) wymagają podania z góry liczby skupień, podczas gdy bardzo często nie znamy tej liczby. Stosuje się oczywiście różne modyfikacje, które starają się tę optymalną liczbę skupień oszacować, jednak proces taki wymaga wielokrotnych uruchomień dla zmienionych parametrów, co znaczenie wydłuża czas grupowania. Inną zupełnie kwestią jest spory zbiór wad tych algorytmów, które czasami mogą wręcz uniemożliwić ich zastosowanie. Wykorzystanie metod analizy skupień w środowisku R jest możliwe dzięki użyciu następujących pakietów: standardowego pakietu stats, pakietu cluster oraz dodatkowo pakietów flexclust i mclust02. Zakładamy, że czytelnikowi znany jest zbiór danych o nazwie IRIS z repozytorium UCI Machine Learning udostępniony również w ramach środowiska R. Zbiór przedstawia informacje o 150 kwiatach (irysach) opisanych czterema cechami numerycznymi (Sepal.Length, Sepal.W idth, P etal.Length, P etal.W idth) i jednym atrybutem jakościowym species (klasyfikującym kwiaty do jednej z trzech grup: setosa, virginica lub versicolor). Wiedząc, że algorytm k-średnich (ang. k-means) wymaga, aby wszystkie cechy były ilościowymi (podczas gdy ostatnia kolumna w zbiorze IRIS 8 zawiera dane jakościowe) pominiemy tę kolumnę w obliczeniach i przedstawimy podstawowe informacje o takim zbiorze danych, czego efektem będzie następujący ciąg informacji pakietu R: > dane = iris[,1:4] > summary(dane) Sepal.Length Sepal.Width Min. :4.300 Min. :2.000 1st Qu.:5.100 1st Qu.:2.800 Median :5.800 Median :3.000 Mean :5.843 Mean :3.057 3rd Qu.:6.400 3rd Qu.:3.300 Max. :7.900 Max. :4.400 > Petal.Length Min. :1.000 1st Qu.:1.600 Median :4.350 Mean :3.758 3rd Qu.:5.100 Max. :6.900 Petal.Width Min. :0.100 1st Qu.:0.300 Median :1.300 Mean :1.199 3rd Qu.:1.800 Max. :2.500 Wywołanie algorytmu k-średnich gdy znamy optymalną liczbę skupień (dla zbioru IRIS to 3 grupy) jest dość proste. Realizacja grupowania przy użyciu metody k-means może być następująca: > klaster = kmeans(dane,3) > plot(dane, pch=klaster$cluster) czego wynikiem będzie wykres z rozkładem wartości obserwacji w zbiorze iris osobno dla każdej z 4 cech opisujących te obserwacje: P etal.Length, P etal.W idth, Sepal.Length, Sepal.W idth. Efekt będzie zbliżony do tego co przedstawia rysunek refirisA1. 3.0 4.0 0.5 1.5 2.5 6.5 7.5 2.0 4.0 4.5 5.5 Sepal.Length 1 2 3 4 5 6 7 2.0 3.0 Sepal.Width 1.5 2.5 Petal.Length 0.5 Petal.Width 4.5 5.5 6.5 7.5 1 2 3 4 5 6 7 Rysunek 6: Realizacja funkcji kmeans dla zbioru iris - cztery zmienne Gdybyśmy chcieli jednak sprawdzić jak wygląda podział obiektów na również 3 skupienia, ale biorąc pod uwagę jedynie dwie pierwsze zmienne je opisujące: Sepal.Length oraz Sepal.W idth, wówczas koniecznym jest wywołanie następujących komend środowiska R: dane = iris[,1:2] > klaster = kmeans(dane,3) > plot(dane, pch=klaster$cluster) , czego efekt będzie zbliżony do tego, co przedstawia rysunek 7. 9 4.0 3.5 3.0 Sepal.Width 2.5 2.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 Sepal.Length Rysunek 7: Realizacja funkcji kmeans dla zbioru iris - dwie zmienne Wykres będzie czarnobiały i bez dodatkowych opcji odnośnie kolorów czy symboli nie będzie zbyt atrakcyjny wizualnie. Dlatego warto wspomóc się chociażby ingerencją w kolorystykę (parametr col) oraz symbol obserwacji (parametr pch, np pch = 3 to symbol ’+’). Wynikiem wywołania następujących komend: > cl<-kmeans(dist(dane),3,20) > plot(dane,pch=19,col=cl$cluster,main="k-means") będzie wykres taki jak na rysunku 8. Problem z umiejętnością oszacowania prawidłowej liczby skupień obrazuje następujący fragment kodu dla środowiska R: > cl<-kmeans(dist(dane),8,20) > plot(dane,pch=18,col=cl$cluster,main="k-means") którego efektem będzie następujący wykres (rysunek 9): Wykresy tak generowane są odpowiednio jasne do interpretacji gdy znamy prawidłową liczbę grup. Jednak gdy dla zbioru IRIS próbowalibyśmy zbudować nie 3 (jak być powinno) lecz 8 grup, otrzymany podział nie jest już wogóle czytelny. Podobnie widać to, gdy zmieniejszymy liczbę zmiennych analizowanych w procesie grupowanie obiektów zbioru IRIS. Mianowicie, gdy weźmiemy pod uwagę tylko dwie pierwsze zmienne: Sepal.Lenght oraz Sepal.W idth, i spróbujemy podzielić te 150 obserwacji na 8 grup, wykonamy następujący kod środowiska R: > dane = iris[,1:2] > cl<-kmeans(dist(dane),8,20) > plot(dane,pch=18,col=cl$cluster,main="k-means") a efekt takiego wykonania będzie taki jak to przedstawia rysunek 10. 10 k−means 3.0 4.0 0.5 1.5 2.5 4.5 5.5 6.5 7.5 2.0 4.0 Sepal.Length 1 2 3 4 5 6 7 2.0 3.0 Sepal.Width 1.5 2.5 Petal.Length 0.5 Petal.Width 4.5 5.5 6.5 7.5 1 2 3 4 5 6 7 Rysunek 8: Realizacja funkcji kmeans dla zbioru iris Poświęcając więcej uwagi funkcji kmeans, zauważymy, że ogólna formuła tej funkcji ma postać: kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong", "Lloyd", "Forgy", "MacQueen")) , gdzie: x - to macierz z danymi podlegającymi grupowaniu, centers - to albo liczba skupień, które chcemy utworzyć, albo podane początkowe centra skupień. Jeśli jest to liczba skupień, wówczas procedura wyboru potencjalnych centrów skupień odbywa się w sposób losowy, iter.max - to maksymalna liczba iteracji, nstart - jeśli w center podano liczbę grup, to parametr nstart określa liczbę losowych zbiorów branych pod uwagę w grupowaniu, algorithm - określa, który algorytm będzie wykonany spośród dostępnych: Hartigan and Wong (1979) (domyślny), MacQueen (1967), Lloyd (1957) czy Forgy (1965). 11 k−means 3.0 4.0 0.5 1.5 2.5 4.5 5.5 6.5 7.5 2.0 4.0 Sepal.Length 1 2 3 4 5 6 7 2.0 3.0 Sepal.Width 1.5 2.5 Petal.Length 0.5 Petal.Width 4.5 5.5 6.5 7.5 1 2 3 4 5 6 7 Rysunek 9: Realizacja funkcji kmeans dla zbioru iris - 8 grup Odpowiednio manipulując tymi parametrami można optymalizować budowane skupienia obiektów w danym zbiorze. Grupowanie realizowane jest także poprzez metodę mclust z pakietu o tej samej nazwie. W podstawowej wersji wywołania metody nie podaje się liczby skupień, a jedynie zbiór danych, które chcemy pogrupować (patrz poniżej na komendy R). > dane.mcl<-Mclust(dane) > skupienia<-dane.mcl$classification > plot(dane,pch=19,col=skupienia,main="Mclust") Utworzony w wyniku wykres będzie bardzo podobny do tego utworzonego przez metodę kmeans. W pakiecie stats dostępna jest funkcja, pozwalająca klasyfikować obiekty do jednej z utworzonych grup, pozwalając jednocześnie na sterowanie nie tylko liczbą tworzonych skupień, ale i poziomem odcięcia w tworzonym drzewie. Mowa tutaj o funkcji cutree. Ogólna formuła ma postać: cutree(tree, k = NULL, h = NULL) gdzie odpowiednio: tree - jest rezultatem wywołania funkcji hclust, k - liczba skupień, h - poziom odcięcia drzewa (tree). 12 3.5 3.0 2.0 2.5 Sepal.Width 4.0 k−means 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 Sepal.Length Rysunek 10: Realizacja funkcji kmeans dla zbioru iris - 8 grup - 2 zmienne Przykład komendy zawierającej wywołanie tej funkcji wygląda następująco dla znanego już zbioru iris: > hc <- hclust(dist(dane)) > cutree(hc, k=3) Rezultatem takiego wywołania jest wektor prezentujący przydział poszczególnych obserwacji zbioru wejściowego do utworzonej liczby grup: [1] [43] [85] [127] 1 1 3 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 3 2 1 1 3 2 1 1 3 2 1 1 2 2 1 2 3 2 1 2 3 2 1 2 3 2 1 3 3 2 1 2 3 2 1 3 2 2 1 2 3 2 1 3 3 2 1 2 2 2 1 3 2 2 1 3 2 2 1 3 2 2 1 3 2 2 1 2 2 2 1 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 2 3 2 3 2 2 2 2 2 2 2 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 Fakt, że algorytm k - średnich cechuje się licznymi wadami, sprawia, że chętniej używanym jest algorytm np. k-medoidów. W środowisku R, w ramach pakietu cluster, dostępna jest funkcja pam() realizująca algorytm o nazwie PAM (ang. Partitioning Around Medoid ). Przykładem jej wywołania dla zbioru iris jest następująca komenda: > kluster <- pam(dane,3) > sil <- silhouette(kluster) > summary(sil) czego efektem będą następujące wyniki: Silhouette of 150 units in 3 clusters from pam(x = dane, k = 3) : Cluster sizes and average silhouette widths: 13 50 62 38 0.7981405 0.4173199 0.4511051 Individual silhouette widths: Min. 1st Qu. Median Mean 3rd Qu. Max. 0.02636 0.39110 0.56230 0.55280 0.77550 0.85390 Możemy odczytać podział algorytmem pam tych 150 obiektów (kwiatów ze zbioru IRIS) do 3 skupień. Widzimy rozkład obiektów do 3 klas oraz podstawowe statystyki tj. mediana, moda, pierwszy i trzeci kwartyl oraz elementy minimalny i maksymalny. Dodając polecenie: > plot(sil, col = c("red", "green", "blue")) zobrazujemy ów podział (rysunek 11). Silhouette plot of pam(x = dane, k = 3) 3 clusters Cj j : nj | avei∈Cj si n = 150 1 : 50 | 0.80 2 : 62 | 0.42 3 : 38 | 0.45 0.0 0.2 0.4 0.6 0.8 1.0 Silhouette width si Average silhouette width : 0.55 Rysunek 11: Wykres metody k-medoidów Jeżeli dla tego samego zbioru danych chcemy zastosować algorytm grupowania hierarchicznego, możemy użyć funkcji hclust a do jej graficznej reprezentacji funkcji plot, tak jak to pokazuje kod: > d <- dist(dane, method = "euclidean") > fit <- hclust(d, method="ward") > plot(fit) Efektem będzie wykres zwany dendrogramem, z tym, że będzie on mało czytelny dla dużych zbiorów obserwacji, z tego względu, że wszystkie liście drzewa są wyrysowane na jednym poziomie na wykresie, i zwyczajnie nachodzą na siebie. Klasycznym algorytmem hierarchicznym jest właśnie algorytm aglomeracyjny, którego jednym z wersji jest algorytm o nazwie agnes (ang. AGlomerative NESting). Został on również zaimplementowany w środowisku R i realizowany jest przez wywołanie komendy o tej samej nazwie co nazwa algorytmu a więc agnes: klaster = agnes(dane, method="average") > plot(klaster) 14 Oczywiście drugi argument wywołania fuknkcji: method może przyjmować różne wartości w zależności od tego jaką metodę łączenia skupień wybierzemy mając do dyspozycji metody: najbliższego sąsiada, najdalszego sąsiada, średnich wiązań itp. Efektem wywołania funkcji plot z argumentem w postaci rezultatu funkcji agnes będzie dendrogram, który już jest bardziej czytelny, gdyż poszczególne poziomy drzewa są prezentowane na różnej wysokości na wykresie (jak to przedstawia rysunek 12). 1 18 41 28 29 8 40 50 536 38 24 27 44 21 32 37 6 19 11 49 20 22 4717 2 45 46 13 10 35 26 43 48 30 31 257 912 39 4 3 23 14 15 16 33 34 42 51 53 87 77 78 55 59 66 76 5286 57 64 92 79 74 72 75 98 69 88120 71 128 139 150 73 84 134 124 127 102 1431147 14 122 115 54 90 70 81 82 60 65 80 56 91 67 85 62 89 96 97 95 100 68 83 93 63107 58 9499 61 101 121 144 141 145 125 116 137 149 104 117 138 112 105 129 133 111 148 113 140 142 146 109 103135 126 130 108 131 136 106 123 119 118 132 110 0 1 Height 2 3 4 Dendrogram of agnes(x = dane, method = "average") dane Agglomerative Coefficient = 0.93 Rysunek 12: Dendrogram Jeśli chcielibyśmy sprawdzić różnice w postaci dendrgramu w zależności od tego jaką metodę łączenia skupień zastosowano: najbliższego sąsiada, najdalszego sąsiada czy metoda średniej odległości możemy wywołać następujące komendy w środowisku R: > par(mfrow=c(3,2)) > klaster = agnes(dane, method="average") > plot(klaster) 15 > > > > klaster = agnes(dane, method="single") plot(klaster) klaster = agnes(dane, method="complete") plot(klaster) Wówczas efektem będzie jeden wykres z trzema dendrogramami dla zbioru iris (rysunek 13). Dendrogram of agnes(x = dane, method = "average") 0 0.5 1 1.5 2 2.5 3 3.5 2 0 1 18 41 28 29 8 40 50 5 38 36 24 27 44 21 32 37 6 19 11 49 20 22 47 17 45 2 46 13 10 35 26 3 4 48 30 31 7 12 25 9 39 43 14 23 15 16 33 34 42 51 53 87 77 78 55 59 66 76 52 57 86 64 92 79 74 72 75 98 69 88 120 71 128 139 150 73 84 134 124 127 147 102 143 114 122 115 54 90 70 81 82 60 65 80 56 91 67 85 62 89 96 97 95 100 68 83 93 63 107 58 94 99 61 101 121 144 141 145 125 116 137 149 104 117 138 112 105 129 133 111 148 113 140 142 146 109 135 103 126 130 108 131 136 106 123 119 110 118 132 Height 4 Banner of agnes(x = dane, method = "average") 4 Height dane Agglomerative Coefficient = 0.93 Agglomerative Coefficient = 0.93 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1 18 41 38 85 40 50 28 29 36 11 49 24 27 44 2 10 35 46 13 30 31 26 3 4 48 9 39 43 12 7 20 22 47 14 25 37 21 32 17 6 19 33 34 45 16 15 23 42 51 53 87 52 57 55 59 66 76 75 98 78 77 72 54 90 70 81 82 68 83 93 89 95 96 97 100 91 62 56 67 85 64 92 79 74 80 86 60 71 128 139 124 127 147 150 102 143 114 122 73 84 134 104 117 138 105 129 133 111 148 112 142 146 113 140 121 144 141 145 125 116 137 149 103 126 130 65 101 120 108 131 115 69 8863 106 123 119 136 135 109 110 58 9461 99 107 118 132 1.0 Height Dendrogram of agnes(x = dane, method = "single") 0.0 Banner of agnes(x = dane, method = "single") 1.6 Height dane Agglomerative Coefficient = 0.85 Agglomerative Coefficient = 0.85 1 18 41 8 40 50 28 29 5 38 12 30 31 25 2 46 13 10 35 26 36 43 48 43 97 39 14 23 642 19 11 49 37 21 32 20 22 47 45 24 27 44 15 16 17 33 34 54 90 70 81 82 60 65 80 63 56 91 67 85 62 72 68 83 93 89 96 97 95 100 107 58 94 99 61 51 53 87 78 55 59 77 66 76 52 57 86 64 92 79 74 75 98 69 88 120 71 128 139 150 102 143 114 122 115 73 84 134 124 127 112 147 135 101 137 149 121 144 125 141 145 104 117 138 105 129 133 109 111 148 116 113 140 142 146 103 126 130 108 131 106 123 119 110 136 118 132 0 2 4 6 Dendrogram of agnes(x = dane, method = "complete") Height Banner of agnes(x = dane, method = "complete") 0 1 2 3 4 5 6 7 Height dane Agglomerative Coefficient = 0.96 Agglomerative Coefficient = 0.96 Rysunek 13: Dendrogramy dla różnych metod łączenia skupień Podobna w działaniu do agnes() jest omówiona już po krótce wcześniej metoda grupowania hierarchicznego dostępna w funkcji hclust(stats). 4 Bibliografia Opracowanie przygotowano w oparciu o prace: 1. J. Koronacki, J. Ćwik: Statystyczne systemy uczące się, wydanie drugie, Exit, Warsaw, 2008, rozdział 9. 2. J. Ćwik, J. Mielniczuk: Statystyczne systemy uczące się - ćwiczenia w oparciu o pakiet R, Oficyna Wydawnicza PW, Warszawa, 2009. 16 3. Biecek P.: Na przełaj przez Data Mining, http://www.biecek.pl/R/ naPrzelajPrzezDM.pdf 17