K-betyder klyngedannelse i R med eksempel

Indholdsfortegnelse:

Anonim

I denne vejledning lærer du

  • Hvad er klyngeanalyse?
  • K-betyder algoritme
  • Optimal k

Hvad er klyngeanalyse?

Klyngeanalyse er en del af den ikke- overvågede læring . En klynge er en gruppe data, der deler lignende funktioner. Vi kan sige, klyngeanalyse handler mere om opdagelse end en forudsigelse. Maskinen søger efter lighed i dataene. For eksempel kan du bruge klyngeanalyse til følgende anvendelse:

  • Kundesegmentering: Ser efter lighed mellem kundegrupper
  • Aktiemarkedsklynger: Gruppebeholdning baseret på præstationer
  • Reducer dimensionaliteten af ​​et datasæt ved at gruppere observationer med lignende værdier

Klyngeanalyse er ikke så vanskelig at implementere og er meningsfuld og handlingsmæssig for virksomheden.

Den mest slående forskel mellem overvåget og ikke-overvåget læring ligger i resultaterne. Uovervåget læring skaber en ny variabel, etiketten, mens overvåget læring forudsiger et resultat. Maskinen hjælper den praktiserende læge i søgen efter at mærke dataene baseret på tæt sammenhæng. Det er op til analytikeren at gøre brug af grupperne og give dem et navn.

Lad os lave et eksempel for at forstå begrebet klyngedannelse. For enkelheds skyld arbejder vi i to dimensioner. Du har data om det samlede forbrug af kunder og deres alder. For at forbedre annoncering ønsker marketingteamet at sende mere målrettede e-mails til deres kunder.

I den følgende graf tegner du det samlede forbrug og kundernes alder.

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 synligt på dette tidspunkt

  1. Nederst til venstre kan du se unge med lavere købekraft
  2. Øverste middel afspejler mennesker med et job, som de har råd til at bruge mere
  3. Endelig ældre med et lavere budget.

I figuren ovenfor grupperer du observationer manuelt og definerer hver af de tre grupper. Dette eksempel er noget ligetil og meget visuelt. Hvis der er tilføjet nye observationer til datasættet, kan du mærke dem inden for cirklerne. Du definerer cirklen ud fra vores vurdering. I stedet kan du bruge Machine Learning til at gruppere dataene objektivt.

I denne vejledning lærer du, hvordan du bruger algoritmen k-means .

K-betyder algoritme

K-middel er uden tvivl den mest populære klyngemetode. Forskere frigav algoritmen for årtier siden, og der er gjort mange forbedringer af k-midler.

Algoritmen forsøger at finde grupper ved at minimere afstanden mellem observationer, kaldet lokale optimale løsninger. Afstande måles ud fra koordinaterne for observationer. For eksempel i et todimensionelt rum er koordinaterne enkle og.

Algoritmen fungerer som følger:

  • Trin 1: Vælg grupper i funktionsplanen tilfældigt
  • Trin 2: Minimer afstanden mellem klyngecentret og de forskellige observationer ( centroid ). Det resulterer i grupper med observationer
  • Trin 3: Skift den indledende centroid til gennemsnittet af koordinaterne i en gruppe.
  • Trin 4: Minimer afstanden i henhold til de nye centroider. Nye grænser skabes. Således vil observationer bevæge sig fra en gruppe til en anden
  • Gentag, indtil ingen observation skifter gruppe

K-betyder tager normalt den euklidiske afstand mellem funktionen og funktionen:

Forskellige mål er tilgængelige såsom Manhattan afstand eller Minlowski afstand. Bemærk, at K-middel returnerer forskellige grupper hver gang du kører algoritmen. Husk, at de første indledende gæt er tilfældige og beregner afstande, indtil algoritmen når en homogenitet inden for grupper. Det vil sige, k-middel er meget følsom over for førstevalget, og medmindre antallet af observationer og grupper er lille, er det næsten umuligt at få den samme gruppering.

Vælg antallet af klynger

En anden vanskelighed fundet med k-middel er valget af antallet af klynger. Du kan indstille en høj værdi på, dvs. et stort antal grupper, for at forbedre stabiliteten, men du ender muligvis med overfit af data. Overfitting betyder, at ydeevnen af ​​modellen falder betydeligt for nye kommende data. Maskinen lærte de små detaljer i datasættet og kæmper for at generalisere det overordnede mønster.

Antallet af klynger afhænger af datasættets art, branche, forretning og så videre. Der er dog en tommelfingerregel for at vælge det passende antal klynger:

med er lig med antallet af observation i datasættet.

Generelt er det interessant at bruge tid på at søge efter den bedste værdi for at passe til forretningsbehovet.

Vi bruger datasættet Priser på personlige computere til at udføre vores klyngeanalyse. Dette datasæt indeholder 6259 observationer og 10 funktioner. Datasættet overholder prisen fra 1993 til 1995 for 486 pc'er i USA. Variablerne er blandt andet pris, hastighed, ram, skærm, cd.

Du fortsætter som følger:

  • Importer data
  • Træn modellen
  • Evaluer modellen

Importer data

K betyder ikke er egnet til faktorvariabler, fordi det er baseret på afstanden og diskrete værdier ikke returnerer meningsfulde værdier. Du kan slette de tre kategoriske variabler i vores datasæt. Derudover mangler der ingen værdier i dette datasæt.

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

Fra oversigtsstatistikken kan du se, at dataene har store værdier. En god praksis med k middel- og afstandsberegning er at omskalere dataene, så gennemsnittet er lig med et og standardafvigelsen er lig med nul.

summary(df)

Produktion:

## 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 omskalerer variablerne med skalaen () -funktionen i dplyr-biblioteket. Transformationen reducerer virkningen af ​​outliers og gør det muligt at sammenligne en eneste observation med middelværdien. Hvis en standardiseret værdi (eller z-score ) er høj, kan du være sikker på, at denne observation faktisk er over gennemsnittet (en stor z-score betyder, at dette punkt er langt væk fra gennemsnittet i standardafvigelse. A z- score på to angiver, at værdien er 2 standardafvigelser væk fra middelværdien. Bemærk, z-score følger en Gaussisk fordeling og er symmetrisk omkring gennemsnittet.

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 funktion til at køre k-middelalgoritmen. Den grundlæggende funktion af k betyder er:

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

Træn modellen

I figur tre detaljerede du, hvordan algoritmen fungerer. Du kan se hvert trin grafisk med den fantastiske pakkeopbygning af Yi Hui (også skaberen af ​​Knit for Rmarkdown). Pakkeanimationen er ikke tilgængelig i conda-biblioteket. Du kan bruge den anden måde at installere pakken med install.packages ("animation"). Du kan kontrollere, om pakken er installeret i vores Anaconda-mappe.

install.packages("animation") 

Når du har indlæst biblioteket, tilføjer du .ani efter kmeans, og R plotter alle trin. Som illustration kører du kun algoritmen med de omskalede variabler 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): Vælg kolonnerne 2 og 3 i rescale_df datasættet og kør algoritmen med k sæt til 3. Plot animationen.

Du kan fortolke animationen som følger:

  • Trin 1: R vælger tilfældigt tre point
  • Trin 2: Beregn den euklidiske afstand og træk klyngerne. Du har en klynge i grønt nederst til venstre, en stor klynge farvet i sort til højre og en rød mellem dem.
  • Trin 3: Beregn centroid, dvs. middelværdien af ​​klyngerne
  • Gentag indtil ingen data ændrer klynge

Algoritmen konvergerede efter syv iterationer. Du kan køre k-mean-algoritmen i vores datasæt med fem klynger og kalde det pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • Listen pc_cluster indeholder syv interessante elementer:
  • pc_cluster $ cluster: Angiver klyngen for hver observation
  • pc_cluster $ centre: Klyngecentrene
  • pc_cluster $ totss: Den samlede sum af firkanter
  • pc_cluster $ withinss: Inden for summen af ​​kvadratet. Antallet af komponenter returneres er lig med "k"
  • pc_cluster $ tot.withinss: Summen af ​​withinss
  • pc_clusterbetweenss: Samlet sum af kvadrat minus minus sum af kvadrat
  • pc_cluster $ størrelse: Antal observationer inden for hver klynge

Du bruger summen af ​​den inden for summen af ​​kvadratet (dvs. tot.withinss) til at beregne det optimale antal klynger k. At finde k er virkelig en væsentlig opgave.

Optimal k

En teknik til at vælge den bedste k kaldes albue-metoden . Denne metode bruger homogenitet inden for gruppen eller heterogenitet inden for gruppen til at evaluere variabiliteten. Med andre ord er du interesseret i procentdelen af ​​variansen forklaret af hver klynge. Du kan forvente, at variationen øges med antallet af klynger, alternativt falder heterogeniteten. Vores udfordring er at finde det k, der ligger ud over de faldende afkast. Tilføjelse af en ny klynge forbedrer ikke variabiliteten i dataene, fordi meget få oplysninger er tilbage at forklare.

I denne vejledning finder vi dette punkt ved hjælp af heterogenitetsmålingen. Det samlede antal inden for klynger summen af ​​firkanter er tot.withinss i listen returnerer med kmean ().

Du kan konstruere albue-grafen og finde den optimale k som følger:

  • Trin 1: Konstruer en funktion til at beregne det samlede antal inden for klyngesummen af ​​firkanter
  • Trin 2: Kør algoritmetiderne
  • Trin 3: Opret en dataramme med resultaterne af algoritmen
  • Trin 4: Plot resultaterne

Trin 1) Konstruer en funktion til at beregne det samlede antal inden for klyngesummen af ​​firkanter

Du opretter den funktion, der kører k-middelalgoritmen og gemmer det samlede antal inden for klyngesummen af ​​kvadrater

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

Kode Forklaring

  • funktion (k): Indstil antallet af argumenter i funktionen
  • kmeans (rescale_df, k): Kør algoritmen k gange
  • return (cluster $ tot.withinss): Gem det samlede antal inden for klyngesummen af ​​firkanter

Du kan teste funktionen med lig med 2.

Produktion:

## Try with 2 cluster
kmean_withinss(2)

Produktion:

## [1] 27087.07 

Trin 2) Kør algoritmen n gange

Du bruger funktionen sapply () til at køre algoritmen over et interval på k. Denne teknik er hurtigere end at skabe en loop og gemme værdien.

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

Kode Forklaring

  • max_k <-20: Indstil et maksimalt antal til 20
  • sapply (2: max_k, kmean_withinss): Kør funktionen kmean_withinss () over et interval 2: max_k, dvs. 2 til 20.

Trin 3) Opret en dataramme med resultaterne af algoritmen

Efter oprettelse og test af vores funktion, kan du køre k-middelalgoritmen over et interval fra 2 til 20, gemme tot.withinss-værdierne.

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

Kode Forklaring

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

Trin 4) Plot resultaterne

Du tegner grafen for at visualisere, hvor er albuen punkt

# 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 den optimale k er syv, hvor kurven begynder at have et faldende afkast.

Når du har vores optimale k, kører du algoritmen igen med k lig med 7 og vurderer klyngerne.

Undersøgelse af klyngen

pc_cluster_2 <-kmeans(rescale_df, 7)

Som nævnt før kan du få adgang til de resterende interessante oplysninger på listen returneret af kmean ().

pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size 

Evalueringsdelen er subjektiv og er afhængig af brugen af ​​algoritmen. Vores mål her er at samle computer med lignende funktioner. En computer fyr kan udføre jobbet manuelt og gruppere computere baseret på hans ekspertise. Processen tager dog meget tid og vil være udsat for fejl. K-middel-algoritme kan forberede marken for ham / hende ved at foreslå klynger.

Som en forudgående evaluering kan du undersøge størrelsen på klyngerne.

pc_cluster_2$size

Produktion:

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

Den første klynge består af 608 observationer, mens den mindste klynge, nummer 4, kun har 580 computere. Det kan være godt at have homogenitet mellem klynger, hvis ikke, kan der kræves en tyndere dataforberedelse.

Du får et dybere kig på dataene med centerkomponenten. Rækkerne henviser til nummereringen af ​​klyngen og kolonnerne variablerne, der bruges af algoritmen. Værdierne er den gennemsnitlige score for hver klynge for den interesserede kolonne. Standardisering gør fortolkningen lettere. Positive værdier angiver, at z-score for en given klynge er over det samlede gennemsnit. For eksempel har klynge 2 det højeste prisgennemsnit blandt alle klynger.

center <-pc_cluster_2$centerscenter

Produktion:

## 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 oprette et varmekort med ggplot for at hjælpe os med at fremhæve forskellen mellem kategorier.

Standardfarverne på ggplot skal ændres med RColorBrewer-biblioteket. Du kan bruge kondabiblioteket og koden til at starte i terminalen:

conda install -cr r-rfarvebrygger

For at oprette et varmekort fortsætter du i tre trin:

  • Byg en dataramme med centrets værdier, og opret en variabel med klyngens nummer
  • Omform dataene med funktionen collect () i tidyr-biblioteket. Du vil transformere data fra bred til lang.
  • Opret farvepaletten med funktionen ColorRampPalette ()

Trin 1) Byg en dataramme

Lad os oprette datasættet omforme

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)

Produktion:

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

Trin 2) Omform dataene

Koden nedenfor opretter paletten med farver, du vil bruge til at plotte varmekortet.

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

Trin 3) Visualiser

Du kan plotte grafen og se, hvordan klyngerne ser ud.

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

Resumé

Vi kan opsummere k-middelalgoritmen i nedenstående tabel

Pakke

Objektiv

fungere

argument

grundlag

Tog k-middel

kmeans ()

df, k

Adgangsklynge

kmeans () $ klynge

Klyngecentre

kmeans () $ centre

Størrelse klynge

kmeans () $ størrelse