K-znači grupiranje u R s primjerom

Sadržaj:

Anonim

U ovom ćete tutorijalu naučiti

  • Što je klaster analiza?
  • K-znači algoritam
  • Optimalno k

Što je klaster analiza?

Klaster analiza dio je učenja bez nadzora . Klaster je skupina podataka koji dijele slične značajke. Možemo reći, analiza klastera više se odnosi na otkriće nego na predviđanje. Uređaj traži sličnost u podacima. Na primjer, možete koristiti analizu klastera za sljedeću aplikaciju:

  • Segmentacija kupaca: Traži sličnost između skupina kupaca
  • Klasteriranje na burzi: Grupne dionice na temelju performansi
  • Smanjite dimenzionalnost skupa podataka grupiranjem opažanja sa sličnim vrijednostima

Analiza klastera nije previše teška za provedbu, a značajna je i korisna za poslovanje.

Najupečatljivija razlika između učenja pod nadzorom i bez nadzora leži u rezultatima. Nenadgledano učenje stvara novu varijablu, oznaku, dok nadzirano učenje predviđa ishod. Stroj pomaže praktičaru u potrazi za označavanjem podataka na temelju bliske povezanosti. Na analitičaru je da iskoristi grupe i da im ime.

Napravimo primjer za razumijevanje koncepta klasteriranja. Radi jednostavnosti radimo u dvije dimenzije. Imate podatke o ukupnoj potrošnji kupaca i njihovoj dobi. Da bi poboljšao oglašavanje, marketinški tim želi poslati ciljanije e-poruke svojim kupcima.

Na sljedećem grafikonu ucrtavate 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()

U ovom je trenutku vidljiv uzorak

  1. Dolje lijevo možete vidjeti mlade ljude s nižom kupovnom moći
  2. Gornja sredina odražava ljude koji imaju posao za koji mogu priuštiti da troši više
  3. Konačno, stariji ljudi s nižim budžetom.

Na gornjoj slici ručno grupirate promatranja i definirate svaku od tri skupine. Ovaj je primjer donekle izravan i vrlo vizualan. Ako su skupu podataka dodana nova zapažanja, možete ih označiti u krugovima. Krug definirate na temelju naše prosudbe. Umjesto toga, možete koristiti Strojno učenje za objektivno grupiranje podataka.

U ovom vodiču naučit ćete kako koristiti algoritam k-znači .

K-znači algoritam

K-sredina je, bez sumnje, najpopularnija metoda grupiranja. Istraživači su algoritam objavili prije nekoliko desetljeća, a na k-sredstvima je učinjeno puno poboljšanja.

Algoritam pokušava pronaći grupe minimizirajući udaljenost između promatranja, koja se nazivaju lokalnim optimalnim rješenjima. Udaljenost se mjeri na temelju koordinata promatranja. Na primjer, u dvodimenzionalnom prostoru koordinate su jednostavne i.

Algoritam radi kako slijedi:

  • Korak 1: Slučajno odaberite grupe u planu značajki
  • Korak 2: Smanjite udaljenost između središta nakupine i različitih promatranja ( centroid ). Rezultat su skupine s opažanjima
  • Korak 3: Pomaknite početni centroid na sredinu koordinata unutar grupe.
  • Korak 4: Smanjite udaljenost prema novim centroidima. Stvaraju se nove granice. Dakle, promatranja će se premještati iz jedne skupine u drugu
  • Ponavljajte dok nijedno opažanje ne promijeni grupe

K-znači obično uzima euklidsku udaljenost između značajke i značajke:

Dostupne su različite mjere kao što su udaljenost Manhattana ili udaljenost Minlowski. Imajte na umu da K-sredina vraća različite grupe svaki put kad pokrenete algoritam. Sjetimo se da su prva početna nagađanja slučajna i izračunavaju udaljenosti sve dok algoritam ne postigne homogenost unutar grupa. To jest, k-sredina je vrlo osjetljiva na prvi izbor, a ako broj opažanja i skupina nije malen, gotovo je nemoguće dobiti isto klasteriranje.

Odaberite broj klastera

Sljedeća poteškoća s k-sredinom je izbor broja klastera. Možete postaviti visoku vrijednost, tj. Veliki broj grupa, kako biste poboljšali stabilnost, ali možda ćete na kraju dobiti previše podataka. Prekomjerna opremljenost znači da se izvedba modela znatno smanjuje za nove podatke koji dolaze. Stroj je naučio male detalje o skupu podataka i trudi se generalizirati 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 promatranja u skupu podataka.

Općenito govoreći, zanimljivo je provesti vrijeme tražeći najbolju vrijednost koja odgovara poslovnoj potrebi.

Za obavljanje naše analize klastera koristit ćemo se podacima iz baze podataka Cijene osobnih računala. Ovaj skup podataka sadrži 6259 promatranja i 10 značajki. Skup podataka promatra cijenu od 1993. do 1995. godine 486 osobnih računala u SAD-u. Među ostalim varijable su cijena, brzina, RAM, zaslon, CD.

Nastavit ćete kako slijedi:

  • Uvoz podataka
  • Obuči model
  • Procijenite model

Uvoz podataka

K znači nije prikladno za faktor varijable jer se temelji na udaljenosti, a diskretne vrijednosti ne daju značajne vrijednosti. Možete izbrisati tri kategorijske varijable iz našeg skupa podataka. Osim toga, u ovom skupu podataka ne nedostaju 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  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1… 

Iz sažetke statistike možete vidjeti da podaci imaju velike vrijednosti. Dobra praksa s izračunavanjem srednje vrijednosti i udaljenosti je skaliranje podataka tako da je srednja vrijednost jednaka jedinici, 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

Varijable skalirate s funkcijom scale () biblioteke dplyr. Transformacija smanjuje utjecaj izvanrednih vrijednosti i omogućuje usporedbu pojedinačnog zapažanja s prosjekom. Ako je standardizirana vrijednost (ili z-rezultat ) visoka, možete biti sigurni da je ovo opažanje doista iznad srednje vrijednosti (veliki z-rezultat implicira da je ta točka daleko od srednje vrijednosti u smislu standardne devijacije. A z- rezultat dva znači da je vrijednost 2 standardne devijacije od srednje vrijednosti. Z-ocjena slijedi Gaussovu raspodjelu i simetrična 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 k srednjeg algoritma. Osnovna funkcija k srednje vrijednosti je:

kmeans(df, k)arguments:-df: dataset used to run the algorithm-k: Number of clusters

Obuči model

Na slici tri detaljno ste objasnili kako algoritam funkcionira. Svaki korak možete grafički vidjeti sa sjajnim paketom koji je izradio Yi Hui (također tvorac Knit for 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, dodate .ani nakon kmeans i R će iscrtati sve korake. U svrhu ilustracije, algoritam pokrećete samo s premještenim 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 skupova na 3. Nacrtajte animaciju.

Animaciju možete protumačiti na sljedeći način:

  • Korak 1: R nasumično bira tri boda
  • Korak 2: Izračunajte euklidsku udaljenost i nacrtajte nakupine. Imate jednu nakupinu u zelenoj boji dolje lijevo, jednu veliku nakupinu obojenu u crnu s desne strane i crvenu između njih.
  • Korak 3: Izračunajte centroid, tj. Sredinu nakupina
  • Ponavljajte sve dok podaci ne promijene klaster

Algoritam se konvergirao nakon sedam ponavljanja. Možete pokrenuti k-mean algoritam 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 skup svakog promatranja
  • pc_cluster $ centri: Centri klastera
  • pc_cluster $ totss: Ukupni zbroj kvadrata
  • pc_cluster $ Withinss: Unutar zbroja kvadrata. Broj povratnih komponenata jednak je `k`
  • pc_cluster $ tot.withinss: Zbroj unutar
  • pc_clusterbetweenss: Ukupni zbroj kvadrata minus Unutar zbroja kvadrata
  • pc_cluster $ size: Broj promatranja unutar svake skupine

Upotrijebit ćete zbroj unutar zbroja kvadrata (tj. Tot.withinss) za izračunavanje optimalnog broja klastera k. Pronalaženje k doista je značajan zadatak.

Optimalno 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ćavati s brojem nakupina, a alternativno, heterogenost se smanjuje. Naš je izazov pronaći k koji je izvan opadajućeg prinosa. Dodavanje novog klastera ne poboljšava varijabilnost podataka jer ostaje vrlo malo informacija za objašnjenje.

U ovom uputstvu ovu točku pronalazimo pomoću mjere heterogenosti. Ukupni zbroj kvadrata u klasterima je ukupni iznos u povratku popisa kmean ().

Možete konstruirati graf lakta 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 okvir podataka s rezultatima algoritma
  • Korak 4: Zacrtajte rezultate

Korak 1) Konstruirajte funkciju za izračunavanje ukupnog zbroja kvadrata unutar klastera

Stvorite funkciju koja pokreće k-srednji algoritam i pohranite zbroj u zbroju kvadrata klastera

kmean_withinss <- function(k) {cluster <- kmeans(rescale_df, k)return (cluster$tot.withinss)}

Objašnjenje koda

  • funkcija (k): Postavite broj argumenata u funkciji
  • kmeans (rescale_df, k): Pokrenite algoritam k puta
  • return (klaster $ tot.withinss): Spremite ukupan zbroj kvadrata unutar klastera

Funkciju možete testirati s jednako 2.

Izlaz:

## Try with 2 cluster
kmean_withinss(2)

Izlaz:

## [1] 27087.07 

Korak 2) Pokrenite algoritam n puta

Upotrijebit ćete funkciju sapply () za pokretanje algoritma u rasponu od k. Ova je tehnika brža od stvaranja petlje i pohrane vrijednosti.

# Set maximum clustermax_k <-20# Run algorithm over a range of kwss <- sapply(2:max_k, kmean_withinss)

Objašnjenje koda

  • max_k <-20: Postavite maksimalni 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 k-mean algoritam u rasponu od 2 do 20, pohraniti tot.withinss vrijednosti.

# Create a data frame to plot the graphelbow <-data.frame(2:max_k, wss)

Objašnjenje koda

  • data.frame (2: max_k, wss): Stvorite podatkovni okvir s izlazom spremišta algoritma u wss

Korak 4) Zacrtajte rezultate

Nacrtate grafikon kako biste vizualizirali gdje je točka lakta

# 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))

Iz grafikona možete vidjeti da je optimalno k sedam, gdje krivulja počinje imati sve manji povrat.

Nakon što ste dobili naš optimalni k, ponovno pokrećete algoritam s k jednako 7 i procjenjujete klastere.

Ispitivanje nakupine

pc_cluster_2 <-kmeans(rescale_df, 7)

Kao što smo već spomenuli, možete pristupiti preostalim zanimljivim informacijama s popisa koje vraća kmean ().

pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size 

Dio ocjenjivanja je subjektivan i oslanja se na upotrebu algoritma. Naš je cilj ovdje okupiti računalo sa sličnim značajkama. Kompjuter može raditi posao ručno i grupirati računalo na temelju svoje stručnosti. Međutim, postupak će potrajati puno vremena i podložan je pogreškama. K-mean algoritam može mu pripremiti polje predlažući klastere.

Kao prethodnu procjenu možete ispitati veličinu klastera.

pc_cluster_2$size

Izlaz:

## [1] 608 1596 1231 580 1003 699 542

Prva se skupina sastoji od 608 promatranja, dok najmanja skupina, broj 4, ima samo 580 računala. Bilo bi dobro imati homogenost između klastera, ako ne, možda će biti potrebna tanja priprema podataka.

Dublje ćete vidjeti podatke pomoću središnje komponente. Redci se odnose na numeraciju klastera, a stupci varijable koje algoritam koristi. Vrijednosti su prosječna ocjena svakog klastera za zainteresirani stupac. Standardizacija olakšava tumačenje. Pozitivne vrijednosti pokazuju da je z-rezultat za određeni klaster iznad ukupne srednje vrijednosti. Na primjer, klaster 2 ima najveći prosjek cijena među svim klasterima.

center <-pc_cluster_2$centerscenter

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

Možete stvoriti toplinsku kartu s ggplotom kako biste nam pomogli da istaknemo razliku između kategorija.

Zadane boje ggplota trebaju se mijenjati pomoću biblioteke RColorBrewer. Knjižnicu conda i kod možete koristiti za pokretanje u terminalu:

conda install -cr r-rcolorbrewer

Da biste izradili kartu topline, nastavite u tri koraka:

  • Izgradite podatkovni okvir s vrijednostima središta i stvorite varijablu s brojem klastera
  • Preoblikujte podatke funkcijom collect () knjižnice tidyr. Podatke želite transformirati iz širokih u duge.
  • Stvorite paletu boja s funkcijom colorRampPalette ()

Korak 1) Izradite okvir podataka

Stvorimo preoblikovani skup podataka

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)

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

Kôd u nastavku stvara paletu boja koje ćete koristiti za crtanje karte topline.

library(RColorBrewer)# Create the palettehm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')

Korak 3) Vizualizirajte

Možete nacrtati grafikon i vidjeti kako izgledaju klasteri.

# 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()

Sažetak

K-srednji algoritam možemo sažeti u donjoj tablici

Paket

Cilj

funkcija

argument

baza

Vlak k-mean

kmeans ()

df, k

Pristupni klaster

kmeans () $ klaster

Klaster centri

kmeans () $ središta

Klaster veličina

kmeans () $ veličina