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

Cluster Analiza

Na ovom mjestu je vidljiv uzorak

  1. Dolje lijevo možete vidjeti mlade ljude slabije platežne moći
  2. Gornja srednja vrijednost odražava ljude s poslom za koji si mogu priuštiti da troše više
  3. Konačno, stariji ljudi s nižim budžetom.

Cluster Analiza

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 .

K-means algoritam

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:

K-means algoritam

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:

Odaberite broj Clusters

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.

Obučite model

Obučite model

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

Optimalna k

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

Ispitivanje Cluster

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