Clustering hängt unter anderem von der Größe ab . Diskussionen zu diesem Thema finden Sie unter ( unter anderem ) Wann sollten Sie Daten zentrieren und standardisieren? und PCA zur Kovarianz oder Korrelation? .
Hier sehen Sie Ihre Daten mit einem Seitenverhältnis von 1: 1, aus dem hervorgeht, wie stark sich die Maßstäbe der beiden Variablen unterscheiden:
Rechts davon zeigt das Diagramm der Lückenstatistiken die Statistik nach Anzahl der Cluster ( ) mit Standardfehlern, die mit vertikalen Segmenten gezeichnet wurden, und dem optimalen Wert von der mit einer vertikalen gestrichelten blauen Linie markiert ist. Nach der Hilfe,kkclusGap
Die Standardmethode "firstSEmax" sucht nach dem kleinsten , sodass sein Wert nicht mehr als 1 Standardfehler vom ersten lokalen Maximum entfernt ist.kf( k )
Andere Methoden verhalten sich ähnlich. Dieses Kriterium lässt keine der Lückenstatistiken auffallen, was zu einer Schätzung von .k = 1
Die Auswahl des Maßstabs hängt von der Anwendung ab. Ein vernünftiger Standardausgangspunkt ist jedoch ein Maß für die Streuung der Daten, z. B. die MAD oder die Standardabweichung. In diesem Diagramm wird die Analyse nach dem erneuten Zentrieren auf Null und dem erneuten Skalieren wiederholt, um eine Einheitsstandardabweichung für jede Komponente und :einb
Die K-Means-Lösung wird durch Variieren des Symboltyps und der Farbe im Streudiagramm der Daten auf der linken Seite angezeigt. Unter der Menge ist in der Darstellung der Lückenstatistik auf der rechten Seite eindeutig bevorzugt: Es ist das erste lokale Maximum und die Statistik für kleineres (das heißt, ) sind deutlich niedriger. Größere Werte für passen wahrscheinlich zu einem so kleinen Datensatz, und keiner ist signifikant besser als . Sie werden hier nur gezeigt, um die allgemeine Methode zu veranschaulichen. k ∈ { 1 , 2 , 3 , 4 , 5 } k = 2 k k = 1 k k = 2k = 2k ∈ { 1 , 2 , 3 , 4 , 5 }k = 2kk = 1kk = 2
Hier ist R
Code, um diese Zahlen zu produzieren. Die Daten stimmen ungefähr mit den Angaben in der Frage überein.
library(cluster)
xy <- matrix(c(29,391, 31,402, 31,380, 32.5,391, 32.5,360, 33,382, 33,371,
34,405, 34,400, 34.5,404, 36,343, 36,320, 36,303, 37,344,
38,358, 38,356, 38,351, 39,318, 40,322, 40, 341), ncol=2, byrow=TRUE)
colnames(xy) <- c("a", "b")
title <- "Raw data"
par(mfrow=c(1,2))
for (i in 1:2) {
#
# Estimate optimal cluster count and perform K-means with it.
#
gap <- clusGap(xy, kmeans, K.max=10, B=500)
k <- maxSE(gap$Tab[, "gap"], gap$Tab[, "SE.sim"], method="Tibs2001SEmax")
fit <- kmeans(xy, k)
#
# Plot the results.
#
pch <- ifelse(fit$cluster==1,24,16); col <- ifelse(fit$cluster==1,"Red", "Black")
plot(xy, asp=1, main=title, pch=pch, col=col)
plot(gap, main=paste("Gap stats,", title))
abline(v=k, lty=3, lwd=2, col="Blue")
#
# Prepare for the next step.
#
xy <- apply(xy, 2, scale)
title <- "Standardized data"
}