K-betekent clustering in R met voorbeeld

In deze tutorial leer je:

Wat is clusteranalyse?

Clusteranalyse is onderdeel van de leren zonder toezicht . Een cluster is een groep gegevens die vergelijkbare kenmerken delen. We kunnen zeggen dat clusteranalyse meer over ontdekking gaat dan over voorspelling. De machine zoekt naar overeenkomsten in de gegevens. U kunt clusteranalyse bijvoorbeeld gebruiken voor de volgende toepassing:

  • Klantsegmentatie: zoekt naar overeenkomsten tussen groepen klanten
  • Beursclustering: Groepsaandelen op basis van prestaties
  • Verminder 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 bruikbaar voor het bedrijfsleven.

Het meest opvallende verschil tussen begeleid en niet-gesuperviseerd leren zit in de resultaten. Niet-gesuperviseerd 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 maken 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 in kaart. |__+_|

Op dit punt is een patroon zichtbaar

  1. Linksonder zie je jongeren met een lagere koopkracht
  2. Upper-middle weerspiegelt mensen met een baan die ze zich kunnen veroorloven om meer uit te geven
  3. Ten slotte oudere mensen met een lager budget.

In bovenstaande figuur cluster je de waarnemingen met de hand en definieer je elk van de drie groepen. Dit voorbeeld is enigszins eenvoudig en zeer visueel. Als er nieuwe waarnemingen aan de dataset 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 zelfstudie leert u hoe u de k-betekent algoritme.

K-betekent algoritme

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

Het algoritme probeert groepen te vinden door de afstand tussen de waarnemingen te minimaliseren, genaamd lokaal optimaal 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 ( zwaartepunt ). Het resulteert in groepen met observaties
  • Stap 3: Verschuif het initiële zwaartepunt naar het gemiddelde van de coördinaten binnen een groep.
  • Stap 4: Minimaliseer de afstand volgens de nieuwe zwaartepunten. Er ontstaan ​​nieuwe grenzen. Waarnemingen zullen dus van de ene groep naar de andere gaan
  • Herhaal totdat geen observatie van groep verandert

K-means neemt meestal de Euclidische afstand tussen het kenmerk en het kenmerk:

Er zijn verschillende maten beschikbaar, zoals de Manhattan-afstand of de Minlowski-afstand. Merk op dat K-mean verschillende groepen retourneert elke keer dat u het algoritme uitvoert. Bedenk dat de eerste initiële schattingen 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 bij k-mean is de keuze van het aantal clusters. U kunt een hoge waarde van , d.w.z. een groot aantal groepen, instellen om de stabiliteit te verbeteren, maar u kunt eindigen met overfit Van de gegevens. Overfitting betekent dat de prestaties van het model aanzienlijk afnemen voor nieuwe gegevens. De machine leerde de kleine details van de dataset en worstelde om het algemene patroon te generaliseren.

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

met gelijk aan het aantal waarnemingen 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 dataset Prijzen van pc's gebruiken om onze clusteranalyse 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.

Je gaat als volgt te werk:

  • Data importeren
  • Train het model
  • Evalueer het model

Data importeren

K-gemiddelden zijn niet geschikt voor factorvariabelen omdat het gebaseerd is op de afstand en discrete waarden geen zinvolle waarden opleveren. U kunt de drie categorische variabelen in onze dataset verwijderen. Bovendien ontbreken er in deze dataset geen ontbrekende waarden. |__+_| Uitgang:

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

Aan de overzichtsstatistieken 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. |__+_|

Uitgang:

 library(dplyr) PATH <-'https://raw.githubusercontent.com/on2vhf-edu/R-Programming/master/computers.csv' df % select(-c(X, cd, multi, premium)) glimpse(df) 

Je schaalt de variabelen opnieuw met de functie scale() van de dplyr-bibliotheek. De transformatie vermindert de impact van uitbijters en maakt het mogelijk om een ​​enkele waarneming te vergelijken met het gemiddelde. Als een gestandaardiseerde waarde (of z-score ) hoog is, kunt u erop vertrouwen dat deze waarneming inderdaad boven het gemiddelde ligt (een grote z-score betekent dat dit punt ver verwijderd is van het gemiddelde in termen van standaarddeviatie. Een z-score van twee geeft aan dat de waarde 2 standaard is. afwijkingen van het gemiddelde. Let op, de z-score volgt een Gauss-verdeling en is symmetrisch rond het gemiddelde. |_+_|

R-base heeft een functie om het k gemiddelde algoritme uit te voeren. De basisfunctie van k mean is: |_+_|

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 maker van Knit voor Rmarkdown). De pakketanimatie is niet beschikbaar in de conda-bibliotheek. U kunt de andere manier gebruiken om het pakket te installeren met install.packages('animation'). U kunt controleren of het pakket is geïnstalleerd in onze Anaconda-map. |__+_|

Nadat je de bibliotheek hebt geladen, voeg je .ani toe na kmeans en R zal alle stappen plotten. Ter illustratie: u voert het algoritme alleen uit met de opnieuw geschaalde variabelen hd en ram met drie clusters. |__+_|

Code Uitleg

  • kmeans.ani(rescale_df[2:3], 3): Selecteer de kolommen 2 en 3 van de rescale_df-gegevensset 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 een cluster in groen linksonder, een grote cluster in zwart gekleurd aan de rechterkant en een rode ertussen.
  • Stap 3: Bereken het zwaartepunt, d.w.z. het gemiddelde van de clusters
  • Herhaal totdat er geen gegevens veranderen cluster

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

  • De lijst pc_cluster bevat zeven interessante elementen:
  • pc_cluster$cluster: Geeft het cluster van elke waarneming aan
  • pc_cluster$centers: De clustercentra
  • pc_cluster$totss: De totale som van kwadraten
  • pc_cluster$withinss: Binnen de som van het kwadraat. Het aantal componenten retour is gelijk aan `k`
  • pc_cluster$tot.withinss: Som van insidess
  • pc_clusterbetweenss: Totale som van kwadraten minus Binnen som van kwadraten
  • pc_cluster$size: aantal waarnemingen binnen elk cluster

U gebruikt de som van de binnen-som van het kwadraat (d.w.z. tot.withinss) om het optimale aantal clusters k te berekenen. Het vinden van k is inderdaad een flinke klus.

optimale k

Een techniek om de beste k te kiezen heet de elleboog methode: . 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 boven de afnemende meeropbrengsten ligt. Het toevoegen van een nieuw cluster verbetert de variabiliteit in de gegevens niet omdat er nog maar heel weinig informatie over is om uit te leggen.

In deze zelfstudie vinden we dit punt met behulp van de heterogeniteitsmaatstaf. Het totaal binnen clusters kwadratensom is de tot.withinss in de lijstretour door kmean().

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

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

Stap 1) Construeer een functie om het totaal binnen clusters kwadratensom te berekenen

U maakt de functie die het k-mean-algoritme uitvoert en slaat het totaal op in clusters som van kwadraten |_+_|

Code Uitleg

  • functie(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 gelijk aan 2.

Uitgang:

## Observations: 6, 259 ## Variables: 7 ## $ price 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2... ##$ speed 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25, ... ##$ hd 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210... ##$ ram 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4, ... ##$ screen 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, ... ##$ ads 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... 
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 

Stap 2) Voer het algoritme n keer uit

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

Code Uitleg

  • max_k<-20: Set a maximum number of to 20
  • sapply(2:max_k, kmean_withinss): Voer de functie kmean_withinss() uit over een bereik 2:max_k, d.w.z. 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. |__+_|

Code Uitleg

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

Stap 4) Plot de resultaten

U plot de grafiek om te visualiseren waar het elleboogpunt is |__+_|

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

Zodra u onze optimale k hebt, voert u het algoritme opnieuw uit met k gelijk aan 7 en evalueert u de clusters.

Het cluster onderzoeken

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

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

Het evaluatiegedeelte is subjectief en berust op het gebruik van het algoritme. Ons doel hier is om computers met vergelijkbare functies te verzamelen. Een computerman kan het werk met de hand doen en een computer groeperen op basis van zijn expertise. Het proces kost echter veel tijd en is foutgevoelig. 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. |__+_|

Uitgang:

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

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 gegevensvoorbereiding nodig zijn.

U krijgt een diepere kijk op de gegevens met de middelste component. 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 eenvoudiger. Positieve waarden geven aan dat de z-score voor een bepaald cluster boven het algemene gemiddelde ligt. Zo heeft cluster 2 van alle clusters het hoogste prijsgemiddelde. |__+_|

Uitgang:

install.packages('animation') 

U kunt een warmtekaart 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 gebruik maken van de conda bibliotheek en de code om in de terminal te starten:

conda install -c r r-rcolorbrewer

Om een ​​heatmap 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 collect() van de bibliotheek properder. U wilt gegevens van breed naar lang transformeren.
  • Maak het kleurenpalet met de functie colorRampPalette()

Stap 1) Een dataframe bouwen

Laten we de hervormde dataset maken |_+_|

Uitgang:

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

Stap 2) Geef de gegevens een nieuwe vorm

De onderstaande code maakt het kleurenpalet dat u gaat gebruiken om de warmtekaart te plotten. |__+_|

Stap 3) Visualiseer

U kunt de grafiek plotten en zien hoe de clusters eruit zien. |__+_|

Samenvatting

We kunnen het k-mean-algoritme samenvatten in de onderstaande tabel:

Pakket

Doelstelling

functie

argument

baseren

Trein k-mean

kmeans()

df, k


Toegangscluster

kmeans()$cluster



Clustercentra

kmeans()$centra



Groottecluster

kmeans()$grootte