K-betyder kluster i R med exempel

Innehållsförteckning:

Anonim

I den här handledningen lär du dig

  • Vad är klusteranalys?
  • K-betyder algoritm
  • Optimal k

Vad är klusteranalys?

Klusteranalys är en del av det övervakade lärandet . Ett kluster är en grupp data som delar liknande funktioner. Vi kan säga, klusteranalys handlar mer om upptäckt än en förutsägelse. Maskinen söker efter likhet i data. Du kan till exempel använda klusteranalys för följande applikation:

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

Klusteranalys är inte så svårt att genomföra och är meningsfullt och handlingsbart för företag.

Den mest slående skillnaden mellan övervakat och ö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 strävan att märka data baserat på nära släkt. Det är upp till analytikern att använda grupperna och ge dem ett namn.

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

I följande diagram plottar du de totala utgifterna 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()

Ett mönster är synligt vid denna punkt

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

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

I den här handledningen lär du dig hur du använder algoritmen k-means .

K-betyder algoritm

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

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

Algoritmen fungerar enligt följande:

  • Steg 1: Välj grupper i funktionsplanen slumpmässigt
  • Steg 2: Minimera avståndet mellan klustercentret och de olika observationerna ( centroid ). Det resulterar i grupper med observationer
  • Steg 3: Förskjut initialcentroid till medelvärdet av koordinaterna i en grupp.
  • Steg 4: Minimera avståndet enligt de nya centroiderna. Nya gränser skapas. Således kommer observationer att flytta från en grupp till en annan
  • Upprepa tills ingen observation ändrar grupper

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

Olika mått är tillgängliga, till exempel Manhattan-avståndet eller Minlowski-avståndet. Observera att K-mean returnerar olika grupper varje gång du kör algoritmen. Kom ihåg att de första initiala gissningarna är slumpmässiga och beräkna avstånden tills algoritmen når en homogenitet inom grupper. Det vill säga att k-mean är mycket känsligt för förstahandsvalet, och såvida inte antalet observationer och grupper är små är det nästan omöjligt att få samma kluster.

Välj antal kluster

En annan svårighet med k-medel är valet av antal kluster. Du kan ställa in ett högt värde på, det vill säga ett stort antal grupper, för att förbättra stabiliteten men du kan sluta med överflöd av data. Överdimensionering 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å datamängden, branschen, företaget och så vidare. Det finns dock en tumregel för att välja lämpligt antal kluster:

med lika med antalet observationer i datasetet.

Generellt sett är det intressant att spendera tid på att söka efter det bästa värdet av att passa affärsbehovet.

Vi använder datamängden Priser för personliga datorer för att utföra vår klusteranalys. Denna dataset innehåller 6259 observationer och 10 funktioner. Datauppsättningen följer priset från 1993 till 1995 på 486 persondatorer i USA. Variablerna är bland annat pris, hastighet, ram, skärm, cd.

Du fortsätter enligt följande:

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

Importera data

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 radera de tre kategoriska variablerna i vår dataset. Dessutom saknas inga värden i denna dataset.

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… 

Från sammanfattningsstatistiken kan du se att data har stora värden. En bra praxis med k medelvärde och avståndsberäkning är att ändra skalan på 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 skalfunktionen () i dplyr-biblioteket. Transformationen minskar effekterna av avvikare och gör det möjligt att jämföra en enda observation mot medelvärdet. Om ett standardiserat värde (eller z-poäng ) är högt, kan du vara säker på att denna observation verkligen ligger över medelvärdet (en stor z-poäng innebär att denna punkt ligger långt ifrån medelvärdet i termer av standardavvikelse. A z- poäng på två indikerar att värdet är två standardavvikelser 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-bas har en funktion för att köra k-medelalgoritmen. Den grundläggande funktionen för k betyder är:

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

Träna modellen

I figur tre redogjorde du för hur algoritmen fungerar. Du kan se varje steg grafiskt med det fantastiska paketet byggt av Yi Hui (även skapare av Knit for Rmarkdown). Paketets animering finns inte i conda-biblioteket. Du kan använda det andra sättet 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 planerar alla steg. För illustrationsändamål 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-uppsättningar till 3. Plotta animeringen.

Du kan tolka animationen enligt följande:

  • Steg 1: R väljer slumpmässigt tre poäng
  • Steg 2: Beräkna det euklidiska avståndet och dra klusterna. 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 centroid, dvs medelvärdet av klusterna
  • Upprepa tills inga data ändras kluster

Algoritmen konvergerade efter sju iterationer. Du kan köra k-mean-algoritmen i vår dataset 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 $ centres: Klustret centrerar
  • pc_cluster $ totss: Den totala summan av rutor
  • pc_cluster $ withinss: Inom summan av kvadrat. Antalet komponenters retur är lika med "k"
  • pc_cluster $ tot.withinss: Summan av withinss
  • pc_clusterbetweenss: Summan av kvadraten minus Inom summan av kvadraten
  • pc_cluster $ storlek: Antal observationer inom varje kluster

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

Optimal k

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

I denna handledning hittar vi den här punkten med hjälp av heterogenitetsmåttet. Den totala summan av kvadraterna inom kluster är totalsvängden i listan returnerar med kmean ().

Du kan konstruera armbågsdiagrammet och hitta den optimala k enligt följande:

  • Steg 1: Konstruera en funktion för att beräkna summan inom kluster summan av kvadrater
  • Steg 2: Kör algoritmtiderna
  • Steg 3: Skapa en dataram med algoritmens resultat
  • Steg 4: Rita upp resultaten

Steg 1) Konstruera en funktion för att beräkna den totala summan av rutor

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
  • retur (kluster $ tot.withinss): Spara summan inom kluster summan av rutor

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 använder funktionen sapply () 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 clustermax_k <-20# Run algorithm over a range of kwss <- 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 algoritmens resultat

Efter att du skapat och testat 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 graphelbow <-data.frame(2:max_k, wss)

Kodförklaring

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

Steg 4) Rita upp resultaten

Du plottar diagrammet för att visualisera var armbågen är

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

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

När du väl har vår optimala k, kör du igen algoritmen med k är lika med 7 och utvärderar klusterna.

Undersöker klustret

pc_cluster_2 <-kmeans(rescale_df, 7)

Som nämnts tidigare kan du få tillgång till den återstående intressanta informationen i listan som returneras av kmean ().

pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size 

Utvärderingsdelen är subjektiv och bygger på algoritmen. Vårt mål här är att samla in dator med liknande funktioner. En datorkille kan göra jobbet för hand och gruppdator baserat på hans expertis. Processen tar dock 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 tidigare utvärdering kan du undersöka storleken på klusterna.

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, endast har 580 datorer. Det kan vara bra att ha homogenitet mellan kluster, om inte, kan en tunnare dataförberedelse krävas.

Du får en djupare titt på data med mittkomponenten. Raderna hänvisar till numreringen av klustret och kolumnerna variablerna som används av algoritmen. Värdena är den genomsnittliga poängen för varje kluster för den intresserade kolumnen. Standardisering underlättar tolkningen. Positiva värden indikerar att z-poängen för ett givet kluster ligger över det totala genomsnittet. Till exempel har kluster 2 det högsta prisgenomsnittet bland alla kluster.

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

Standardfärgerna på ggplot måste ändras med RColorBrewer-biblioteket. Du kan använda conda-biblioteket och koden för att starta i terminalen:

conda install -cr r-rcolorbrewer

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

  • Bygg en dataram med värdena i mitten och skapa en variabel med numret på klustret
  • Omforma data med funktionen collect () i tidyr-biblioteket. Du vill omvandla data från bred till lång.
  • Skapa paletten med färger med funktionen ColorRampPalette ()

Steg 1) Bygg en dataram

Låt oss skapa omformningsdatasetet

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

Steg 2) Forma om data

Koden nedan skapar en palett med färger som du använder för att plotta värmekartan.

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

Steg 3) Visualisera

Du kan plotta diagrammet och se hur klusterna 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()

Sammanfattning

Vi kan sammanfatta k-medelalgoritmen i tabellen nedan

Paket

Mål

fungera

argument

bas

Träna k-mean

kmeans ()

df, k

Åtkomstkluster

kmeans () $ kluster

Cluster centra

kmeans () $ centra

Storlekskluster

kmeans () $ storlek