I denne veiledningen vil du lære
- Hva er klyngeanalyse?
- K-betyr algoritme
- Optimal k
Hva er klyngeanalyse?
Klyngeanalyse er en del av den uten tilsynet læring . En klynge er en gruppe data som har lignende funksjoner. Vi kan si at klyngeanalyse handler mer om oppdagelse enn en spådom. Maskinen søker etter likhet i dataene. For eksempel kan du bruke klyngeanalyse for følgende applikasjon:
- Kundesegmentering: Ser etter likhet mellom kundegrupper
- Aksjemarkedsklynging: Gruppebeholdning basert på ytelse
- Reduser dimensjonaliteten til et datasett ved å gruppere observasjoner med lignende verdier
Klyngeanalyse er ikke så vanskelig å implementere og er meningsfull og handlingsbar for virksomheten.
Den mest påfallende forskjellen mellom veiledet og ikke-tilsynet læring ligger i resultatene. Uovervåket læring skaper en ny variabel, etiketten, mens veiledet læring forutsier et resultat. Maskinen hjelper utøveren i arbeidet med å merke dataene basert på nær sammenheng. Det er opp til analytikeren å benytte seg av gruppene og gi et navn til dem.
La oss lage et eksempel for å forstå konseptet med klynging. For enkelhets skyld jobber vi i to dimensjoner. Du har data om det totale forbruket av 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()
Et mønster er synlig på dette punktet
- Nederst til venstre kan du se unge mennesker med lavere kjøpekraft
- Øvre-midten reflekterer folk med en jobb som de har råd til å bruke mer
- Endelig eldre mennesker med lavere budsjett.
I figuren over grupperer du observasjonene for hånd og definerer hver av de tre gruppene. Dette eksemplet er noe greit og veldig 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 til å gruppere dataene objektivt.
I denne opplæringen lærer du hvordan du bruker k-betyr- algoritmen.
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-betyr.
Algoritmen prøver å finne grupper ved å minimere avstanden mellom observasjonene, kalt lokale optimale løsninger. Avstandene måles basert på koordinatene til observasjonene. For eksempel i et todimensjonalt rom er koordinatene enkle og.
Algoritmen fungerer som følger:
- Trinn 1: Velg grupper i funksjonsplanen tilfeldig
- Trinn 2: Minimer avstanden mellom klyngesenteret og de forskjellige observasjonene ( sentroid ). Det resulterer i grupper med observasjoner
- Trinn 3: Skift den første sentroid til gjennomsnittet av koordinatene i en gruppe.
- Trinn 4: Minimer avstanden i henhold til de nye sentroidene. Nye grenser skapes. Dermed vil observasjoner bevege seg fra en gruppe til en annen
- Gjenta til ingen observasjon endrer grupper
K-betyr tar vanligvis den euklidiske avstanden mellom funksjonen og funksjonen:
Ulike tiltak er tilgjengelige, for eksempel 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 beregner avstandene til algoritmen når en homogenitet i grupper. Det vil si at k-mean er veldig følsom for førstevalget, og med mindre antall observasjoner og grupper er lite, er det nesten umulig å få den samme grupperingen.
Velg antall klynger
En annen vanskelighet funnet med k-middel er valget av antall klynger. Du kan angi en høy verdi på, dvs. et stort antall grupper, for å forbedre stabiliteten, men du kan ende opp med overdrift av data. Overmontering betyr at ytelsen til modellen reduseres betydelig for nye kommende data. Maskinen lærte de små detaljene i datasettet og sliter med å generalisere det generelle mønsteret.
Antall klynger avhenger av naturen til datasettet, bransjen, virksomheten og så videre. Imidlertid er det en tommelfingerregel for å velge riktig antall klynger:
med tilsvarer antall observasjoner i datasettet.
Generelt sett er det interessant å bruke tid på å søke etter den beste verdien av å passe til forretningsbehovet.
Vi vil bruke datasettet Priser for personlige datamaskiner til å utføre klyngeanalysen. 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 fortsetter som følger:
- Importer data
- Tren modellen
- Evaluer modellen
Importer data
K betyr er ikke egnet for faktorvariabler fordi det er basert på avstanden og diskrete verdier ikke gir 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,… ## $ trend1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
Fra sammendragsstatistikken kan du se at dataene har store verdier. En god praksis med k middel- og avstandsberegning er å omskalere dataene slik at gjennomsnittet er lik ett og standardavviket er lik null.
summary(df)
Produksjon:
## 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 om variablene med skalaen () -funksjonen til dplyr-biblioteket. Transformasjonen reduserer virkningen av avvikere og gjør det mulig å sammenligne en eneste observasjon mot gjennomsnittet. Hvis en standardisert verdi (eller z-score ) er høy, kan du være trygg på at denne observasjonen faktisk er over gjennomsnittet (en stor z-score innebærer at dette punktet er langt borte fra gjennomsnittet når det gjelder standardavvik. A z- score på to indikerer at verdien er to standardavvik fra gjennomsnittet. Merk at z-poengsummen 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 base har en funksjon for å kjøre k middelalgoritmen. Den grunnleggende funksjonen til k middel er:
kmeans(df, k)arguments:-df: dataset used to run the algorithm-k: Number of clusters
Tren modellen
I figur tre detaljerte du hvordan algoritmen fungerer. Du kan se hvert trinn grafisk med den flotte pakken som er laget av Yi Hui (også skaper 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 Anaconda-mappen.
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 skalerte variablene hd og ram med tre klynger.
set.seed(2345)library(animation)kmeans.ani(rescale_df[2:3], 3)
Kode Forklaring
- kmeans.ani (rescale_df [2: 3], 3): Velg kolonnene 2 og 3 i rescale_df datasett og kjør algoritmen med k sett til 3. Plott animasjonen.
Du kan tolke animasjonen som følger:
- Trinn 1: R velger tilfeldig tre poeng
- Trinn 2: Beregn den euklidiske avstanden og trekk 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 sentroid, dvs. gjennomsnittet av klyngene
- Gjenta til ingen data endrer klyngen
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 $ sentre: Klyngesentrene
- pc_cluster $ totss: Den totale summen av firkanter
- pc_cluster $ withinss: Innen sum av kvadrat. Antall komponenters retur er lik "k"
- pc_cluster $ tot.withinss: Summen av withinss
- pc_clusterbetweenss: Total sum av kvadrat minus Innen sum av kvadrat
- pc_cluster $ størrelse: Antall observasjoner i hver klynge
Du vil bruke summen av den innvendige summen av kvadratet (dvs. tot.withinss) for å beregne det optimale antall klynger k. Å finne k er virkelig en betydelig oppgave.
Optimal k
En teknikk for å velge den beste k kalles albue-metoden . Denne metoden bruker homogenitet i gruppen eller heterogenitet i gruppen for å evaluere variabiliteten. Med andre ord er du interessert i prosentandelen av variansen som er forklart av hver klynge. Du kan forvente at variasjonen øker med antall klynger, alternativt avtar heterogeniteten. Vår utfordring er å finne k som er utenfor den avtagende avkastningen. Hvis du legger til en ny klynge, forbedres ikke variabiliteten i dataene fordi det er veldig få informasjon som er igjen å forklare.
I denne opplæringen finner vi dette punktet ved hjelp av heterogenitetsmål. Totalen innenfor klyngesummen av kvadrater er tot.mediene i listen returnerer med kmean ().
Du kan konstruere albuegrafen og finne den optimale k som følger:
- Trinn 1: Konstruer en funksjon for å beregne totalen innenfor klyngesummen av kvadrater
- Trinn 2: Kjør algoritmene
- Trinn 3: Lag en dataramme med resultatene av algoritmen
- Trinn 4: Plott resultatene
Trinn 1) Konstruer en funksjon for å beregne totalen innenfor klyngesummen av kvadrater
Du oppretter funksjonen som kjører algoritmen k-mean og lagrer summen innenfor klyngesummen av kvadrater
kmean_withinss <- function(k) {cluster <- kmeans(rescale_df, k)return (cluster$tot.withinss)}
Kode Forklaring
- funksjon (k): Angi antall argumenter i funksjonen
- kmeans (rescale_df, k): Kjør algoritmen k ganger
- return (cluster $ tot.withinss): Lagre summen innenfor klyngesummen av kvadrater
Du kan teste funksjonen med lik 2.
Produksjon:
## Try with 2 cluster
kmean_withinss(2)
Produksjon:
## [1] 27087.07
Trinn 2) Kjør algoritmen n ganger
Du vil bruke funksjonen sapply () til å kjøre algoritmen over et område på k. Denne teknikken er raskere enn å lage en løkke og lagre verdien.
# Set maximum clustermax_k <-20# Run algorithm over a range of kwss <- sapply(2:max_k, kmean_withinss)
Kode Forklaring
- max_k <-20: Angi et maksimalt antall på 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
Når du oppretter og tester funksjonen vår, kan du kjøre algoritmen k-mean over et område fra 2 til 20, lagre tot.withinss-verdiene.
# Create a data frame to plot the graphelbow <-data.frame(2:max_k, wss)
Kode Forklaring
- data.frame (2: max_k, wss): Opprett en dataramme med utgangen fra algoritmelageret i wss
Trinn 4) Plott resultatene
Du tegner grafen for å visualisere hvor albuepunktet er
# 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))
Fra grafen kan du se at optimal k er syv, der kurven begynner å få en avtagende avkastning.
Når du har vår optimale k, kjører du algoritmen på nytt med k er lik 7 og vurderer klyngene.
Undersøk klyngen
pc_cluster_2 <-kmeans(rescale_df, 7)
Som nevnt før, kan du få tilgang til gjenværende interessant informasjon i listen returnert av kmean ().
pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size
Evalueringsdelen er subjektiv og er avhengig av bruk av algoritmen. Målet vårt her er å samle datamaskiner med lignende funksjoner. En datamaskin kan gjøre jobben for hånd og gruppere datamaskiner basert på hans ekspertise. Prosessen vil imidlertid ta mye tid og vil være utsatt for feil. K-mean-algoritme kan forberede feltet for ham / henne ved å foreslå klynger.
Som en tidligere evaluering kan du undersøke størrelsen på klyngene.
pc_cluster_2$size
Produksjon:
## [1] 608 1596 1231 580 1003 699 542
Den første klyngen består av 608 observasjoner, mens den minste klyngen, nummer 4, bare har 580 datamaskiner. Det kan være bra å ha homogenitet mellom klynger, hvis ikke, kan det kreves en tynnere dataklargjøring.
Du får en dypere titt på dataene med midtkomponenten. Radene refererer til nummereringen av klyngen og kolonnene variablene som brukes av algoritmen. Verdiene er gjennomsnittlig poengsum for hver klynge for den interesserte kolonnen. Standardisering gjør tolkningen enklere. Positive verdier indikerer at z-poengsummen 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$centerscenter
Produksjon:
## 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 å markere forskjellen mellom kategorier.
Standardfargene på ggplot må endres med RColorBrewer-biblioteket. Du kan bruke condabiblioteket og koden til å starte i terminalen:
conda install -cr r-rfargebrygger
For å lage et varmekart, fortsett i tre trinn:
- Bygg en dataramme med verdiene i sentrum, og opprett en variabel med klyngens nummer
- Form dataene på nytt med samle () -funksjonen til tidyr-biblioteket. Du vil transformere data fra bred til lang.
- Lag paletten med farger med colorRampPalette () -funksjonen
Trinn 1) Bygg en dataramme
La oss lage omformingsdatasettet
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)
Produksjon:
## 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) Form dataene på nytt
Koden nedenfor lager fargepaletten du vil bruke til å plotte varmekartet.
library(RColorBrewer)# Create the palettehm.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 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()
Sammendrag
Vi kan oppsummere k-middelalgoritmen i tabellen nedenfor
Pakke |
Objektiv |
funksjon |
argument |
---|---|---|---|
utgangspunkt |
Tren k-middel |
kmeans () |
df, k |
Tilgangsklynge |
kmeans () $ klynge | ||
Klyngesentre |
kmeans () $ sentre | ||
Størrelse klynge |
kmeans () $ størrelse |