K-anordning Clustering i R med Eksempel

Hva er Cluster analyse?

Cluster analyse er en del av uovervรฅket lรฆring. En klynge er en gruppe data som deler lignende funksjoner. Vi kan si at klyngeanalyse handler mer om oppdagelse enn en prediksjon. Maskinen sรธker etter likhet i dataene. Du kan for eksempel bruke klyngeanalyse for fรธlgende applikasjon:

  • Kundesegmentering: Ser etter likhet mellom grupper av kunder
  • Aksjeklynger: Gruppeaksjer basert pรฅ resultater
  • Reduser dimensjonaliteten til et datasett med grupperping observasjoner med lignende verdier

Clusteringanalyse er ikke for vanskelig รฅ implementere og er bรฅde meningsfylt og handlingsdyktig for virksomheten.

Den mest slรฅende forskjellen mellom veiledet og uovervรฅket lรฆring ligger i resultatene. Uovervรฅket lรฆring skaper en ny variabel, etiketten, mens veiledet lรฆring forutsier et utfall. Maskinen hjelper utรธveren i oppdraget med รฅ merke dataene basert pรฅ nรฆr slektskap. Det er opp til analytikeren รฅ gjรธre bruk av gruppene og gi dem et navn.

La oss lage et eksempel for รฅ forstรฅ begrepet klynging. For enkelhets skyld jobber vi i to dimensjoner. Du har data om det totale forbruket til kunder og deres alder. For รฅ forbedre annonseringen รธnsker markedsfรธringsteamet รฅ sende mer mรฅlrettede e-poster til kundene sine.

I den fรธlgende grafen plotter du det totale forbruket og alderen til kundene.

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 Analyse

Et mรธnster er synlig pรฅ dette punktet

  1. Nederst til venstre ser du unge med lavere kjรธpekraft
  2. ร˜vre midtre reflekterer folk med en jobb som de har rรฅd til รฅ bruke mer
  3. Til slutt eldre med lavere budsjett.

Cluster Analyse

I figuren ovenfor grupperer du observasjonene for hรฅnd og definerer hver av de tre gruppene. Dette eksemplet er noe enkelt og svรฆrt visuelt. Hvis nye observasjoner legges til datasettet, kan du merke dem i kretsene. Du definerer sirkelen basert pรฅ vรฅr vurdering. I stedet kan du bruke Maskinlรฆring รฅ gruppere dataene objektivt.

I denne opplรฆringen lรฆrer du hvordan du bruker k-betyr algoritme.

K-betyr algoritme

K-mean er uten tvil den mest populรฆre klyngemetoden. Forskere ga ut algoritmen for flere tiรฅr siden, og mange forbedringer har blitt gjort pรฅ k-means.

Algoritmen prรธver รฅ finne grupper ved รฅ minimere avstanden mellom observasjonene, kalt lokalt optimalt lรธsninger. Avstandene mรฅles ut fra koordinatene til observasjonene. For eksempel, i et todimensjonalt rom, er koordinatene enkle og .

K-betyr Algoritme

Algoritmen fungerer som fรธlger:

  • Trinn 1: Velg grupper i funksjonsplanen tilfeldig
  • Trinn 2: Minimer avstanden mellom klyngesenteret og de forskjellige observasjonene (Tyngdepunktet). Det resulterer i grupper med observasjoner
  • Trinn 3: Shift starttyngdepunktet til gjennomsnittet av koordinatene i en gruppe.
  • Trinn 4: Minimer avstanden i henhold til de nye tyngdepunktene. Nye grenser skapes. Dermed vil observasjoner flytte fra en gruppe til en annen
  • Gjenta til ingen observasjon endrer gruppe

K-means tar vanligvis den euklidiske avstanden mellom funksjonen og funksjonen:

K-betyr Algoritme

Ulike mรฅl er tilgjengelige som Manhattan-avstanden eller Minlowski-avstanden. Merk at K-mean returnerer forskjellige grupper hver gang du kjรธrer algoritmen. Husk at de fรธrste innledende gjetningene er tilfeldige og beregne avstandene til algoritmen nรฅr en homogenitet i grupper. Det vil si at k-middel er veldig fรธlsomt for fรธrstevalget, og med mindre antall observasjoner og grupper er lite, er det nesten umulig รฅ fรฅ samme klynging.

Velg antall klynger

En annen vanskelighet funnet med k-middel er valget av antall klynger. Du kan sette en hรธy verdi pรฅ, dvs. et stort antall grupper, for รฅ forbedre stabiliteten, men du kan ende opp med overfitt av data. Overtilpasning betyr at ytelsen til modellen reduseres betydelig for nye kommende data. Maskinen lรฆrte de smรฅ detaljene i datasettet og strever med รฅ generalisere det generelle mรธnsteret.

Antall klynger avhenger av typen av datasett, industrien, virksomheten og sรฅ videre. Det er imidlertid en tommelfingerregel for รฅ velge riktig antall klynger:

Velg antall Clusters

med lik antall observasjoner i datasettet.

Generelt sett er det interessant รฅ bruke tid pรฅ รฅ sรธke etter den beste verdien for รฅ passe med forretningsbehovet.

Vi vil bruke datasettet Priser pรฅ personlige datamaskiner for รฅ utfรธre klyngeanalysen vรฅr. Dette datasettet inneholder 6259 observasjoner og 10 funksjoner. Datasettet observerer prisen fra 1993 til 1995 pรฅ 486 personlige datamaskiner i USA. Variablene er blant annet pris, hastighet, ram, skjerm, cd.

Du vil fortsette som fรธlger:

  • Import datoer
  • Tren modellen
  • Evaluer modellen

Import datoer

K betyr ikke er egnet for faktorvariabler fordi det er basert pรฅ avstanden og diskrete verdier ikke returnerer meningsfulle verdier. Du kan slette de tre kategoriske variablene i datasettet vรฅrt. Dessuten mangler det ingen verdier i dette datasettet.

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)

Produksjon

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

Fra oppsummeringsstatistikken kan du se at dataene har store verdier. En god praksis med k gjennomsnitt og avstandsberegning er รฅ omskalere dataene slik at gjennomsnittet er lik รฉn og standardavviket er lik null.

summary(df)

Utgang:

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

Du skalerer variablene pรฅ nytt med scale()-funksjonen til dplyr-biblioteket. Transformasjonen reduserer effekten av uteliggere og gjรธr det mulig รฅ sammenligne en eneste observasjon med gjennomsnittet. Hvis en standardisert verdi (eller z-poengsum) er hรธy, kan du vรฆre sikker pรฅ at denne observasjonen faktisk er over gjennomsnittet (en stor z-score betyr at dette punktet er langt unna gjennomsnittet nรฅr det gjelder standardavvik. En z-score pรฅ to indikerer at verdien er 2 standard avvik fra gjennomsnittet. Merk at z-skรฅren fรธlger en gaussisk fordeling og er symmetrisk rundt gjennomsnittet.

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-basen har en funksjon for รฅ kjรธre k-middelalgoritmen. Den grunnleggende funksjonen til k gjennomsnitt er:

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

Tren modellen

I figur tre beskrev du hvordan algoritmen fungerer. Du kan se hvert trinn grafisk med den flotte pakken bygget av Yi Hui (ogsรฅ skaperen av Knit for Rmarkdown). Pakkeanimasjonen er ikke tilgjengelig i conda-biblioteket. Du kan bruke den andre mรฅten รฅ installere pakken med install.packages(โ€œanimasjonโ€). Du kan sjekke om pakken er installert i vรฅr Anaconda-mappe.

install.packages("animation")

Etter at du har lastet inn biblioteket, legger du til .ani etter kmeans og R vil plotte alle trinnene. For illustrasjonsformรฅl kjรธrer du bare algoritmen med de reskalerte variablene hd og ram med tre klynger.

set.seed(2345)
library(animation)
kmeans.ani(rescale_df[2:3], 3)

Code Forklaring

  • kmeans.ani(rescale_df[2:3], 3): Velg kolonne 2 og 3 i rescale_df datasett og kjรธr algoritmen med k sett til 3. Plott animasjonen.

Tren modellen

Tren modellen

Du kan tolke animasjonen som fรธlger:

  • Trinn 1: R velger tilfeldig tre poeng
  • Trinn 2: Beregn den euklidiske avstanden og tegn klyngene. Du har en klynge i grรธnt nederst til venstre, en stor klynge farget i svart til hรธyre og en rรธd mellom dem.
  • Trinn 3: Beregn tyngdepunktet, dvs. gjennomsnittet av klyngene
  • Gjenta til ingen data endrer klynge

Algoritmen konvergerte etter syv iterasjoner. Du kan kjรธre k-mean-algoritmen i datasettet vรฅrt med fem klynger og kalle det pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • Listen pc_cluster inneholder syv interessante elementer:
  • pc_cluster$cluster: Indikerer klyngen for hver observasjon
  • pc_cluster$centers: Klyngen sentre
  • pc_cluster$totss: Den totale summen av kvadrater
  • pc_cluster$withinss: Innenfor summen av kvadratet. Antallet komponenter returnerer er lik "k".
  • pc_cluster$tot.withinss: Summen av insidess
  • pc_clusterbetweenss: Total sum av kvadrat minus Innen sum av kvadrat
  • pc_cluster$size: Antall observasjoner innenfor hver klynge

Du vil bruke summen av den indre summen av kvadratet (dvs. tot.withinss) for รฅ beregne det optimale antallet klynger k. ร… finne k er virkelig en betydelig oppgave.

Optimal k

En teknikk for รฅ velge den beste k kalles albuemetoden. Denne metoden bruker homogenitet innen gruppe eller heterogenitet innen gruppe for รฅ evaluere variabiliteten. Du er med andre ord interessert i prosentandelen av variansen som forklares av hver klynge. Du kan forvente at variabiliteten รธker med antall klynger, alternativt avtar heterogeniteten. Utfordringen vรฅr er รฅ finne k-en som er hinsides den avtagende avkastningen. ร… legge til en ny klynge forbedrer ikke variasjonen i dataene fordi det er svรฆrt lite informasjon igjen รฅ forklare.

I denne opplรฆringen finner vi dette punktet ved รฅ bruke heterogenitetsmรฅlet. Summen av kvadrater innenfor klynger er tot.withinss i listen returnerer med kmean().

Du kan konstruere albuegrafen og finne den optimale k som fรธlger:

  • Trinn 1: Konstruer en funksjon for รฅ beregne totalsummen av kvadrater innenfor klynger
  • Trinn 2: Kjรธr algoritmetidene
  • Trinn 3: Lag en dataramme med resultatene av algoritmen
  • Trinn 4: Plott resultatene

Trinn 1) Konstruer en funksjon for รฅ beregne totalsummen av kvadrater innenfor klynger

Du oppretter funksjonen som kjรธrer k-middelalgoritmen og lagrer totalsummen innenfor klynger summen av kvadrater

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

Code Forklaring

  • funksjon(k): Angi antall argumenter i funksjonen
  • kmeans(rescale_df, k): Kjรธr algoritmen k ganger
  • return(cluster$tot.withinss): Lagre totalsummen i klynger summen av kvadrater

Du kan teste funksjonen med lik 2.

Utgang:

## Try with 2 cluster
kmean_withinss(2)

Utgang:

## [1] 27087.07

Trinn 2) Kjรธr algoritmen n ganger

Du vil bruke sapply()-funksjonen til รฅ kjรธre algoritmen over et omrรฅde pรฅ k. Denne teknikken er raskere enn รฅ lage en lรธkke og lagre verdien.

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

Code Forklaring

  • max_k <-20: Sett et maksimalt antall til 20
  • sapply(2:max_k, kmean_withinss): Kjรธr funksjonen kmean_withinss() over et omrรฅde 2:max_k, dvs. 2 til 20.

Trinn 3) Lag en dataramme med resultatene av algoritmen

Etter opprettelse og testing av funksjonen vรฅr kan du kjรธre k-middelalgoritmen over et omrรฅde fra 2 til 20, lagre tot.withinss-verdiene.

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

Code Forklaring

  • data.frame(2:max_k, wss): Lag en dataramme med utdata fra algoritmelageret i wss

Trinn 4) Plott resultatene

Du plotter grafen for รฅ visualisere hvor albuepunktet er

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

Optimal k

Fra grafen kan du se den optimale k er syv, hvor kurven begynner รฅ ha en avtagende avkastning.

Nรฅr du har vรฅr optimale k, kjรธrer du algoritmen pรฅ nytt med k er lik 7 og evaluerer klyngene.

Undersรธker klyngen

pc_cluster_2 <-kmeans(rescale_df, 7)

Som nevnt fรธr, kan du fรฅ tilgang til den gjenvรฆrende interessante informasjonen i listen returnert av kmean().

pc_cluster_2$cluster
pc_cluster_2$centers
pc_cluster_2$size

Evalueringsdelen er subjektiv og er avhengig av bruken av algoritmen. Mรฅlet vรฅrt her er รฅ samle datamaskiner med lignende funksjoner. En datamann kan gjรธre jobben for hรฅnd og gruppedatamaskin basert pรฅ sin ekspertise. Imidlertid vil prosessen ta mye tid og vil vรฆre utsatt for feil. K-mean-algoritmen kan forberede feltet for ham/henne ved รฅ foreslรฅ klynger.

Som en forhรฅndsevaluering kan du undersรธke stรธrrelsen pรฅ klyngene.

pc_cluster_2$size

Utgang:

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

Den fรธrste klyngen er sammensatt av 608 observasjoner, mens den minste klyngen, nummer 4, bare har 580 datamaskiner. Det kan vรฆre greit รฅ ha homogenitet mellom klynger, hvis ikke, kan det vรฆre nรธdvendig med en tynnere dataforberedelse.

Du fรฅr en dypere titt pรฅ dataene med senterkomponenten. Radene refererer til nummereringen av klyngen og kolonnene variablene som brukes av algoritmen. Verdiene er den gjennomsnittlige poengsummen for hver klynge for den interesserte kolonnen. Standardisering gjรธr tolkningen enklere. Positive verdier indikerer at z-skรฅren for en gitt klynge er over det totale gjennomsnittet. For eksempel har klynge 2 det hรธyeste prisgjennomsnittet blant alle klyngene.

center <-pc_cluster_2$centers
center

Utgang:

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

Du kan lage et varmekart med ggplot for รฅ hjelpe oss med รฅ fremheve forskjellen mellom kategorier.

Standardfargene til ggplot mรฅ endres med RColorBrewer-biblioteket. Du kan bruke conda bibliotek og koden som skal startes i terminalen:

conda installer -cr r-rcolorbrewer

For รฅ lage et varmekart gรฅr du frem i tre trinn:

  • Bygg en dataramme med verdiene til senteret og lag en variabel med nummeret til klyngen
  • Omform dataene med gather()-funksjonen til tidyr-biblioteket. Du vil transformere data fra brede til lange.
  • Lag fargepaletten med fargerRampPalett() funksjon

Trinn 1) Bygg en dataramme

La oss lage omformingsdatasettet

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)

Utgang:

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

Trinn 2) Omform dataene

Koden nedenfor lager paletten med farger du skal bruke til รฅ plotte varmekartet.

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

Trinn 3) Visualiser

Du kan plotte grafen og se hvordan klyngene ser ut.

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

Undersรธker Cluster

Sammendrag

Vi kan oppsummere k-middelalgoritmen i tabellen nedenfor

Pakke Mรฅlet Funksjon Argument
basen Tog k-middel kmeans () df, k
Tilgangsklynge kmeans()$cluster
Cluster sentre kmeans()$sentre
Stรธrrelse klynge kmeans()$stรธrrelse

Oppsummer dette innlegget med: