Verwenden des Statistikpakets in R für kmeans-Clustering

10

Ich habe Schwierigkeiten, einen oder zwei Aspekte des Cluster-Pakets zu verstehen. Ich verfolge das Beispiel von Quick-R genau, verstehe aber einen oder zwei Aspekte der Analyse nicht. Ich habe den Code eingefügt, den ich für dieses spezielle Beispiel verwende.

## Libraries
library(stats)
library(fpc) 

## Data
mydata = structure(list(a = c(461.4210925, 1549.524107, 936.42856, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131.4349206, 0, 762.6110846, 
3837.850406), b = c(19578.64174, 2233.308842, 4714.514274, 0, 
2760.510002, 1225.392118, 3706.428246, 2693.353714, 2674.126613, 
592.7384164, 1820.976961, 1318.654162, 1075.854792, 1211.248996, 
1851.363623, 3245.540062, 1711.817955, 2127.285272, 2186.671242
), c = c(1101.899095, 3.166506463, 0, 0, 0, 1130.890295, 0, 654.5054857, 
100.9491289, 0, 0, 0, 0, 0, 789.091922, 0, 0, 0, 0), d = c(33184.53871, 
11777.47447, 15961.71874, 10951.32402, 12840.14983, 13305.26424, 
12193.16597, 14873.26461, 11129.10269, 11642.93146, 9684.238583, 
15946.48195, 11025.08607, 11686.32213, 10608.82649, 8635.844964, 
10837.96219, 10772.53223, 14844.76478), e = c(13252.50358, 2509.5037, 
1418.364947, 2217.952853, 166.92007, 3585.488983, 1776.410835, 
3445.14319, 1675.722506, 1902.396338, 945.5376228, 1205.456943, 
2048.880329, 2883.497101, 1253.020175, 1507.442736, 0, 1686.548559, 
5662.704559), f = c(44.24828759, 0, 485.9617601, 372.108855, 
0, 509.4916263, 0, 0, 0, 212.9541122, 80.62920455, 0, 0, 30.16525587, 
135.0501384, 68.38023073, 0, 21.9317122, 65.09052886), g = c(415.8909649, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637.2629479, 0, 0, 
0), h = c(583.2213618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0), i = c(68206.47387, 18072.97762, 23516.98828, 
13541.38572, 15767.5799, 19756.52726, 17676.00505, 21666.267, 
15579.90094, 14351.02033, 12531.38237, 18470.59306, 14149.82119, 
15811.23348, 14637.35235, 13588.64291, 12549.78014, 15370.90886, 
26597.08152)), .Names = c("a", "b", "c", "d", "e", "f", "g", 
"h", "i"), row.names = c(NA, -19L), class = "data.frame")

Dann standardisiere ich die Variablen:

# standardize variables
mydata <- scale(mydata) 

## K-means Clustering 

# Determine number of clusters
wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var))
for (i in 2:15) wss[i] <- sum(kmeans(mydata, centers=i)$withinss)
# Q1
plot(1:15, wss, type="b", xlab="Number of Clusters",  ylab="Within groups sum of squares") 

# K-Means Cluster Analysis
fit <- kmeans(mydata, 3) # number of values in cluster solution

# get cluster means 
aggregate(mydata,by=list(fit$cluster),FUN=mean)

# append cluster assignment
mydata <- data.frame(mydata, cluster = fit$cluster)

# Cluster Plot against 1st 2 principal components - vary parameters for most readable graph
clusplot(mydata, fit$cluster, color=TRUE, shade=TRUE, labels=0, lines=0) # Q2

# Centroid Plot against 1st 2 discriminant functions
plotcluster(mydata, fit$cluster)

Meine Frage ist, wie kann das Diagramm, das die Anzahl der Cluster ( Q1in meinem Code markiert ) zeigt, mit den tatsächlichen Werten (Clusternummer und Variablenname) in Beziehung gesetzt werden?

Update: Ich verstehe jetzt, dass die clusplot()Funktion ein bivariates Diagramm mit PCA1 und PCA2 ist. Ich verstehe jedoch die Verbindung zwischen den PCA-Komponenten und den Clustergruppen nicht. Welche Beziehung besteht zwischen den PCA-Werten und den Clustergruppen? Ich habe an anderer Stelle über die Verbindung zwischen kmeans und PCA gelesen, aber ich verstehe immer noch nicht, wie sie in demselben bivariaten Diagramm angezeigt werden können.

Celenius
quelle
Entschuldigung, wenn ich in den letzten Tagen zu viele Fragen zum Clustering gestellt habe. Ich versuche, mich schnell mit diesem Feld vertraut zu machen (auch ich habe diese Frage auf SO, stackoverflow.com/questions/4997870/… gepostet, aber es wurde vorgeschlagen, sie hierher zu verschieben)
celenius
Das ist in Ordnung, dies ist nicht TCS.SE (-;
# Anzahl der Cluster bestimmen Können Sie erklären, warum wir diese Formel verwenden (mydata, 2, var) und warum 2:15?

Antworten:

8

Ich habe Frage 1 nicht vollständig verstanden, aber ich werde versuchen, eine Antwort zu finden. Das Diagramm von Q1 zeigt, wie sich die innere Summe der Quadrate (wss) ändert, wenn sich die Clusternummer ändert. Bei dieser Art von Plots müssen Sie nach den Knicken im Diagramm suchen. Ein Knick bei 5 zeigt an, dass es eine gute Idee ist, 5 Cluster zu verwenden.

WSS hat eine Beziehung zu Ihren Variablen im folgenden Sinne, die Formel für WSS lautet

jxiCj||xiμj||2

Dabei ist der Mittelwert für Cluster und die te Beobachtung. Wir bezeichnen Cluster j als . WSS wird manchmal als "wie ähnlich sind die Punkte in jedem Cluster" interpretiert. Diese Ähnlichkeit bezieht sich auf die Variablen. j x i i C jμjjxiiCj

Die Antwort auf Frage 2 lautet: Was Sie tatsächlich in der sehen, clusplot()ist die Darstellung Ihrer Beobachtungen in der Hauptebene. Diese Funktion berechnet die Hauptkomponentenbewertung für jede Ihrer Beobachtungen, zeichnet diese Bewertungen auf und färbt sie nach Clustern.

Die Hauptkomponentenanalyse (PCA) ist eine Technik zur Dimensionsreduzierung. Es "fasst" die Informationen aller Variablen in ein paar "neuen" Variablen zusammen, die als Komponenten bezeichnet werden. Jede Komponente ist dafür verantwortlich, einen bestimmten Prozentsatz der Gesamtvariabilität zu erklären. Im Beispiel lesen Sie "Diese beiden Komponenten erklären 73,95% der Gesamtvariabilität".

Die Funktion clusplot()wird verwendet, um die Effektivität von Clustering zu identifizieren. Wenn Sie ein erfolgreiches Clustering haben, werden Sie feststellen, dass die Cluster in der Hauptebene klar voneinander getrennt sind. Auf der anderen Seite werden die Cluster in der Hauptebene zusammengeführt, wenn das Clustering nicht erfolgreich ist.

Weitere Informationen zur Hauptkomponentenanalyse finden Sie im Wiki. Wenn Sie ein Buch möchten, das ich Modern Multivariate Techniques von Izenmann vorschlage, finden Sie dort PCA und k-means.

Hoffe das hilft :)

deps_stats
quelle
1
Vielen Dank für Ihre Antwort. Ich hatte noch eine Frage zur clusplot()Funktion. Welche Beziehung besteht zwischen den PCA-Werten und den Clustergruppen? Ich habe an anderer Stelle über die Verbindung zwischen kmeans und PCA gelesen, aber ich verstehe immer noch nicht, wie sie in demselben bivariaten Diagramm angezeigt werden können. (Vielleicht sollte dies eine neue Frage an sich sein).
Celenius
2
Tatsächlich sind die PCA-Werte und die Clustergruppen unabhängig. PCA erstellt "neue" Koordinaten für jede Beobachtung in mydata, das sehen Sie tatsächlich auf dem Plot. Die Form der Punkte wird mit fit$clusterdem zweiten Parameter von aufgetragen clusplot(). Vielleicht sollten Sie sich PCA genauer ansehen. Lassen Sie mich wissen, ob dies Ihnen geholfen hat oder ob Sie weitere Referenzen haben.
deps_stats
1
Es hilft (in dem Sinne, dass ich mich auf mein Problem einlasse!). Wie hängt es fit$clustermit den PCA "Koordinaten" zusammen? Ich glaube, ich verstehe, wie PCA funktioniert, aber so wie ich es verstehe, kann nicht jede Komponente mit Variablen aus den Originaldaten erklärt werden (es handelt sich vielmehr um eine lineare Kombination der Rohdaten), weshalb ich nicht verstehe, wie es sein kann im Zusammenhang mit den Clustern.
Celenius
2
Du hast es fast geschafft :) fit$clusterhat nichts mit PCA zu tun. Sie clusplot()zeichnen die Punkte mit den "neuen" Koordinaten und beschriften sie mit fit$cluster. Ich habe '+' für Cluster 3, 'o' für Cluster 1 und ein Dreieck für Cluster 2. Die Funktion clusplot()ist nützlich, um das Clustering zu visualisieren.
deps_stats
1
Mit den "neuen" Koordinaten meine ich PCA1 und PCA2. Sie haben Recht, sie haben nichts mit fit$cluster:)
deps_stats