K-betekent clustering in R met voorbeeld

Inhoudsopgave:

Anonim

In deze tutorial leer je

  • Wat is clusteranalyse?
  • K-betekent algoritme
  • Optimale k

Wat is clusteranalyse?

Clusteranalyse maakt deel uit van het onbewaakte leren . Een cluster is een groep gegevens met vergelijkbare kenmerken. We kunnen zeggen dat clusteringanalyse meer gaat over ontdekking dan over voorspelling. De machine zoekt naar gelijkenis in de gegevens. Zo kunt u clusteranalyse gebruiken voor de volgende toepassing:

  • Klantsegmentatie: zoekt naar gelijkenis tussen groepen klanten
  • Beursclustering: groepsaandelen op basis van prestaties
  • Reduceer de dimensionaliteit van een dataset door observaties met vergelijkbare waarden te groeperen

Clusteringanalyse is niet al te moeilijk te implementeren en is zowel zinvol als uitvoerbaar voor het bedrijfsleven.

Het meest opvallende verschil tussen begeleid en onbewaakt leren zit hem in de resultaten. Ongecontroleerd leren creëert een nieuwe variabele, het label, terwijl begeleid leren een uitkomst voorspelt. De machine helpt de beoefenaar bij de zoektocht om de gegevens te labelen op basis van nauwe verwantschap. Het is aan de analist om gebruik te maken van de groepen en ze een naam te geven.

Laten we een voorbeeld geven om het concept van clustering te begrijpen. Voor de eenvoud werken we in twee dimensies. U beschikt over gegevens over de totale bestedingen van klanten en hun leeftijden. Om de reclame te verbeteren, wil het marketingteam meer gerichte e-mails naar hun klanten sturen.

In de volgende grafiek zet u de totale uitgaven en de leeftijd van de klanten uit.

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

Op dit punt is een patroon zichtbaar

  1. Linksonder zie je jonge mensen met een lagere koopkracht
  2. Boven-midden weerspiegelt mensen met een baan die ze zich meer kunnen veroorloven
  3. Eindelijk ouderen met een lager budget.

In bovenstaande figuur clusteer je de waarnemingen met de hand en definieer je elk van de drie groepen. Dit voorbeeld is enigszins rechttoe rechtaan en zeer visueel. Als er nieuwe waarnemingen aan de gegevensset worden toegevoegd, kunt u deze binnen de cirkels labelen. U definieert de cirkel op basis van ons oordeel. In plaats daarvan kunt u Machine Learning gebruiken om de gegevens objectief te groeperen.

In deze tutorial leer je hoe je het k-mean- algoritme gebruikt.

K-betekent algoritme

K-mean is zonder twijfel de meest populaire clustermethode. Onderzoekers hebben het algoritme decennia geleden uitgebracht en er zijn veel verbeteringen aangebracht in k-means.

Het algoritme probeert groepen te vinden door de afstand tussen de waarnemingen zo klein mogelijk te maken, de zogenaamde lokale optimale oplossingen. De afstanden worden gemeten op basis van de coördinaten van de waarnemingen. In een tweedimensionale ruimte zijn de coördinaten bijvoorbeeld eenvoudig en.

Het algoritme werkt als volgt:

  • Stap 1: Kies willekeurig groepen in het functieplan
  • Stap 2: Minimaliseer de afstand tussen het clustercentrum en de verschillende waarnemingen ( centroïde ). Het resulteert in groepen met observaties
  • Stap 3: Verplaats het aanvankelijke zwaartepunt naar het gemiddelde van de coördinaten binnen een groep.
  • Stap 4: Minimaliseer de afstand volgens de nieuwe centroïden. Er ontstaan ​​nieuwe grenzen. De observaties zullen dus van de ene groep naar de andere gaan
  • Herhaal dit totdat er geen observatie van groep verandert

K-betekent meestal de Euclidische afstand tussen het kenmerk en het kenmerk:

Er zijn verschillende maten beschikbaar, zoals de Manhattan-afstand of Minlowski-afstand. Merk op dat K-mean verschillende groepen retourneert elke keer dat u het algoritme uitvoert. Bedenk dat de eerste eerste gissingen willekeurig zijn en bereken de afstanden totdat het algoritme een homogeniteit binnen groepen bereikt. Dat wil zeggen, k-mean is erg gevoelig voor de eerste keuze, en tenzij het aantal waarnemingen en groepen klein is, is het bijna onmogelijk om dezelfde clustering te krijgen.

Selecteer het aantal clusters

Een andere moeilijkheid die bij k-mean wordt gevonden, is de keuze van het aantal clusters. U kunt een hoge waarde instellen van, dwz een groot aantal groepen, om de stabiliteit te verbeteren, maar het kan zijn dat u te veel gegevens krijgt. Overfitting betekent dat de prestaties van het model aanzienlijk afnemen voor nieuwe komende gegevens. De machine heeft de kleine details van de dataset geleerd en worstelt om het algemene patroon te generaliseren.

Het aantal clusters is afhankelijk van de aard van de dataset, de branche, het bedrijf enzovoort. Er is echter een vuistregel om het juiste aantal clusters te selecteren:

met gelijk aan het aantal observaties in de dataset.

Over het algemeen is het interessant om tijd te besteden aan het zoeken naar de beste waarde die past bij de zakelijke behoefte.

We zullen de gegevensset Prijzen van pc's gebruiken om onze clusteringanalyse uit te voeren. Deze dataset bevat 6259 waarnemingen en 10 kenmerken. De dataset observeert de prijs van 1993 tot 1995 van 486 personal computers in de VS. De variabelen zijn onder andere prijs, snelheid, ram, scherm, cd.

U gaat als volgt te werk:

  • Data importeren
  • Train het model
  • Evalueer het model

Data importeren

K betekent dat het niet geschikt is voor factorvariabelen omdat het gebaseerd is op de afstand en discrete waarden geen betekenisvolle waarden opleveren. U kunt de drie categorische variabelen in onze dataset verwijderen. Bovendien ontbreken er geen ontbrekende waarden in deze 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)
Uitvoer
## 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… 

Uit de samenvattende statistieken kunt u zien dat de gegevens grote waarden hebben. Een goede gewoonte met k gemiddelde en afstandsberekening is om de gegevens opnieuw te schalen zodat het gemiddelde gelijk is aan één en de standaarddeviatie gelijk is aan nul.

summary(df)

Uitgang:

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

U herschaalt de variabelen met de functie scale () van de dplyr-bibliotheek. De transformatie vermindert de impact van uitschieters en maakt het mogelijk om een ​​enkele waarneming te vergelijken met het gemiddelde. Als een gestandaardiseerde waarde (of z-score ) hoog is, kun je erop vertrouwen dat deze waarneming inderdaad boven het gemiddelde ligt (een grote z-score impliceert dat dit punt ver verwijderd is van het gemiddelde in termen van standaarddeviatie. score van twee geeft aan dat de waarde 2 standaarddeviaties verwijderd is van het gemiddelde. Let op, de z-score volgt een Gauss-verdeling en is symmetrisch rond het gemiddelde.

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 heeft een functie om het k gemiddelde algoritme uit te voeren. De basisfunctie van k bedoel is:

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

Train het model

In figuur drie heb je gedetailleerd beschreven hoe het algoritme werkt. Je kunt elke stap grafisch zien met het geweldige pakket dat is gebouwd door Yi Hui (ook de maker van Knit for Rmarkdown). De pakketanimatie is niet beschikbaar in de condabibliotheek. U kunt de andere manier gebruiken om het pakket te installeren met install.packages ("animatie"). U kunt controleren of het pakket is geïnstalleerd in onze Anaconda-map.

install.packages("animation") 

Nadat je de bibliotheek hebt geladen, voeg je .ani toe na kmeans en R zal alle stappen plotten. Ter illustratie voer je het algoritme alleen uit met de herschaalde variabelen hd en ram met drie clusters.

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

Code Verklaring

  • kmeans.ani (rescale_df [2: 3], 3): Selecteer de kolommen 2 en 3 van rescale_df dataset en voer het algoritme uit met k sets tot 3. Plot de animatie.

U kunt de animatie als volgt interpreteren:

  • Stap 1: R kiest willekeurig drie punten
  • Stap 2: Bereken de Euclidische afstand en teken de clusters. Je hebt links onderin één cluster in het groen, rechts één grote cluster in zwart gekleurd en daartussen een rode.
  • Stap 3: Bereken het zwaartepunt, dwz het gemiddelde van de clusters
  • Herhaal dit totdat er geen cluster gegevens verandert

Het algoritme convergeerde na zeven iteraties. U kunt het k-mean-algoritme in onze dataset met vijf clusters uitvoeren en het pc_cluster noemen.

pc_cluster <-kmeans(rescale_df, 5)
  • De lijst pc_cluster bevat zeven interessante elementen:
  • pc_cluster $ cluster: geeft het cluster van elke waarneming aan
  • pc_cluster $ centres: De cluster centreert
  • pc_cluster $ totss: De totale som van vierkanten
  • pc_cluster $ withinss: binnen som van kwadraat. Het aantal geretourneerde componenten is gelijk aan 'k'
  • pc_cluster $ tot.withinss: Som van binnenss
  • pc_clusterbetweenss: totale som van kwadraat minus binnen som van kwadraat
  • pc_cluster $ size: aantal observaties binnen elk cluster

U gebruikt de som van de binnen som van het kwadraat (dwz tot.binnenin) om het optimale aantal clusters k te berekenen. Het vinden van k is inderdaad een substantiële taak.

Optimale k

Een techniek om de beste k te kiezen, wordt de elleboogmethode genoemd . Deze methode maakt gebruik van homogeniteit binnen de groep of heterogeniteit binnen de groep om de variabiliteit te evalueren. Met andere woorden, u bent geïnteresseerd in het percentage van de variantie dat door elk cluster wordt verklaard. Je kunt verwachten dat de variabiliteit toeneemt met het aantal clusters, of dat de heterogeniteit afneemt. Onze uitdaging is om de k te vinden die voorbij de afnemende opbrengsten ligt. Het toevoegen van een nieuw cluster verbetert de variabiliteit in de gegevens niet, omdat er nog maar heel weinig informatie overblijft om uit te leggen.

In deze tutorial vinden we dit punt met behulp van de heterogeniteitsmaat. Het totaal van de som van de kwadraten binnen clusters is de tot.withinss in de lijst die wordt geretourneerd door kmean ().

Je kunt de ellebooggrafiek construeren en de optimale k als volgt vinden:

  • Stap 1: Construeer een functie om het totaal binnen clusters de som van kwadraten te berekenen
  • Stap 2: Voer de algoritmetijden uit
  • Stap 3: Maak een dataframe met de resultaten van het algoritme
  • Stap 4: Teken de resultaten

Stap 1) Construeer een functie om het totaal binnen clusters de som van kwadraten te berekenen

U maakt de functie die het k-gemiddelde-algoritme uitvoert en slaat het totaal op in de som van de kwadraten in clusters

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

Code Verklaring

  • function (k): Stel het aantal argumenten in de functie in
  • kmeans (rescale_df, k): voer het algoritme k keer uit
  • return (cluster $ tot.withinss): Sla het totaal op binnen clusters som van kwadraten

U kunt de functie testen met is gelijk aan 2.

Uitgang:

## Try with 2 cluster
kmean_withinss(2)

Uitgang:

## [1] 27087.07 

Stap 2) Voer het algoritme n keer uit

U gebruikt de functie sapply () om het algoritme over een bereik van k uit te voeren. Deze techniek is sneller dan het maken van een lus en het opslaan van de waarde.

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

Code Verklaring

  • max_k <-20: Stel een maximum aantal in van 20
  • sapply (2: max_k, kmean_withinss): voer de functie kmean_withinss () uit over een bereik 2: max_k, dwz 2 tot 20.

Stap 3) Maak een dataframe met de resultaten van het algoritme

Na het maken en testen van onze functie, kunt u het k-mean-algoritme uitvoeren over een bereik van 2 tot 20, de tot.withinss-waarden opslaan.

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

Code Verklaring

  • data.frame (2: max_k, wss): maak een dataframe met de uitvoer van de algoritmewinkel in wss

Stap 4) Teken de resultaten

Je plot de grafiek om te visualiseren waar het elleboogpunt is

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

Uit de grafiek kun je zien dat de optimale k zeven is, waarbij de curve een afnemend rendement begint te krijgen.

Zodra u onze optimale k heeft, voert u het algoritme opnieuw uit waarbij k gelijk is aan 7 en evalueert u de clusters.

Het cluster onderzoeken

pc_cluster_2 <-kmeans(rescale_df, 7)

Zoals eerder vermeld, hebt u toegang tot de resterende interessante informatie in de lijst die wordt geretourneerd door kmean ().

pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size 

Het evaluatiegedeelte is subjectief en berust op het gebruik van het algoritme. Ons doel is hier om computers met vergelijkbare functies te verzamelen. Een computerman kan het werk met de hand en een groepscomputer doen op basis van zijn expertise. Het proces kost echter veel tijd en is foutgevoelig. Het K-mean-algoritme kan het veld voor hem / haar voorbereiden door clusters voor te stellen.

Als voorafgaande evaluatie kunt u kijken naar de grootte van de clusters.

pc_cluster_2$size

Uitgang:

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

Het eerste cluster bestaat uit 608 waarnemingen, terwijl het kleinste cluster, nummer 4, slechts 580 computers heeft. Het kan goed zijn om homogeniteit tussen clusters te hebben, zo niet, dan kan een dunnere datavoorbereiding nodig zijn.

Met de middelste component krijg je een diepere blik op de data. De rijen verwijzen naar de nummering van het cluster en de kolommen naar de variabelen die door het algoritme worden gebruikt. De waarden zijn de gemiddelde score van elk cluster voor de geïnteresseerde kolom. Standaardisatie maakt de interpretatie gemakkelijker. Positieve waarden geven aan dat de z-score voor een bepaald cluster hoger is dan het algemene gemiddelde. Zo heeft cluster 2 het hoogste prijsgemiddelde van alle clusters.

center <-pc_cluster_2$centerscenter

Uitgang:

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

U kunt een hittekaart maken met ggplot om ons te helpen het verschil tussen categorieën te benadrukken.

De standaardkleuren van ggplot moeten worden gewijzigd met de RColorBrewer-bibliotheek. U kunt de conda-bibliotheek en de code gebruiken om in de terminal te starten:

conda install -cr r-rcolorbrewer

Om een ​​hittekaart te maken, gaat u in drie stappen te werk:

  • Bouw een dataframe met de waarden van het centrum en maak een variabele met het nummer van het cluster
  • Geef de gegevens een nieuwe vorm met de functie gather () van de tidyr-bibliotheek. U wilt gegevens van breed naar lang transformeren.
  • Maak het kleurenpalet met de functie colorRampPalette ()

Stap 1) Bouw een dataframe

Laten we de gegevensset voor nieuwe vormen maken

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)

Uitgang:

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

Stap 2) Geef de gegevens een nieuwe vorm

De onderstaande code maakt het kleurenpalet dat u gaat gebruiken om de heatmap te plotten.

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

Stap 3) Visualiseer

U kunt de grafiek plotten en zien hoe de clusters eruit zien.

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

Overzicht

We kunnen het k-gemiddelde-algoritme in de onderstaande tabel samenvatten

Pakket

Objectief

functie

argument

baseren

Train k-mean

kmeans ()

df, k

Toegang tot cluster

kmeans () $ cluster

Cluster geeft voor

kmeans () $ geeft voor

Grootte cluster

kmeans () $ size