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