K-medel Clustering i R med Exempel

Vad är Cluster analys?

Cluster analys är en del av oövervakat lärande. Ett kluster är en grupp data som delar liknande egenskaper. Vi kan säga att klusteranalys handlar mer om upptäckt än en förutsägelse. Maskinen söker efter likheter i data. Du kan till exempel använda klusteranalys för följande applikation:

  • Kundsegmentering: Letar efter likheter mellan grupper av kunder
  • Aktiemarknadskluster: Gruppaktier baserat på prestationer
  • Minska dimensionaliteten för en datauppsättning genom att gruppera observationer med liknande värden

ClusterAnalysen är inte alltför svår att implementera och är meningsfull och användbar för företag.

Den mest slående skillnaden mellan övervakat och oövervakat lärande ligger i resultaten. Oövervakat lärande skapar en ny variabel, etiketten, medan övervakat lärande förutsäger ett resultat. Maskinen hjälper utövaren i uppdraget att märka data baserat på nära släktskap. Det är upp till analytikern att använda sig av grupperna och ge dem ett namn.

Låt oss ta ett exempel för att förstå begreppet klustring. För enkelhetens skull arbetar vi i två dimensioner. Du har data om kundernas totala utgifter och deras ålder. För att förbättra annonseringen vill marknadsföringsteamet skicka mer riktade e-postmeddelanden till sina kunder.

I följande graf plottar du den totala utgiften och kundernas ålder.

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 Analys

Ett mönster är synligt vid denna punkt

  1. Längst ner till vänster ser du unga med lägre köpkraft
  2. Övre mitten speglar människor med ett jobb som de har råd att spendera mer
  3. Slutligen äldre med lägre budget.

Cluster Analys

I figuren ovan grupperar du observationerna för hand och definierar var och en av de tre grupperna. Detta exempel är något okomplicerat och mycket visuellt. Om nya observationer läggs till i datamängden kan du märka dem i cirklarna. Du definierar cirkeln utifrån vår bedömning. Istället kan du använda Maskininlärning att gruppera uppgifterna objektivt.

I den här handledningen kommer du att lära dig hur du använder k-medel algoritm.

K-means algoritm

K-mean är utan tvekan den mest populära klustringsmetoden. Forskare släppte algoritmen för decennier sedan, och massor av förbättringar har gjorts för k-means.

Algoritmen försöker hitta grupper genom att minimera avståndet mellan observationerna, kallas lokalt optimalt lösningar. Avstånden mäts utifrån observationernas koordinater. Till exempel i ett tvådimensionellt utrymme är koordinaterna enkla och .

K-betyder Algoritm

Algoritmen fungerar enligt följande:

  • Steg 1: Välj grupper i funktionsplanen slumpmässigt
  • Steg 2: Minimera avståndet mellan klustercentrum och de olika observationerna (tyngdpunkt). Det resulterar i grupper med observationer
  • Steg 3: Shift den initiala tyngdpunkten till medelvärdet av koordinaterna inom en grupp.
  • Steg 4: Minimera avståndet enligt de nya tyngdpunkterna. Nya gränser skapas. Således kommer observationer att flytta från en grupp till en annan
  • Upprepa tills ingen observation byter grupp

K-means tar vanligtvis det euklidiska avståndet mellan funktionen och funktionen:

K-betyder Algoritm

Olika mått finns tillgängliga såsom Manhattan-distansen eller Minlowski-distansen. Observera att K-mean returnerar olika grupper varje gång du kör algoritmen. Kom ihåg att de första inledande gissningarna är slumpmässiga och beräkna avstånden tills algoritmen når en homogenitet inom grupper. Det vill säga, k-medelvärde är väldigt känsligt för förstahandsvalet, och om inte antalet observationer och grupper är litet är det nästan omöjligt att få samma klustring.

Välj antalet kluster

En annan svårighet med k-medelvärde är valet av antalet kluster. Du kan ställa in ett högt värde på , dvs ett stort antal grupper, för att förbättra stabiliteten men du kan sluta med överfit av data. Övermontering innebär att modellens prestanda minskar avsevärt för nya kommande data. Maskinen lärde sig de små detaljerna i datamängden och kämpar för att generalisera det övergripande mönstret.

Antalet kluster beror på typen av datamängd, branschen, verksamheten och så vidare. Det finns dock en tumregel för att välja rätt antal kluster:

Välj antal Clusters

med lika med antalet observationer i datamängden.

Generellt sett är det intressant att lägga tid på att söka efter det bästa värdet för att passa företagets behov.

Vi kommer att använda datauppsättningen Priser på persondatorer för att utföra vår klustringsanalys. Denna datauppsättning innehåller 6259 observationer och 10 funktioner. Datauppsättningen observerar priset från 1993 till 1995 för 486 persondatorer i USA. Variablerna är bland annat pris, hastighet, ram, skärm, cd.

Du kommer att gå tillväga enligt följande:

  • Importera datum
  • Träna modellen
  • Utvärdera modellen

Importera datum

K-medel är inte lämpligt för faktorvariabler eftersom det är baserat på avståndet och diskreta värden returnerar inte meningsfulla värden. Du kan ta bort de tre kategoriska variablerna i vår datauppsättning. Dessutom saknas det inga värden i denna datauppsättning.

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  <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...

Från den sammanfattande statistiken kan du se att data har stora värden. En bra praxis med k medelvärde och avståndsberäkning är att skala om data så att medelvärdet är lika med ett och standardavvikelsen är lika med noll.

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 skalar om variablerna med funktionen scale() i dplyr-biblioteket. Transformationen minskar effekten av extremvärden och gör det möjligt att jämföra en enda observation med medelvärdet. Om ett standardiserat värde (eller z-poäng) är hög, kan du vara säker på att denna observation verkligen ligger över medelvärdet (en stor z-poäng innebär att denna punkt är långt borta från medelvärdet i termer av standardavvikelse. En z-poäng på två indikerar att värdet är 2 standard avvikelser från medelvärdet Observera att z-poängen följer en gaussisk fördelning och är symmetrisk runt medelvärdet.

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 funktion för att köra k-medelalgoritmen. Den grundläggande funktionen för k medelvärde är:

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

Träna modellen

I figur tre beskrev du hur algoritmen fungerar. Du kan se varje steg grafiskt med det fantastiska paketet byggt av Yi Hui (även skaparen av Knit for Rmarkdown). Paketanimationen är inte tillgänglig i conda-biblioteket. Du kan använda det andra sättet för att installera paketet med install.packages(“animation”). Du kan kontrollera om paketet är installerat i vår Anaconda-mapp.

install.packages("animation")

När du har laddat biblioteket lägger du till .ani efter kmeans och R kommer att plotta alla steg. Som illustration kör du bara algoritmen med de omskalade variablerna hd och ram med tre kluster.

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

Kodförklaring

  • kmeans.ani(rescale_df[2:3], 3): Välj kolumnerna 2 och 3 i rescale_df-datauppsättningen och kör algoritmen med k set till 3. Rita animeringen.

Träna modellen

Träna modellen

Du kan tolka animationen på följande sätt:

  • Steg 1: R väljer tre poäng slumpmässigt
  • Steg 2: Beräkna det euklidiska avståndet och rita klustren. Du har ett kluster i grönt längst ner till vänster, ett stort kluster färgat i svart till höger och ett rött mellan dem.
  • Steg 3: Beräkna tyngdpunkten, dvs medelvärdet av klustren
  • Upprepa tills ingen data byter kluster

Algoritmen konvergerade efter sju iterationer. Du kan köra k-mean-algoritmen i vår datauppsättning med fem kluster och kalla den pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • Listan pc_cluster innehåller sju intressanta element:
  • pc_cluster$cluster: Indikerar klustret för varje observation
  • pc_cluster$centers: Klustret centreras
  • pc_cluster$totss: Den totala summan av kvadrater
  • pc_cluster$withinss: Inom summan av kvadraten. Antalet komponenter som returneras är lika med "k".
  • pc_cluster$tot.withinss: Summan av insidess
  • pc_clusterbetweenss: Total summa av kvadrat minus Inom summa av kvadrat
  • pc_cluster$size: Antal observationer inom varje kluster

Du kommer att använda summan av den inre summan av kvadraten (dvs. tot.withinss) för att beräkna det optimala antalet kluster k. Att hitta k är verkligen en betydande uppgift.

Optimal k

En teknik för att välja det bästa k kallas för armbågsmetod. Denna metod använder homogenitet inom gruppen eller heterogenitet inom gruppen för att utvärdera variabiliteten. Med andra ord, du är intresserad av procentandelen av variansen som förklaras av varje kluster. Du kan förvänta dig att variabiliteten ökar med antalet kluster, alternativt minskar heterogeniteten. Vår utmaning är att hitta det k som ligger bortom den minskande avkastningen. Att lägga till ett nytt kluster förbättrar inte variabiliteten i data eftersom mycket få information finns kvar att förklara.

I den här handledningen hittar vi denna punkt med hjälp av heterogenitetsmåttet. Summan av kvadrater inom kluster är tot.withinss i listans avkastning med kmean().

Du kan konstruera armbågsgrafen och hitta det optimala k enligt följande:

  • Steg 1: Konstruera en funktion för att beräkna summan av kvadrater inom kluster
  • Steg 2: Kör algoritmen gånger
  • Steg 3: Skapa en dataram med resultaten av algoritmen
  • Steg 4: Rita resultaten

Steg 1) Konstruera en funktion för att beräkna summan av kvadrater inom kluster

Du skapar funktionen som kör k-medelalgoritmen och lagrar summan inom kluster summan av kvadrater

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

Kodförklaring

  • funktion(k): Ställ in antalet argument i funktionen
  • kmeans(rescale_df, k): Kör algoritmen k gånger
  • return(cluster$tot.withinss): Lagra totalsumman inom kluster summan av kvadrater

Du kan testa funktionen med lika med 2.

Produktion:

## Try with 2 cluster
kmean_withinss(2)

Produktion:

## [1] 27087.07

Steg 2) Kör algoritmen n gånger

Du kommer att använda sapply()-funktionen för att köra algoritmen över ett intervall på k. Denna teknik är snabbare än att skapa en loop och lagra värdet.

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

Kodförklaring

  • max_k <-20: Ställ in ett maximalt antal till 20
  • sapply(2:max_k, kmean_withinss): Kör funktionen kmean_withinss() över ett intervall 2:max_k, dvs 2 till 20.

Steg 3) Skapa en dataram med resultaten av algoritmen

Efter skapandet och testning av vår funktion kan du köra k-mean-algoritmen över ett intervall från 2 till 20, lagra tot.withinss-värdena.

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

Kodförklaring

  • data.frame(2:max_k, wss): Skapa en dataram med utdata från algoritmminnet i wss

Steg 4) Rita resultaten

Du ritar grafen för att visualisera var armbågspunkten är

# 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

Från grafen kan du se det optimala k är sju, där kurvan börjar få en avtagande avkastning.

När du har vår optimala k, kör du om algoritmen med k är lika med 7 och utvärderar klustren.

Undersöker klustret

pc_cluster_2 <-kmeans(rescale_df, 7)

Som nämnts tidigare kan du komma åt den återstående intressanta informationen i listan som returneras av kmean().

pc_cluster_2$cluster
pc_cluster_2$centers
pc_cluster_2$size

Utvärderingsdelen är subjektiv och bygger på användningen av algoritmen. Vårt mål här är att samla datorer med liknande funktioner. En datorkille kan göra jobbet för hand och gruppdator utifrån sin expertis. Processen kommer dock att ta mycket tid och kommer att vara felbenägen. K-mean-algoritmen kan förbereda fältet för honom/henne genom att föreslå kluster.

Som en förutvärdering kan du undersöka storleken på klustren.

pc_cluster_2$size

Produktion:

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

Det första klustret består av 608 observationer, medan det minsta klustret, nummer 4, bara har 580 datorer. Det kan vara bra att ha homogenitet mellan klustren, om inte kan en tunnare dataförberedelse krävas.

Du får en djupare titt på data med centerkomponenten. Raderna refererar till numreringen av klustret och kolumnerna variablerna som används av algoritmen. Värdena är medelpoängen för varje kluster för den intresserade kolumnen. Standardisering gör tolkningen lättare. Positiva värden indikerar att z-poängen för ett givet kluster ligger över det totala medelvärdet. Till exempel har kluster 2 det högsta prissnittet bland alla kluster.

center <-pc_cluster_2$centers
center

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 skapa en värmekarta med ggplot för att hjälpa oss att markera skillnaden mellan kategorier.

Standardfärgerna för ggplot måste ändras med RColorBrewer-biblioteket. Du kan använda condan bibliotek och koden som ska startas i terminalen:

conda installera -cr r-rcolorbrewer

För att skapa en värmekarta fortsätter du i tre steg:

  • Bygg en dataram med värdena för mitten och skapa en variabel med klustrets nummer
  • Omforma data med funktionen gather() i tidyr-biblioteket. Du vill omvandla data från bred till lång.
  • Skapa paletten av färger med färgRampPalette() funktion

Steg 1) Bygg en dataram

Låt oss skapa omformningsdatauppsättningen

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)

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		

Steg 2) Omforma data

Koden nedan skapar paletten med färger som du kommer att använda för att rita värmekartan.

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

Steg 3) Visualisera

Du kan rita grafen och se hur klustren 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

Sammanfattning

Vi kan sammanfatta k-medelalgoritmen i tabellen nedan

Paket Mål Funktion Argument
bas Tåg k-medelvärde kmeans() df, k
Åtkomstkluster kmeans()$kluster
Cluster centra kmeans()$centers
Storlek kluster kmeans()$storlek