K-znači Clustering u R s primjerom
Što je Cluster analiza?
Cluster analiza je dio učenje bez nadzora. Klaster je skupina podataka koji dijele slične značajke. Možemo reći da se analiza klasteriranja više odnosi na otkriće nego na predviđanje. Stroj traži sličnost u podacima. Na primjer, možete koristiti analizu klastera za sljedeću aplikaciju:
- Segmentacija kupaca: traži sličnosti između skupina kupaca
- Grupiranje tržišta dionica: Grupirajte dionice na temelju performansi
- Smanjite dimenzionalnost skupa podataka grupiranjem opažanja sa sličnim vrijednostima
Clusteranalizu nije preteško implementirati i ona je značajna, kao i djelotvorna za poslovanje.
Najupečatljivija razlika između nadziranog i nenadziranog učenja leži u rezultatima. Učenje bez nadzora stvara novu varijablu, oznaku, dok učenje pod nadzorom predviđa ishod. Stroj pomaže praktičaru u potrazi za označavanjem podataka na temelju bliske povezanosti. Na analitičaru je da iskoristi skupine i da im da ime.
Napravimo primjer za razumijevanje koncepta klasteriranja. Radi jednostavnosti, radimo u dvije dimenzije. Imate podatke o ukupnoj potrošnji kupaca i njihovoj dobi. Kako bi poboljšao oglašavanje, marketinški tim želi slati više ciljanih e-poruka svojim klijentima.
Na sljedećem grafikonu prikazujete ukupnu potrošnju i dob kupaca.
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()
Na ovom mjestu je vidljiv uzorak
- Dolje lijevo možete vidjeti mlade ljude slabije platežne moći
- Gornja srednja vrijednost odražava ljude s poslom za koji si mogu priuštiti da troše više
- Konačno, stariji ljudi s nižim budžetom.
Na gornjoj slici ručno grupirate zapažanja i definirate svaku od tri grupe. Ovaj primjer je donekle jednostavan i vrlo vizualan. Ako se skupu podataka dodaju nova opažanja, možete ih označiti unutar krugova. Vi definirate krug na temelju naše prosudbe. Umjesto toga, možete koristiti Strojno učenje objektivno grupirati podatke.
U ovom ćete vodiču naučiti kako koristiti k-znači algoritam.
K-means algoritam
K-srednja vrijednost je bez sumnje najpopularnija metoda klasteriranja. Istraživači su objavili algoritam prije nekoliko desetljeća i učinjeno je mnogo poboljšanja na k-srednjim vrijednostima.
Algoritam pokušava pronaći grupe minimiziranjem udaljenosti između promatranja, tzv lokalni optimalni rješenja. Udaljenosti se mjere na temelju koordinata promatranja. Na primjer, u dvodimenzionalnom prostoru, koordinate su jednostavne i .
Algoritam radi na sljedeći način:
- Korak 1: Odaberite grupe u planu značajki nasumično
- Korak 2: Smanjite udaljenost između središta klastera i različitih promatranja (središte). To rezultira grupama s opažanjima
- Korak 3: Shift početno težište na srednju vrijednost koordinata unutar grupe.
- Korak 4: Smanjite udaljenost prema novim težištima. Stvaraju se nove granice. Tako će se promatranja kretati iz jedne skupine u drugu
- Ponavljajte dok nijedno opažanje ne promijeni grupe
K-srednje vrijednosti obično uzimaju euklidsku udaljenost između značajke i značajke:
Dostupne su različite mjere kao što su Manhattanska udaljenost ili Minlowski udaljenost. Imajte na umu da K-srednja vrijednost vraća različite grupe svaki put kada pokrenete algoritam. Prisjetite se da su prva početna pogađanja nasumična i izračunajte udaljenosti dok algoritam ne postigne homogenost unutar grupa. To jest, k-srednja vrijednost je vrlo osjetljiva na prvi izbor, i osim ako je broj opažanja i grupa mali, gotovo je nemoguće dobiti isto grupiranje.
Odaberite broj klastera
Druga poteškoća koja se javlja kod k-srednje vrijednosti je izbor broja klastera. Možete postaviti visoku vrijednost, tj. veliki broj grupa, kako biste poboljšali stabilnost, ali mogli biste završiti s prefitirati podataka. Prekomjerno opremanje znači da se izvedba modela znatno smanjuje za nove podatke. Stroj je naučio sitne detalje skupa podataka i bori se da generalizira cjelokupni obrazac.
Broj klastera ovisi o prirodi skupa podataka, industriji, poslovanju i tako dalje. Međutim, postoji pravilo za odabir odgovarajućeg broja klastera:
s jednakim broju opažanja u skupu podataka.
Općenito govoreći, zanimljivo je trošiti vrijeme na traženje najbolje vrijednosti koja odgovara poslovnim potrebama.
Koristit ćemo skup podataka o cijenama osobnih računala za izvođenje naše analize klasteriranja. Ovaj skup podataka sadrži 6259 opažanja i 10 značajki. Skup podataka promatra cijenu od 1993. do 1995. za 486 osobnih računala u SAD-u. Varijable su cijena, brzina, ram, zaslon, cd između ostalog.
Postupit ćete na sljedeći način:
- Uvezi podatke
- Uvježbajte model
- Ocijenite model
Uvezi podatke
Srednja vrijednost K nije prikladna za faktorske varijable jer se temelji na udaljenosti, a diskretne vrijednosti ne vraćaju smislene vrijednosti. Možete izbrisati tri kategoričke varijable u našem skupu podataka. Osim toga, u ovom skupu podataka nema nedostajućih vrijednosti.
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)
Izlaz
## 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, ... ## $ trend <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
Iz sažete statistike možete vidjeti da podaci imaju velike vrijednosti. Dobra praksa s izračunom srednje vrijednosti k i udaljenosti je ponovno skaliranje podataka tako da srednja vrijednost bude jednaka jedan, a standardna devijacija jednaka nuli.
summary(df)
Izlaz:
## 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
Ponovno skalirate varijable pomoću funkcije scale() biblioteke dplyr. Transformacija smanjuje utjecaj outliera i omogućuje usporedbu pojedinačnog opažanja sa srednjom vrijednosti. Ako standardizirana vrijednost (ili z-rezultat) visoka, možete biti sigurni da je ovo opažanje doista iznad prosjeka (veliki z-rezultat implicira da je ova točka daleko od prosjeka u smislu standardne devijacije. Z-rezultat od dva označava da je vrijednost 2 standardna odstupanja od srednje vrijednosti Napomena, z-rezultat slijedi Gaussovu distribuciju i simetričan je oko srednje vrijednosti.
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))
R baza ima funkciju za pokretanje algoritma k srednje vrijednosti. Osnovna funkcija k srednje vrijednosti je:
kmeans(df, k) arguments: -df: dataset used to run the algorithm -k: Number of clusters
Uvježbajte model
Na slici tri detaljno ste opisali kako algoritam radi. Svaki korak možete vidjeti grafički pomoću sjajnog paketa koji je napravio Yi Hui (također kreator Knit za Rmarkdown). Animacija paketa nije dostupna u biblioteci conda. Možete koristiti drugi način za instaliranje paketa s install.packages(“animacija”). Možete provjeriti je li paket instaliran u našoj mapi Anaconda.
install.packages("animation")
Nakon što učitate knjižnicu, dodajete .ani nakon kmeans i R iscrtat će sve korake. Ilustracije radi, algoritam izvodite samo s promijenjenim varijablama hd i ram s tri klastera.
set.seed(2345) library(animation) kmeans.ani(rescale_df[2:3], 3)
Objašnjenje koda
- kmeans.ani(rescale_df[2:3], 3): Odaberite stupce 2 i 3 skupa podataka rescale_df i pokrenite algoritam s k postavkama na 3. Nacrtajte animaciju.
Animaciju možete protumačiti na sljedeći način:
- Korak 1: R nasumično odabire tri točke
- Korak 2: Izračunajte euklidsku udaljenost i nacrtajte klastere. Imate jedan grozd u zelenoj boji dolje lijevo, jedan veliki klaster obojen u crnoj desnoj strani i jedan crveni između njih.
- Korak 3: Izračunajte centroid, tj. srednju vrijednost klastera
- Ponavljajte sve dok podaci ne promijene klaster
Algoritam je konvergirao nakon sedam ponavljanja. Možete pokrenuti algoritam k-srednje vrijednosti u našem skupu podataka s pet klastera i nazvati ga pc_cluster.
pc_cluster <-kmeans(rescale_df, 5)
- Popis pc_cluster sadrži sedam zanimljivih elemenata:
- pc_cluster$cluster: Označava klaster svakog opažanja
- pc_cluster$centers: Centri klastera
- pc_cluster$totss: Ukupni zbroj kvadrata
- pc_cluster$withinss: unutar zbroja kvadrata. Broj povratnih komponenti jednak je `k`
- pc_cluster$tot.withinss: Zbroj insidess
- pc_clusterbetweenss: Ukupni zbroj kvadrata minus Unutar zbroja kvadrata
- pc_cluster$size: Broj opažanja unutar svakog klastera
Koristit ćete zbroj unutarnjeg zbroja kvadrata (tj. tot.withinss) za izračunavanje optimalnog broja klastera k. Pronalaženje k je doista značajan zadatak.
Optimalna k
Jedna tehnika za odabir najboljeg k naziva se metoda lakta. Ova metoda koristi homogenost unutar grupe ili heterogenost unutar grupe za procjenu varijabilnosti. Drugim riječima, zanima vas postotak varijance koji objašnjava svaki klaster. Možete očekivati da će se varijabilnost povećati s brojem klastera, alternativno, heterogenost se smanjuje. Naš izazov je pronaći k koji je izvan opadajućih povrata. Dodavanje novog klastera ne poboljšava varijabilnost podataka jer ostaje vrlo malo informacija za objašnjenje.
U ovom vodiču ovu točku nalazimo pomoću mjere heterogenosti. Ukupni zbroj kvadrata unutar klastera je tot.withinss na popisu koji vraća kmean().
Možete konstruirati laktasti graf i pronaći optimalni k na sljedeći način:
- Korak 1: Konstruirajte funkciju za izračunavanje ukupnog zbroja kvadrata unutar klastera
- Korak 2: Pokrenite vremena algoritma
- Korak 3: Stvorite podatkovni okvir s rezultatima algoritma
- Korak 4: Iscrtajte rezultate
Korak 1) Konstruirajte funkciju za izračunavanje ukupnog zbroja kvadrata unutar klastera
Kreirate funkciju koja pokreće algoritam k-srednje vrijednosti i pohranjuje ukupni zbroj kvadrata unutar klastera
kmean_withinss <- function(k) { cluster <- kmeans(rescale_df, k) return (cluster$tot.withinss) }
Objašnjenje koda
- function(k): Postavite broj argumenata u funkciji
- kmeans(rescale_df, k): Pokrenite algoritam k puta
- return(cluster$tot.withinss): Pohranjuje ukupan zbroj kvadrata unutar klastera
Možete testirati funkciju s jednako 2.
Izlaz:
## Try with 2 cluster
kmean_withinss(2)
Izlaz:
## [1] 27087.07
Korak 2) Pokrenite algoritam n puta
Koristit ćete funkciju sapply() za pokretanje algoritma u rasponu od k. Ova tehnika je brža od stvaranja petlje i pohranjivanja vrijednosti.
# Set maximum cluster max_k <-20 # Run algorithm over a range of k wss <- sapply(2:max_k, kmean_withinss)
Objašnjenje koda
- max_k <-20: Postavite najveći broj na 20
- sapply(2:max_k, kmean_withinss): Pokrenite funkciju kmean_withinss() u rasponu 2:max_k, tj. 2 do 20.
Korak 3) Stvorite podatkovni okvir s rezultatima algoritma
Nakon izrade i testiranja naše funkcije, možete pokrenuti algoritam k-srednje vrijednosti u rasponu od 2 do 20, pohraniti vrijednosti tot.withinss.
# Create a data frame to plot the graph elbow <-data.frame(2:max_k, wss)
Objašnjenje koda
- data.frame(2:max_k, wss): Stvorite podatkovni okvir s izlazom pohrane algoritma u wss
Korak 4) Iscrtajte rezultate
Iscrtavate grafikon kako biste vizualizirali gdje je točka lakta
# Plot the graph with gglop ggplot(elbow, aes(x = X2.max_k, y = wss)) + geom_point() + geom_line() + scale_x_continuous(breaks = seq(1, 20, by = 1))
Na grafikonu možete vidjeti da je optimalni k jednak sedam, gdje krivulja počinje imati opadajući povrat.
Kada dobijete naš optimalni k, ponovno pokrećete algoritam s k jednakim 7 i procjenjujete klastere.
Ispitivanje klastera
pc_cluster_2 <-kmeans(rescale_df, 7)
Kao što je prije spomenuto, možete pristupiti preostalim zanimljivim informacijama na popisu koji vraća kmean().
pc_cluster_2$cluster pc_cluster_2$centers pc_cluster_2$size
Dio ocjenjivanja je subjektivan i oslanja se na korištenje algoritma. Naš cilj ovdje je prikupiti računala sa sličnim značajkama. Informatičar može obaviti posao ručno i grupirati računala na temelju svoje stručnosti. Međutim, proces će trajati dugo i bit će sklon pogreškama. Algoritam K-mean može pripremiti polje za njega/nju predlažući klastere.
Kao prethodnu procjenu možete ispitati veličinu grozdova.
pc_cluster_2$size
Izlaz:
## [1] 608 1596 1231 580 1003 699 542
Prvi klaster se sastoji od 608 promatranja, dok najmanji klaster, broj 4, ima samo 580 računala. Možda bi bilo dobro imati homogenost između klastera, ako ne, možda će biti potrebna tanja priprema podataka.
Pomoću središnje komponente dobivate dublji uvid u podatke. Redovi se odnose na numeraciju klastera, a stupci na varijable koje koristi algoritam. Vrijednosti su prosječni rezultat svakog klastera za zainteresirani stupac. Standardizacija olakšava interpretaciju. Pozitivne vrijednosti pokazuju da je z-rezultat za dati klaster iznad ukupnog prosjeka. Na primjer, klaster 2 ima najviši prosjek cijena među svim klasterima.
center <-pc_cluster_2$centers center
Izlaz:
## 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
Pomoću ggplot možete izraditi toplinsku kartu kako biste nam pomogli da istaknemo razliku između kategorija.
Zadane boje ggplota potrebno je promijeniti pomoću biblioteke RColorBrewer. Možete koristiti conda knjižnica i kod za pokretanje u terminalu:
conda instalirati -cr r-rcolorbrewer
Da biste izradili toplinsku kartu, postupite u tri koraka:
- Izgradite podatkovni okvir s vrijednostima središta i stvorite varijablu s brojem klastera
- Preoblikujte podatke pomoću funkcije gather() knjižnice tidyr. Želite transformirati podatke iz širokih u dugačke.
- Bojom stvorite paletu bojaRampFunkcija Palette().
Korak 1) Izgradite podatkovni okvir
Kreirajmo skup podataka za preoblikovanje
library(tidyr) # create dataset with the cluster number cluster <- c(1: 7) center_df <- data.frame(cluster, center) # Reshape the data center_reshape <- gather(center_df, features, values, price_scal: trend_scal) head(center_reshape)
Izlaz:
## 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
Korak 2) Preoblikujte podatke
Kod u nastavku kreira paletu boja koju ćete koristiti za iscrtavanje karte topline.
library(RColorBrewer) # Create the palette hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
Korak 3) Vizualizirajte
Možete iscrtati grafikon i vidjeti kako grozdovi izgledaju.
# Plot the heat map ggplot(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()
rezime
Algoritam k-srednje vrijednosti možemo sažeti u donjoj tablici
Paket | Cilj | funkcija | Argument |
---|---|---|---|
baza | Vlak k-srednja vrijednost | km znači() | df, k |
Pristupni klaster | kmeans()$klaster | ||
Cluster Centri | kmeans()$centri | ||
Veličina klastera | kmeans()$veličina |