K-betekent Clusterin R met voorbeeld
Wat is Cluster analyse?
Cluster analyse maakt deel uit van de zonder toezicht leren. Een cluster is een groep gegevens die vergelijkbare kenmerken delen. We kunnen zeggen dat clusteranalyse meer over ontdekking dan over een voorspelling gaat. De machine zoekt naar overeenkomsten in de gegevens. U kunt bijvoorbeeld clusteranalyse gebruiken voor de volgende toepassing:
- Klantsegmentatie: zoekt naar overeenkomsten tussen groepen klanten
- Clustering van aandelenmarkten: Groepeer aandelen op basis van prestaties
- Verminder de dimensionaliteit van een dataset door observaties met vergelijkbare waarden te groeperen
ClusterDeze analyse is niet al te moeilijk te implementeren en is zowel betekenisvol als uitvoerbaar voor het bedrijfsleven.
Het meest opvallende verschil tussen begeleid en niet-gesuperviseerd leren ligt in de resultaten. Ongecontroleerd leren creëert een nieuwe variabele, het label, terwijl begeleid leren een resultaat voorspelt. De machine helpt de arts bij het labelen van de gegevens op basis van nauwe verwantschap. Het is aan de analist om gebruik te maken van de groepen en er een naam aan te geven.
Laten we een voorbeeld nemen om het concept van clustering te begrijpen. Voor de eenvoud werken we in twee dimensies. U hebt gegevens over de totale uitgaven van klanten en hun leeftijden. Om de reclame te verbeteren, wil het marketingteam meer gerichte e-mails naar hun klanten sturen.
In de onderstaande grafiek ziet u de totale bestedingen en de leeftijd van de klanten.
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
- Linksonder zie je jongeren met een lagere koopkracht
- Het hogere midden weerspiegelt mensen met een baan die ze zich kunnen veroorloven meer uit te geven
- Tenslotte ouderen met een lager budget.
In de bovenstaande afbeelding clustert u de observaties handmatig en definieert u elk van de drie groepen. Dit voorbeeld is vrij eenvoudig en zeer visueel. Als er nieuwe observaties 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 leren om de gegevens objectief te groeperen.
In deze zelfstudie leert u hoe u de k-middelen algoritme.
K-betekent algoritme
K-mean is zonder twijfel de populairste clustermethode. Onderzoekers hebben het algoritme tientallen jaren geleden uitgebracht en er zijn veel verbeteringen doorgevoerd aan k-means.
Het algoritme probeert groepen te vinden door de afstand tussen de waarnemingen zo klein mogelijk te maken 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 featureplan
- Stap 2: Minimaliseer de afstand tussen het clustercentrum en de verschillende waarnemingen (zwaartepunt). Het resulteert in groepen met observaties
- Stap 3: Shift het initiële zwaartepunt tot het gemiddelde van de coördinaten binnen een groep.
- Stap 4: Minimaliseer de afstand volgens de nieuwe zwaartepunten. Er worden nieuwe grenzen gecreëerd. Waarnemingen zullen dus van de ene groep naar de andere gaan
- Herhaal dit totdat geen enkele observatie van groep verandert
K-middelen nemen meestal de Euclidische afstand tussen het kenmerk en het kenmerk:
Er zijn verschillende metingen beschikbaar, zoals de Manhattan-afstand of de Minlowski-afstand. Let op dat K-mean elke keer dat u het algoritme uitvoert, verschillende groepen retourneert. Bedenk dat de eerste initiële gissingen willekeurig zijn en bereken de afstanden totdat het algoritme een homogeniteit binnen groepen bereikt. Dat wil zeggen dat k-mean erg gevoelig is voor de eerste keuze en dat het bijna onmogelijk is om dezelfde clustering te krijgen, tenzij het aantal observaties en groepen klein is.
Selecteer het aantal clusters
Een andere moeilijkheid die je tegenkomt bij k-mean is de keuze van het aantal clusters. Je kunt een hoge waarde van instellen, d.w.z. een groot aantal groepen, om de stabiliteit te verbeteren, maar je zou kunnen eindigen met overmatig van data. Overfitting betekent dat de prestaties van het model substantieel afnemen voor nieuwe data. De machine leerde de kleine details van de dataset en worstelt om het algehele patroon te generaliseren.
Het aantal clusters hangt af van de aard van de dataset, de industrie, het bedrijf, enzovoort. Er is echter een vuistregel om het juiste aantal clusters te selecteren:
waarbij gelijk is 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 gebruiken de dataset Prices of Personal Computers om onze clusteranalyse uit te voeren. Deze dataset bevat 6259 observaties en 10 features. 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 en cd.
U gaat als volgt te werk:
- Datums importeren
- Train het model
- Evalueer het model
Datums importeren
K-gemiddelden zijn niet geschikt 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 zijn 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)
uitgang
## 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...
Uit de samenvattende statistieken kunt u zien dat de gegevens grote waarden hebben. Een goede praktijk bij het berekenen van k-gemiddelden en afstanden is het herschalen van de gegevens zodat het gemiddelde gelijk is aan één en de standaarddeviatie gelijk is aan nul.
summary(df)
Output:
## 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 schaalt de variabelen opnieuw met de scale()-functie 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, kunt u 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. Een z-score van twee geeft aan dat de waarde 2 standaard is afwijkingen van het gemiddelde. Let op: de z-score volgt een Gaussiaanse 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-basis heeft een functie om het k mean-algoritme uit te voeren. De basisfunctie van k mean 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 (tevens 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(“animatie”). U kunt controleren of het pakket in onze Anaconda-map is geïnstalleerd.
install.packages("animation")
Nadat u de bibliotheek hebt geladen, voegt u .ani toe na kmeans en R zal alle stappen plotten. Ter illustratie, u voert 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 Uitleg
- kmeans.ani(rescale_df[2:3], 3): Selecteer de kolommen 2 en 3 van de dataset rescale_df en voer het algoritme uit met k sets op 3. Teken de animatie.
Je 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 één cluster in het groen linksonder, één groot cluster in het zwart rechts en een rood cluster ertussen.
- Stap 3: Bereken het zwaartepunt, d.w.z. het gemiddelde van de clusters
- Herhaal dit totdat er geen gegevens meer in het cluster zijn gewijzigd
Het algoritme convergeerde na zeven iteraties. U kunt het k-mean-algoritme in onze dataset uitvoeren met vijf clusters en het pc_cluster noemen.
pc_cluster <-kmeans(rescale_df, 5)
- De lijst pc_cluster bevat zeven interessante elementen:
- pc_cluster$cluster: Geeft de cluster van elke observatie aan
- pc_cluster$centers: De clustercentra
- pc_cluster$totss: De totale som van de kwadraten
- pc_cluster$withinss: Binnen de som van het kwadraat. Het aantal componenten dat wordt geretourneerd 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 observaties binnen elk cluster
U zult de som van de binnenste som van kwadraten (d.w.z. tot.withinss) gebruiken om het optimale aantal clusters k te berekenen. Het vinden van k is inderdaad een substantiële taak.
Optimale k
Eén techniek om de beste k te kiezen heet de elleboog methode:. Deze methode gebruikt binnen-groep homogeniteit of binnen-groep heterogeniteit om de variabiliteit te evalueren. Met andere woorden, u bent geïnteresseerd in het percentage van de variantie dat door elke cluster wordt verklaard. U 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 data niet omdat er maar heel weinig informatie overblijft om te verklaren.
In deze tutorial vinden we dit punt met behulp van de heterogeniteitsmaat. De Total within clusters sum of squares 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 de som van kwadraten binnen clusters te berekenen
- Stap 2: Voer de algoritmetijden uit
- Stap 3: Maak een dataframe met de resultaten van het algoritme
- Stap 4: Maak een grafiek van de resultaten
Stap 1) Maak een functie om de som van kwadraten binnen clusters te berekenen
Je maakt de functie die het k-mean-algoritme uitvoert en slaat het totaal op binnen de clusters som van kwadraten
kmean_withinss <- function(k) { cluster <- kmeans(rescale_df, k) return (cluster$tot.withinss) }
Code Uitleg
- 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 de clusters som van kwadraten
Je kunt de functie testen met gelijk aan 2.
Output:
## Try with 2 cluster
kmean_withinss(2)
Output:
## [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 cluster max_k <-20 # Run algorithm over a range of k wss <- sapply(2:max_k, kmean_withinss)
Code Uitleg
- 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 van 2:max_k, dat wil zeggen 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, en de tot.withinss-waarden opslaan.
# Create a data frame to plot the graph elbow <-data.frame(2:max_k, wss)
Code Uitleg
- data.frame(2:max_k, wss): Maak een dataframe met de uitvoer van het algoritme-archief in wss
Stap 4) Plot de resultaten
Je tekent de grafiek om te visualiseren waar het elleboogpunt ligt
# 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))
Uit de grafiek kun je zien dat de optimale k zeven is, waarbij de curve een afnemend rendement begint te krijgen.
Zodra u de optimale k hebt, voert u het algoritme opnieuw uit met k gelijk aan 7 en evalueert u de clusters.
Het cluster onderzoeken
pc_cluster_2 <-kmeans(rescale_df, 7)
Zoals eerder vermeld, kunt u toegang krijgen tot de resterende interessante informatie in de lijst die wordt geretourneerd door kmean().
pc_cluster_2$cluster pc_cluster_2$centers pc_cluster_2$size
Het evaluatiegedeelte is subjectief en is afhankelijk van het gebruik van het algoritme. Ons doel hier is om computers met vergelijkbare functies te verzamelen. Een computerman kan de klus met de hand klaren en computers groeperen op basis van zijn expertise. Het proces zal echter veel tijd kosten en foutgevoelig zijn. Het K-mean-algoritme kan het veld voor hem/haar voorbereiden door clusters voor te stellen.
Als voorafgaande evaluatie kunt u de grootte van de clusters bekijken.
pc_cluster_2$size
Output:
## [1] 608 1596 1231 580 1003 699 542
De eerste cluster bestaat uit 608 observaties, terwijl de kleinste cluster, nummer 4, slechts 580 computers heeft. Het zou goed zijn om homogeniteit tussen clusters te hebben, anders is er mogelijk een dunnere data-voorbereiding nodig.
U krijgt een diepere blik op de gegevens met het 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 gegeven cluster boven het algehele gemiddelde ligt. Cluster 2 heeft bijvoorbeeld het hoogste prijsgemiddelde van alle clusters.
center <-pc_cluster_2$centers center
Output:
## 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 met ggplot een heatmap maken om ons te helpen het verschil tussen categorieën te benadrukken.
De standaardkleuren van ggplot moeten worden gewijzigd met de RColorBrewer-bibliotheek. Je kunt de conda gebruiken bibliotheek en de code die in de terminal moet worden gestart:
conda install -cr r-rcolorbrewer
Om een heatmap te maken, gaat u in drie stappen te werk:
- Bouw een data frame met de waarden van het centrum en maak een variabele met het nummer van de cluster
- Geef de gegevens een nieuwe vorm met de functie collect() van de Tidyr-bibliotheek. U wilt gegevens transformeren van breed naar lang.
- Creëer het kleurenpalet met kleurRampPalet() functie
Stap 1) Bouw een dataframe
Laten we de hervormde gegevensset maken
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)
Output:
## 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
Met de onderstaande code wordt het kleurenpalet gemaakt dat u gaat gebruiken om de hittekaart te plotten.
library(RColorBrewer) # Create the palette hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
Stap 3) Visualiseer
U kunt de grafiek tekenen en zien hoe de clusters eruit zien.
# 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()
Samenvatting
We kunnen het k-mean-algoritme samenvatten in de onderstaande tabel
Pakket | Objectief | Functie | Argument |
---|---|---|---|
baseren | Trein k-gemiddeld | kbetekent() | df, k |
Toegangscluster | kmeans()$cluster | ||
Cluster centra | kmeans()$centra | ||
Grootte cluster | kmeans()$grootte |