K-Mittel Clustering in R mit Beispiel
Was ist Cluster Analyse?
Cluster Analyse ist Teil der unbeaufsichtigtes Lernen. Ein Cluster ist eine Gruppe von Daten, die ähnliche Merkmale aufweisen. Man könnte sagen, dass es bei der Clusteranalyse eher um Entdeckung als um Vorhersage geht. Die Maschine sucht nach Ähnlichkeiten in den Daten. Sie können die Clusteranalyse beispielsweise für die folgende Anwendung verwenden:
- Kundensegmentierung: Sucht nach Ähnlichkeiten zwischen Kundengruppen
- Aktienmarktclustering: Aktien nach Performance gruppieren
- Reduzieren Sie die Dimensionalität eines Datensatzes, indem Sie Beobachtungen mit ähnlichen Werten gruppieren
ClusterDie Implementierung einer Analyse ist nicht allzu schwierig und für das Unternehmen sowohl sinnvoll als auch umsetzbar.
Der auffälligste Unterschied zwischen überwachtem und unüberwachtem Lernen liegt in den Ergebnissen. Unüberwachtes Lernen erzeugt eine neue Variable, die Bezeichnung, während überwachtes Lernen ein Ergebnis vorhersagt. Die Maschine unterstützt den Praktiker bei der Suche nach einer Kennzeichnung der Daten auf der Grundlage enger Zusammenhänge. Es ist Sache des Analytikers, die Gruppen zu nutzen und ihnen einen Namen zu geben.
Lassen Sie uns ein Beispiel machen, um das Konzept des Clusterings zu verstehen. Der Einfachheit halber arbeiten wir in zwei Dimensionen. Sie haben Daten über die Gesamtausgaben der Kunden und deren Alter. Um die Werbung zu verbessern, möchte das Marketingteam seinen Kunden gezieltere E-Mails senden.
In der folgenden Grafik stellen Sie die Gesamtausgaben und das Alter der Kunden dar.
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()
An dieser Stelle ist ein Muster erkennbar
- Unten links sehen Sie junge Menschen mit geringerer Kaufkraft
- Die obere Mitte spiegelt Menschen wider, die einen Job haben, bei dem sie es sich leisten können, mehr auszugeben
- Endlich ältere Menschen mit geringerem Budget.
In der obigen Abbildung clustern Sie die Beobachtungen manuell und definieren jede der drei Gruppen. Dieses Beispiel ist relativ unkompliziert und sehr anschaulich. Wenn dem Datensatz neue Beobachtungen hinzugefügt werden, können Sie diese innerhalb der Kreise beschriften. Sie definieren den Kreis nach unserem Ermessen. Stattdessen können Sie verwenden Maschinelles lernen um die Daten objektiv zu gruppieren.
In diesem Tutorial erfahren Sie, wie Sie die verwenden k-bedeutet Algorithmus.
K-means-Algorithmus
K-Mean ist ohne Zweifel die beliebteste Clustermethode. Forscher haben den Algorithmus vor Jahrzehnten veröffentlicht und seitdem wurden viele Verbesserungen an K-Means vorgenommen.
Der Algorithmus versucht, Gruppen zu finden, indem er den Abstand zwischen den Beobachtungen minimiert lokal optimal Lösungen. Die Entfernungen werden anhand der Koordinaten der Beobachtungen gemessen. In einem zweidimensionalen Raum sind die Koordinaten beispielsweise einfach und .
Der Algorithmus funktioniert wie folgt:
- Schritt 1: Wählen Sie Gruppen im Funktionsplan nach dem Zufallsprinzip aus
- Schritt 2: Minimieren Sie den Abstand zwischen dem Clusterzentrum und den verschiedenen Beobachtungen (Schwerpunkt). Es entstehen Gruppen mit Beobachtungen
- Schritt 3: Shift vom anfänglichen Schwerpunkt zum Mittelwert der Koordinaten innerhalb einer Gruppe.
- Schritt 4: Minimieren Sie den Abstand entsprechend den neuen Schwerpunkten. Neue Grenzen werden geschaffen. Somit werden Beobachtungen von einer Gruppe zur anderen verschoben
- Wiederholen, bis keine Beobachtung die Gruppe ändert
K-means verwendet normalerweise den euklidischen Abstand zwischen Merkmalen und Merkmalen:
Es stehen verschiedene Maße zur Verfügung, wie etwa die Manhattan-Distanz oder die Minlowski-Distanz. Beachten Sie, dass K-Mean bei jedem Ausführen des Algorithmus unterschiedliche Gruppen zurückgibt. Denken Sie daran, dass die ersten Schätzungen zufällig sind und die Distanzen so lange berechnet werden, bis der Algorithmus eine Homogenität innerhalb der Gruppen erreicht. Das heißt, K-Mean ist sehr empfindlich gegenüber der ersten Wahl, und es ist fast unmöglich, dieselbe Clusterung zu erhalten, es sei denn, die Anzahl der Beobachtungen und Gruppen ist klein.
Wählen Sie die Anzahl der Cluster aus
Eine weitere Schwierigkeit bei k-mean ist die Wahl der Anzahl der Cluster. Sie können einen hohen Wert festlegen, also eine große Anzahl von Gruppen, um die Stabilität zu verbessern, aber am Ende erhalten Sie möglicherweise überangepasst von Daten. Überanpassung bedeutet, dass die Leistung des Modells bei neuen Daten erheblich abnimmt. Die Maschine lernt die kleinen Details des Datensatzes und hat Schwierigkeiten, das Gesamtmuster zu verallgemeinern.
Die Anzahl der Cluster hängt von der Art des Datensatzes, der Branche, dem Geschäft usw. ab. Es gibt jedoch eine Faustregel für die Auswahl der geeigneten Clusteranzahl:
wobei gleich der Anzahl der Beobachtungen im Datensatz ist.
Im Allgemeinen ist es interessant, Zeit damit zu verbringen, nach dem besten Preis-Leistungs-Verhältnis zu suchen, das den Geschäftsanforderungen entspricht.
Wir werden den Datensatz „Preise für Personalcomputer“ verwenden, um unsere Clusteranalyse durchzuführen. Dieser Datensatz enthält 6259 Beobachtungen und 10 Merkmale. Der Datensatz beobachtet den Preis von 1993 Personalcomputern in den USA von 1995 bis 486. Die Variablen sind unter anderem Preis, Geschwindigkeit, RAM, Bildschirm und CD.
Sie gehen wie folgt vor:
- Daten importieren
- Trainiere das Modell
- Bewerten Sie das Modell
Daten importieren
K bedeutet, dass es nicht für Faktorvariablen geeignet ist, da es auf der Distanz basiert und diskrete Werte keine aussagekräftigen Werte zurückgeben. Sie können die drei kategorialen Variablen in unserem Datensatz löschen. Außerdem fehlen in diesem Datensatz keine Werte.
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)
Ausgang
## 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...
Anhand der zusammenfassenden Statistik können Sie erkennen, dass die Daten große Werte aufweisen. Eine gute Vorgehensweise bei der k-Mittelwert- und Distanzberechnung besteht darin, die Daten so neu zu skalieren, dass der Mittelwert gleich eins und die Standardabweichung gleich null ist.
summary(df)
Ausgang:
## 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
Sie skalieren die Variablen mit der Funktion „scale()“ der dplyr-Bibliothek neu. Die Transformation reduziert den Einfluss von Ausreißern und ermöglicht den Vergleich einer einzelnen Beobachtung mit dem Mittelwert. Wenn ein standardisierter Wert (bzw Z-Score) hoch ist, können Sie sicher sein, dass diese Beobachtung tatsächlich über dem Mittelwert liegt (ein großer Z-Score bedeutet, dass dieser Punkt hinsichtlich der Standardabweichung weit vom Mittelwert entfernt ist. Ein Z-Score von zwei zeigt an, dass der Wert 2 Standard ist Abweichungen vom Mittelwert. Beachten Sie, dass der Z-Score einer Gaußschen Verteilung folgt und symmetrisch um den Mittelwert ist.
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 verfügt über eine Funktion zum Ausführen des k-Mean-Algorithmus. Die Grundfunktion von k mean ist:
kmeans(df, k) arguments: -df: dataset used to run the algorithm -k: Number of clusters
Trainiere das Modell
In Abbildung drei haben Sie detailliert beschrieben, wie der Algorithmus funktioniert. Sie können jeden Schritt grafisch mit der großartigen Paketerstellung von Yi Hui (auch Schöpfer von Knit für Rmarkdown) sehen. Die Paketanimation ist in der Conda-Bibliothek nicht verfügbar. Sie können das Paket auch auf andere Weise mit install.packages(„animation“) installieren. Sie können überprüfen, ob das Paket in unserem Anaconda-Ordner installiert ist.
install.packages("animation")
Nachdem Sie die Bibliothek geladen haben, fügen Sie .ani nach kmeans und hinzu R stellt alle Schritte dar. Zur Veranschaulichung führen Sie den Algorithmus nur mit den neu skalierten Variablen hd und ram mit drei Clustern aus.
set.seed(2345) library(animation) kmeans.ani(rescale_df[2:3], 3)
Code Erklärung
- kmeans.ani(rescale_df[2:3], 3): Wählen Sie die Spalten 2 und 3 des rescale_df-Datensatzes aus und führen Sie den Algorithmus mit k-Sets auf 3 aus. Zeichnen Sie die Animation.
Sie können die Animation wie folgt interpretieren:
- Schritt 1: R wählt zufällig drei Punkte aus
- Schritt 2: Berechnen Sie die euklidische Distanz und zeichnen Sie die Cluster ein. Sie haben unten links einen grünen Cluster, rechts einen großen schwarz gefärbten Cluster und dazwischen einen roten.
- Schritt 3: Berechnen Sie den Schwerpunkt, also den Mittelwert der Cluster
- Wiederholen, bis sich der Cluster nicht mehr von den Daten ändert
Der Algorithmus konvergierte nach sieben Iterationen. Sie können den k-Mean-Algorithmus in unserem Datensatz mit fünf Clustern ausführen und ihn pc_cluster nennen.
pc_cluster <-kmeans(rescale_df, 5)
- Die Liste pc_cluster enthält sieben interessante Elemente:
- pc_cluster$cluster: Gibt den Cluster jeder Beobachtung an
- pc_cluster$centers: Die Clusterzentren
- pc_cluster$totss: Die Gesamtsumme der Quadrate
- pc_cluster$withinss: Innerhalb der Summe der Quadrate. Die Anzahl der zurückgegebenen Komponenten ist gleich `k`
- pc_cluster$tot.withinss: Summe der Withinss
- pc_clusterbetweenss: Gesamtsumme der Quadrate minus Innerhalbsumme der Quadrate
- pc_cluster$size: Anzahl der Beobachtungen innerhalb jedes Clusters
Sie verwenden die Summe der quadrierten Werte innerhalb (also tot.withinss), um die optimale Anzahl von Clustern k zu berechnen. Die Ermittlung von k ist in der Tat eine umfangreiche Aufgabe.
Optimales k
Eine Technik zur Auswahl des besten k heißt Ellbogenmethode. Diese Methode verwendet Homogenität oder Heterogenität innerhalb der Gruppe, um die Variabilität zu bewerten. Mit anderen Worten, Sie sind an dem Prozentsatz der Varianz interessiert, der durch jeden Cluster erklärt wird. Sie können davon ausgehen, dass die Variabilität mit der Anzahl der Cluster zunimmt, während die Heterogenität abnimmt. Unsere Herausforderung besteht darin, das k zu finden, das jenseits der abnehmenden Erträge liegt. Das Hinzufügen eines neuen Clusters verbessert die Variabilität in den Daten nicht, da nur noch sehr wenige Informationen übrig sind, die erklärt werden müssen.
In diesem Tutorial finden wir diesen Punkt mithilfe des Heterogenitätsmaßes. Die Summe der Quadrate innerhalb der Cluster ist tot.withinss in der von kmean() zurückgegebenen Liste.
Sie können das Ellbogendiagramm erstellen und das optimale k wie folgt ermitteln:
- Schritt 1: Erstellen Sie eine Funktion zur Berechnung der Summe der Quadrate innerhalb der Cluster
- Schritt 2: Führen Sie den Algorithmus mal aus
- Schritt 3: Erstellen Sie einen Datenrahmen mit den Ergebnissen des Algorithmus
- Schritt 4: Zeichnen Sie die Ergebnisse grafisch auf
Schritt 1) Erstellen Sie eine Funktion zur Berechnung der Summe der Quadrate innerhalb von Clustern
Sie erstellen die Funktion, die den K-Mean-Algorithmus ausführt und die Summe der Quadrate innerhalb der Cluster speichert
kmean_withinss <- function(k) { cluster <- kmeans(rescale_df, k) return (cluster$tot.withinss) }
Code Erklärung
- Funktion(k): Legen Sie die Anzahl der Argumente in der Funktion fest
- kmeans(rescale_df, k): Führen Sie den Algorithmus k-mal aus
- return(cluster$tot.withinss): Speichert die Summe der Quadrate innerhalb der Cluster
Sie können die Funktion mit gleich 2 testen.
Ausgang:
## Try with 2 cluster
kmean_withinss(2)
Ausgang:
## [1] 27087.07
Schritt 2) Führen Sie den Algorithmus n-mal aus
Sie verwenden die Funktion sapply(), um den Algorithmus über einen Bereich von k auszuführen. Diese Technik ist schneller als das Erstellen einer Schleife und das Speichern des Werts.
# Set maximum cluster max_k <-20 # Run algorithm over a range of k wss <- sapply(2:max_k, kmean_withinss)
Code Erklärung
- max_k <-20: Legen Sie die maximale Anzahl auf 20 fest
- sapply(2:max_k, kmean_withinss): Führen Sie die Funktion kmean_withinss() über einen Bereich von 2:max_k aus, also 2 bis 20.
Schritt 3) Erstellen Sie einen Datenrahmen mit den Ergebnissen des Algorithmus
Nach der Erstellung und dem Testen unserer Funktion können Sie den k-mean-Algorithmus über einen Bereich von 2 bis 20 ausführen und die tot.withinss-Werte speichern.
# Create a data frame to plot the graph elbow <-data.frame(2:max_k, wss)
Code Erklärung
- data.frame(2:max_k, wss): Erstellen Sie einen Datenrahmen mit der Ausgabe des Algorithmusspeichers in wss
Schritt 4) Plotten Sie die Ergebnisse
Sie zeichnen das Diagramm, um zu visualisieren, wo sich der Ellbogenpunkt befindet
# 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))
Aus der Grafik können Sie ersehen, dass das optimale k bei sieben liegt, wobei die Kurve beginnt, eine abnehmende Rendite zu erzielen.
Sobald Sie unser optimales k haben, führen Sie den Algorithmus erneut mit k gleich 7 aus und bewerten die Cluster.
Untersuchung des Clusters
pc_cluster_2 <-kmeans(rescale_df, 7)
Wie bereits erwähnt, können Sie auf die verbleibenden interessanten Informationen in der von kmean() zurückgegebenen Liste zugreifen.
pc_cluster_2$cluster pc_cluster_2$centers pc_cluster_2$size
Der Bewertungsteil ist subjektiv und beruht auf der Verwendung des Algorithmus. Unser Ziel hier ist es, Computer mit ähnlichen Funktionen zu sammeln. Ein Computerfachmann kann die Arbeit manuell erledigen und Computer basierend auf seinem Fachwissen gruppieren. Der Prozess wird jedoch viel Zeit in Anspruch nehmen und fehleranfällig sein. Der K-Mean-Algorithmus kann das Feld für ihn/sie vorbereiten, indem er Cluster vorschlägt.
Zur Vorabbewertung können Sie sich die Größe der Cluster ansehen.
pc_cluster_2$size
Ausgang:
## [1] 608 1596 1231 580 1003 699 542
Der erste Cluster besteht aus 608 Beobachtungen, während der kleinste Cluster, Nummer 4, nur 580 Computer hat. Es könnte gut sein, wenn zwischen den Clustern Homogenität herrscht, andernfalls könnte eine dünnere Datenaufbereitung erforderlich sein.
Mit der mittleren Komponente erhalten Sie einen tieferen Einblick in die Daten. Die Zeilen beziehen sich auf die Nummerierung des Clusters und die Spalten auf die vom Algorithmus verwendeten Variablen. Die Werte sind der Durchschnittswert jedes Clusters für die betreffende Spalte. Die Standardisierung erleichtert die Interpretation. Positive Werte zeigen an, dass der Z-Score für einen bestimmten Cluster über dem Gesamtmittelwert liegt. Beispielsweise hat Cluster 2 den höchsten Preisdurchschnitt aller Cluster.
center <-pc_cluster_2$centers center
Ausgang:
## 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
Sie können mit ggplot eine Heatmap erstellen, um uns dabei zu helfen, den Unterschied zwischen Kategorien hervorzuheben.
Die Standardfarben von ggplot müssen mit der RColorBrewer-Bibliothek geändert werden. Sie können die Conda verwenden Bibliothek und der Code zum Starten im Terminal:
conda install -cr r-rcolorbrewer
Um eine Heatmap zu erstellen, gehen Sie in drei Schritten vor:
- Erstellen Sie einen Datenrahmen mit den Werten des Zentrums und erstellen Sie eine Variable mit der Nummer des Clusters
- Formen Sie die Daten mit der Funktion „gather()“ der Tidyr-Bibliothek um. Sie möchten Daten von breit nach lang umwandeln.
- Erstellen Sie die Farbpalette mit FarbeRampPalette()-Funktion
Schritt 1) Erstellen Sie einen Datenrahmen
Lassen Sie uns den Umformungsdatensatz erstellen
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)
Ausgang:
## 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
Schritt 2) Formen Sie die Daten um
Mit dem folgenden Code erstellen Sie die Farbpalette, die Sie zum Zeichnen der Wärmekarte verwenden.
library(RColorBrewer) # Create the palette hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
Schritt 3) Visualisieren
Sie können das Diagramm zeichnen und sehen, wie die Cluster aussehen.
# 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()
Zusammenfassung
Wir können den k-Mean-Algorithmus in der folgenden Tabelle zusammenfassen
Paket | Ziel | Funktion | Argument |
---|---|---|---|
Base | Trainieren Sie k-mean | kmeans () | df, k |
Zugriffscluster | kmeans()$cluster | ||
Cluster Zentren | kmeans()$centers | ||
Größencluster | kmeans()$size |