W tym samouczku dowiesz się
- Co to jest analiza skupień?
- Algorytm K-średnich
- Optymalne k
Co to jest analiza skupień?
Analiza skupień jest częścią uczenia się bez nadzoru . Klaster to grupa danych, które mają podobne cechy. Można powiedzieć, że analiza skupień dotyczy bardziej odkrycia niż przewidywania. Maszyna wyszukuje podobieństwa w danych. Na przykład możesz użyć analizy skupień dla następującej aplikacji:
- Segmentacja klientów: szuka podobieństwa między grupami klientów
- Klastrowanie giełdowe: akcje grupy na podstawie wyników
- Zmniejsz wymiarowość zbioru danych, grupując obserwacje o podobnych wartościach
Analiza skupień nie jest zbyt trudna do wdrożenia i jest znacząca, a także możliwa do wykonania dla biznesu.
Najbardziej uderzająca różnica między uczeniem się nadzorowanym i nienadzorowanym polega na wynikach. Uczenie się bez nadzoru tworzy nową zmienną, etykietę, podczas gdy uczenie się nadzorowane przewiduje wynik. Maszyna pomaga praktykującemu w dążeniu do oznaczenia danych w oparciu o bliskie pokrewieństwo. Do analityka należy wykorzystanie grup i nadanie im nazwy.
Zróbmy przykład, aby zrozumieć pojęcie grupowania. Dla uproszczenia pracujemy w dwóch wymiarach. Masz dane o całkowitych wydatkach klientów i ich wieku. Aby ulepszyć reklamy, zespół marketingowy chce wysyłać bardziej ukierunkowane wiadomości e-mail do swoich klientów.
Na poniższym wykresie wykreślasz łączne wydatki i wiek klientów.
library(ggplot2)df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54),spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24))ggplot(df, aes(x = age, y = spend)) +geom_point()
W tym miejscu widoczny jest wzór
- W lewym dolnym rogu widać młodych ludzi o niższej sile nabywczej
- Górny środek oznacza ludzi z pracą, na którą stać ich, aby wydać więcej
- Wreszcie osoby starsze z niższym budżetem.
Na powyższym rysunku grupujesz ręcznie obserwacje i definiujesz każdą z trzech grup. Ten przykład jest dość prosty i bardzo wizualny. Jeśli nowe obserwacje są dołączane do zbioru danych, możesz oznaczyć je etykietami w okręgach. Określasz krąg na podstawie naszego osądu. Zamiast tego możesz użyć uczenia maszynowego do obiektywnego grupowania danych.
W tym samouczku nauczysz się, jak korzystać z algorytmu k-średnich .
Algorytm K-średnich
K-średnia jest bez wątpienia najpopularniejszą metodą grupowania. Naukowcy opublikowali algorytm dziesiątki lat temu i wprowadzono wiele ulepszeń w k-średnich.
Algorytm próbuje znaleźć grupy minimalizując odległość między obserwacjami, nazywając je lokalnymi rozwiązaniami optymalnymi . Odległości są mierzone na podstawie współrzędnych obserwacji. Na przykład w przestrzeni dwuwymiarowej współrzędne są proste i.
Algorytm działa w następujący sposób:
- Krok 1: Wybierz losowo grupy w planie funkcji
- Krok 2: Zminimalizuj odległość między środkiem gromady a różnymi obserwacjami ( centroidem ). Wynika w grupach z obserwacjami
- Krok 3: Przesuń początkową centroidę do średniej współrzędnych w grupie.
- Krok 4: Zminimalizuj odległość zgodnie z nowymi centroidami. Tworzone są nowe granice. W ten sposób obserwacje będą przenosić się z jednej grupy do drugiej
- Powtarzaj, dopóki żadna obserwacja nie zmieni grup
K-oznacza zwykle przyjmuje odległość euklidesową między cechą a cechą:
Dostępne są różne miary, takie jak odległość Manhattanu lub odległość Minlowskiego. Zwróć uwagę, że K-mean zwraca różne grupy za każdym razem, gdy uruchamiasz algorytm. Przypomnij sobie, że pierwsze początkowe domysły są losowe i obliczaj odległości, aż algorytm osiągnie jednorodność w grupach. Oznacza to, że k-średnia jest bardzo wrażliwa na pierwszy wybór i jeśli liczba obserwacji i grup nie jest mała, uzyskanie takiego samego skupienia jest prawie niemożliwe.
Wybierz liczbę klastrów
Inną trudnością napotykaną w przypadku k-średniej jest wybór liczby skupień. Możesz ustawić wysoką wartość, tj. Dużą liczbę grup, aby poprawić stabilność, ale możesz skończyć z przepełnieniem danych. Nadmierne dopasowanie oznacza, że wydajność modelu znacznie spada w przypadku nowych nadchodzących danych. Maszyna poznała drobne szczegóły zbioru danych i z trudem uogólnia ogólny wzorzec.
Liczba klastrów zależy od charakteru zbioru danych, branży, biznesu i tak dalej. Istnieje jednak praktyczna zasada wyboru odpowiedniej liczby klastrów:
gdzie jest równa liczbie obserwacji w zbiorze danych.
Ogólnie rzecz biorąc, warto poświęcić czas na wyszukanie najlepszej wartości odpowiadającej potrzebom biznesowym.
Wykorzystamy zestaw danych Ceny komputerów osobistych, aby przeprowadzić naszą analizę skupień. Ten zbiór danych zawiera 6259 obserwacji i 10 cech. Zbiór danych obserwuje cenę 486 komputerów osobistych w USA w latach 1993–1995. Zmienne to między innymi cena, prędkość, pamięć RAM, ekran, cd.
Będziesz postępować w następujący sposób:
- Zaimportować dane
- Wytrenuj model
- Oceń model
Zaimportować dane
Średnia K nie jest odpowiednia dla zmiennych czynnikowych, ponieważ jest oparta na odległości, a wartości dyskretne nie zwracają znaczących wartości. Możesz usunąć trzy zmienne kategorialne z naszego zbioru danych. Poza tym w tym zbiorze danych nie ma brakujących wartości.
library(dplyr)PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv"df <- read.csv(PATH) %>%select(-c(X, cd, multi, premium))glimpse(df)Wynik
## Observations: 6, 259## Variables: 7## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2… ##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25,… ##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210… ##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4,… ##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14,… ##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,… ## $ trend1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
Ze statystyk podsumowujących widać, że dane mają duże wartości. Dobrą praktyką przy obliczaniu średniej k i odległości jest przeskalowanie danych tak, aby średnia była równa jeden, a odchylenie standardowe równe zero.
summary(df)
Wynik:
## price speed hd ram## Min. : 949 Min. : 25.00 Min. : 80.0 Min. : 2.000## 1st Qu.:1794 1st Qu.: 33.00 1st Qu.: 214.0 1st Qu.: 4.000 `## Median :2144 Median : 50.00 Median : 340.0 Median : 8.000## Mean :2220 Mean : 52.01 Mean : 416.6 Mean : 8.287## 3rd Qu.:2595 3rd Qu.: 66.00 3rd Qu.: 528.0 3rd Qu.: 8.000## Max. :5399 Max. :100.00 Max. :2100.0 Max. :32.000## screen ads trend## Min. :14.00 Min. : 39.0 Min. : 1.00## 1st Qu.:14.00 1st Qu.:162.5 1st Qu.:10.00## Median :14.00 Median :246.0 Median :16.00## Mean :14.61 Mean :221.3 Mean :15.93## 3rd Qu.:15.00 3rd Qu.:275.0 3rd Qu.:21.50## Max. :17.00 Max. :339.0 Max. :35.00
Przeskalowanie zmiennych odbywa się za pomocą funkcji scale () biblioteki dplyr. Transformacja zmniejsza wpływ wartości odstających i pozwala porównać jedyną obserwację ze średnią. Jeśli wartość standaryzowana (lub wynik z ) jest wysoka, możesz być pewien, że ta obserwacja jest rzeczywiście powyżej średniej (duży wynik z oznacza, że punkt ten jest daleki od średniej pod względem odchylenia standardowego. wynik równy dwa oznacza, że wartość jest o 2 odchylenia standardowe od średniej. Należy zauważyć, że wynik z jest zgodny z rozkładem Gaussa i jest symetryczny względem średniej.
rescale_df <- df % > %mutate(price_scal = scale(price),hd_scal = scale(hd),ram_scal = scale(ram),screen_scal = scale(screen),ads_scal = scale(ads),trend_scal = scale(trend)) % > %select(-c(price, speed, hd, ram, screen, ads, trend))
Baza R ma funkcję uruchamiania algorytmu k średnich. Podstawową funkcją k średnia jest:
kmeans(df, k)arguments:-df: dataset used to run the algorithm-k: Number of clusters
Wytrenuj model
Na rysunku trzecim szczegółowo opisano działanie algorytmu. Możesz zobaczyć każdy krok graficznie dzięki świetnemu pakietowi zbudowanemu przez Yi Hui (również twórcę Knit for Rmarkdown). Animacja pakietu nie jest dostępna w bibliotece Conda. Możesz użyć innego sposobu, aby zainstalować pakiet z install.packages („animacja”). Możesz sprawdzić, czy pakiet jest zainstalowany w naszym folderze Anaconda.
install.packages("animation")
Po załadowaniu biblioteki dodajesz .ani po kmeans, a R wykreśli wszystkie kroki. Dla celów ilustracyjnych, uruchamiasz algorytm tylko ze zmiennymi przeskalowanymi hd i ram z trzema klastrami.
set.seed(2345)library(animation)kmeans.ani(rescale_df[2:3], 3)
Objaśnienie kodu
- kmeans.ani (rescale_df [2: 3], 3): Wybierz kolumny 2 i 3 zestawu danych rescale_df i uruchom algorytm z k zestawów do 3. Wykreśl animację.
Możesz zinterpretować animację w następujący sposób:
- Krok 1: R losowo wybiera trzy punkty
- Krok 2: Oblicz odległość euklidesową i narysuj gromady. Masz jedną zieloną grupę w lewym dolnym rogu, jedną dużą w kolorze czarnym po prawej i jedną czerwoną między nimi.
- Krok 3: Oblicz centroidę, czyli średnią skupień
- Powtarzaj, aż żadne dane nie zmieni klastra
Algorytm zbiegał się po siedmiu iteracjach. Możesz uruchomić algorytm k-mean w naszym zbiorze danych z pięcioma klastrami i nazwać go pc_cluster.
pc_cluster <-kmeans(rescale_df, 5)
- Lista pc_cluster zawiera siedem interesujących elementów:
- pc_cluster $ cluster: wskazuje klaster każdej obserwacji
- pc_cluster $ center: Centra klastrów
- pc_cluster $ totss: Całkowita suma kwadratów
- pc_cluster $ withinss: W ramach sumy kwadratu. Liczba zwracanych składników jest równa „k”
- pc_cluster $ tot.withinss: Suma withins
- pc_clusterbetweenss: Całkowita suma kwadratów minus W sumie kwadratów
- pc_cluster $ size: liczba obserwacji w każdym klastrze
Użyjesz sumy w ramach sumy kwadratów (tj. Tot.withinss), aby obliczyć optymalną liczbę klastrów k. Znalezienie k jest rzeczywiście istotnym zadaniem.
Optymalne k
Jedną z technik wyboru najlepszego k jest nazywana metodą łokcia . Ta metoda wykorzystuje jednorodność wewnątrz grupy lub heterogeniczność wewnątrz grupy do oceny zmienności. Innymi słowy, interesuje Cię procent wariancji wyjaśniony przez każdy klaster. Można oczekiwać, że zmienność będzie rosła wraz z liczbą klastrów, lub też maleje niejednorodność. Naszym wyzwaniem jest znalezienie k, które jest poza malejącymi zwrotami. Dodanie nowego klastra nie poprawia zmienności danych, ponieważ do wyjaśnienia pozostaje bardzo niewiele informacji.
W tym samouczku znajdujemy ten punkt za pomocą miary heterogeniczności. Łączna suma kwadratów w klastrach to suma z podziałem na liście zwracana przez kmean ().
Możesz skonstruować wykres łokciowy i znaleźć optymalne k w następujący sposób:
- Krok 1: Skonstruuj funkcję obliczającą sumę kwadratów w klastrach
- Krok 2: Uruchom algorytm razy
- Krok 3: Utwórz ramkę danych z wynikami algorytmu
- Krok 4: Wykreśl wyniki
Krok 1) Skonstruuj funkcję obliczającą sumę kwadratów w klastrach
Tworzysz funkcję, która uruchamia algorytm k-średnich i przechowujesz całkowitą sumę kwadratów w klastrach
kmean_withinss <- function(k) {cluster <- kmeans(rescale_df, k)return (cluster$tot.withinss)}
Objaśnienie kodu
- funkcja (k): Ustaw liczbę argumentów w funkcji
- kmeans (rescale_df, k): Uruchom algorytm k razy
- return (cluster $ tot.withinss): Przechowuje całkowitą sumę kwadratów w klastrach
Możesz przetestować funkcję równa się 2.
Wynik:
## Try with 2 cluster
kmean_withinss(2)
Wynik:
## [1] 27087.07
Krok 2) Uruchom algorytm n razy
Użyjesz funkcji sapply (), aby uruchomić algorytm w zakresie k. Ta technika jest szybsza niż tworzenie pętli i przechowywanie wartości.
# Set maximum clustermax_k <-20# Run algorithm over a range of kwss <- sapply(2:max_k, kmean_withinss)
Objaśnienie kodu
- max_k <-20: ustaw maksymalną liczbę na 20
- sapply (2: max_k, kmean_withinss): Uruchom funkcję kmean_withinss () w zakresie 2: max_k, czyli od 2 do 20.
Krok 3) Utwórz ramkę danych z wynikami algorytmu
Po utworzeniu i przetestowaniu naszej funkcji możesz uruchomić algorytm k-mean w zakresie od 2 do 20, zapisać wartości tot.withinss.
# Create a data frame to plot the graphelbow <-data.frame(2:max_k, wss)
Objaśnienie kodu
- data.frame (2: max_k, wss): Utwórz ramkę danych z wyjściem algorytmu przechowywanym w wss
Krok 4) Wykreśl wyniki
Tworzysz wykres, aby zwizualizować, gdzie jest punkt łokcia
# Plot the graph with gglopggplot(elbow, aes(x = X2.max_k, y = wss)) +geom_point() +geom_line() +scale_x_continuous(breaks = seq(1, 20, by = 1))
Na wykresie można zobaczyć, że optymalne k wynosi siedem, gdzie krzywa zaczyna zmniejszać się.
Po uzyskaniu optymalnego k ponownie uruchamiasz algorytm z k równa się 7 i oceniasz klastry.
Badanie klastra
pc_cluster_2 <-kmeans(rescale_df, 7)
Jak wspomniano wcześniej, możesz uzyskać dostęp do pozostałych interesujących informacji na liście zwróconej przez kmean ().
pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size
Część ewaluacyjna jest subiektywna i opiera się na zastosowaniu algorytmu. Naszym celem jest zebranie komputera o podobnych funkcjach. Komputerowiec może wykonać pracę ręcznie i grupować komputer w oparciu o swoją wiedzę. Jednak proces zajmie dużo czasu i będzie podatny na błędy. Algorytm K-mean może przygotować dla niego pole, sugerując klastry.
W ramach wstępnej oceny możesz zbadać rozmiar klastrów.
pc_cluster_2$size
Wynik:
## [1] 608 1596 1231 580 1003 699 542
Pierwsza grupa składa się z 608 obserwacji, podczas gdy najmniejsza, numer 4, ma tylko 580 komputerów. Dobrze byłoby zachować jednorodność między klastrami, jeśli nie, może być wymagane cieńsze przygotowanie danych.
Możesz dokładniej przyjrzeć się danym z komponentem środkowym. Wiersze odnoszą się do numeracji skupienia, a kolumny do zmiennych używanych przez algorytm. Wartości są średnim wynikiem każdego klastra dla interesującej kolumny. Standaryzacja ułatwia interpretację. Wartości dodatnie wskazują, że z-score dla danego klastra jest powyżej ogólnej średniej. Na przykład klaster 2 ma najwyższą średnią cen spośród wszystkich klastrów.
center <-pc_cluster_2$centerscenter
Wynik:
## price_scal hd_scal ram_scal screen_scal ads_scal trend_scal## 1 -0.6372457 -0.7097995 -0.691520682 -0.4401632 0.6780366 -0.3379751## 2 -0.1323863 0.6299541 0.004786730 2.6419582 -0.8894946 1.2673184## 3 0.8745816 0.2574164 0.513105797 -0.2003237 0.6734261 -0.3300536## 4 1.0912296 -0.2401936 0.006526723 2.6419582 0.4704301 -0.4132057## 5 -0.8155183 0.2814882 -0.307621003 -0.3205176 -0.9052979 1.2177279## 6 0.8830191 2.1019454 2.168706085 0.4492922 -0.9035248 1.2069855## 7 0.2215678 -0.7132577 -0.318050275 -0.3878782 -1.3206229 -1.5490909
Możesz utworzyć mapę cieplną za pomocą ggplot, aby pomóc nam podkreślić różnicę między kategoriami.
Domyślne kolory ggplot należy zmienić za pomocą biblioteki RColorBrewer. Możesz użyć biblioteki conda i kodu do uruchomienia w terminalu:
conda install -cr r-rcolorbrewer
Aby stworzyć mapę cieplną, postępuj w trzech krokach:
- Zbuduj ramkę danych z wartościami środka i utwórz zmienną z numerem klastra
- Zmień kształt danych za pomocą funkcji collect () biblioteki tidyr. Chcesz przekształcić dane z szerokich na długie.
- Utwórz paletę kolorów za pomocą funkcji colorRampPalette ()
Krok 1) Zbuduj ramkę danych
Utwórzmy zbiór danych przekształcenia
library(tidyr)# create dataset with the cluster numbercluster <- c(1: 7)center_df <- data.frame(cluster, center)# Reshape the datacenter_reshape <- gather(center_df, features, values, price_scal: trend_scal)head(center_reshape)
Wynik:
## cluster features values## 1 1 price_scal -0.6372457## 2 2 price_scal -0.1323863## 3 3 price_scal 0.8745816## 4 4 price_scal 1.0912296## 5 5 price_scal -0.8155183## 6 6 price_scal 0.8830191
Krok 2) Zmień kształt danych
Poniższy kod tworzy paletę kolorów, których będziesz używać do rysowania mapy cieplnej.
library(RColorBrewer)# Create the palettehm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
Krok 3) Wizualizuj
Możesz wykreślić wykres i zobaczyć, jak wyglądają klastry.
# Plot the heat mapggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) +scale_y_continuous(breaks = seq(1, 7, by = 1)) +geom_tile() +coord_equal() +scale_fill_gradientn(colours = hm.palette(90)) +theme_classic()
Podsumowanie
Możemy podsumować algorytm k-średniej w poniższej tabeli
Pakiet |
Cel |
funkcjonować |
argument |
---|---|---|---|
baza |
Trenuj k-mean |
kmeans () |
df, k |
Dostęp do klastra |
kmeans () $ klaster | ||
Centra klastrów |
kmeans () $ centra | ||
Rozmiar klastra |
kmeans () $ size |