Tutorial 6: Machine Learning — Clustering
Lernziele
- Verständnis des K-Means Algorithmus
- Implementieren es iterativen Prozesses in R
K-Means by hand
Daten
Sie haben die folgenden Datenpunkte gegeben:
Datenpunkt | x | y |
---|---|---|
A1 | 2 | 10 |
A2 | 2 | 5 |
A3 | 8 | 4 |
A4 | 5 | 8 |
A5 | 7 | 5 |
A6 | 6 | 4 |
A7 | 1 | 2 |
A8 | 4 | 9 |
Benutzen Sie dazu die Funktion matrix()
und die Funktion c()
um die Datenpunkte zu definieren. Die Matrix soll zwei Spalten haben, die die x- und y-Koordinaten der Punkte enthalten. Benennen Sie die Spalten mit der Funktion colnames()
und die Zeilen mit der Funktion rownames()
. Alternativ können Sie das gewohntes data.table
Paket nutzen.
Algorithmus implementieren
Sie werden nun Schritt für Schritt durch den K-Means-Algorithmus geführt. Dabei sollen Sie einige Schritte selbst durchführen. Die hier beschriebenen Schritte sind eine Vereinfachung des eigentlichen Algorithmus, aber die Kernideen sind äquivalent.
- Benutzen Sie die Funktion
dist()
mit dem Argumentmethod = "euclidean"
, um die euklidische Distanz zwischen den Punkten zu berechnen. Speichern Sie das Ergebnis in einer Variablendist_matrix
. Dies ist nicht Teil des eigentlichen K-Means-Algorithmus, sondern dient nur der Visualisierung:
<- as.matrix(dist(points, method = "euclidean")) dist_matrix
- Wählen sie zwei beliebige Punkte als Startpunkte für die Clusterzentren. Speichern Sie diese in einer Variablen
seeds
. Zum Beispiel so:
<- points[c("A1", "A5"), ] seeds
Plotten Sie die Punkte und die Startpunkte. Benutzen Sie
ggplot2
oder die Base R Funktionenplot()
undtext()
, um die Punkte zu beschriften undpoints()
um die Startpunkte zu plotten.Schreiben Sie eine Funktion
euclidean_distance()
. Die Funktion soll die euklidische Distanz zwischen zwei Punkten berechnen. Die Funktion soll zwei Argumentepoint
undseed
haben und die Wurzel der Summe der quadrierten Differenzen der Koordinaten der Punkte zurückgeben. Zur Erinnerung, Funktionen haben die folgende Struktur:
= function (a, b) return (a + b) summe_ab
Zeichnen Sie Linien von jedem Punkt zu den Startpunkten: Benutzen Sie dazu die Base R Funktion
lines()
oder inggplot2
die Funktiongeom_segment()
.Berechnen Sie die Distanzen von jedem Punkt zu den Startpunkten. Speichern Sie die Distanzen in einer Matrix
dist_to_seeds
unter Verwendung von zwei verschachteltenfor
-Schleifen.Weisen Sie jedem Punkt das Clusterzentrum zu, das am nächsten ist. Speichern Sie die Zuweisungen in einem Vektor
cluster_assignments
. Benutzen Sie dazu die Funktionapply()
.Berechnen Sie die neuen Clusterzentren. Speichern Sie die neuen Clusterzentren in einer Matrix
new_centroids
. Benutzen Sie dazu einefor
-Schleife.Nutzen Sie
ggplot2
oder Base R zum Plotten der Ergebnisse.