2013-08-04 6 views
5

Ich möchte K-Means Clustering für meinen Datensatz verwenden. Ich benutze dafür die Funktion kmeans() in R.Implementieren der Ellenbogenmethode zum Ermitteln der optimalen Anzahl von Clustern für die K-Means-Clusterbildung in R

k<-kmeans(data,centers=3) 
plotcluster(m,k$cluster) 

Allerdings bin ich nicht sicher, was ist der richtige Wert von K für diese Funktion. Ich möchte versuchen, die Elbow Method dafür zu verwenden. Gibt es Pakete in R, die Clustering mit der Elbow-Methode durchführen, um die optimale Anzahl von Clustern zu finden.

+2

vom Wikipedia-Artikel hilft: „Diese "Ellenbogen" kann nicht immer eindeutig identifiziert werden. "Ich denke, dass es bei dieser Methode eine gewisse Subjektivität gibt, die eine Implementierung erschwert. – Roland

+2

mögliches Duplikat von [Clusteranalyse in R: Bestimme die optimale Anzahl von Clustern] (http: // stackoverflow. com/questions/15376075/cluster-analysis-in-r-ermitteln-die-optimale-Anzahl-von-Clustern) –

Antwort

2

Meine Erfahrung ist, dass du das nicht automatisieren kannst - du musst die Handlung machen und nach dem Ellenbogen suchen. Hier sind einige nette Beispiele: Cluster analysis in R: determine the optimal number of clusters

+0

I tri Das Diagramm, das ich bekam, ist sehr verschieden von dem im Wikipedia - Artikel ... es ist sehr schwierig, den Elbow Punkt davon zu finden – user1946152

+1

Sie können alles automatisieren - das Problem ist, wie zuverlässig diese Automatisierung findet Knie :) –

+2

Hallo nochmal. Wenn der Ellbogen in der Grafik nicht offensichtlich ist, ist dies ein Hinweis darauf, dass es keine "richtige" Antwort für die Anzahl der Cluster gibt, k. Sie können andere Metriken (AIC/BIC) oder andere Clustering-Methoden ausprobieren. Unter dem Strich kann es jedoch sein, dass Sie eine nicht statistische Methode zur Auswahl von k benötigen (z. B. Fachwissen). (p.s. gehen Sie voran und veröffentlichen Sie das Diagramm, wenn es etwas ist, das Sie teilen können!) – stackoverflax

8

Es gibt zwei Fragen, die hier durcheinander gebracht werden. Einer ist, wie man einen Änderungspunkt auf einer Kurve findet, und der andere ist, wie man die Qualität der Anpassung quantifiziert, wenn man k-means verwendet, um Daten zu klassifizieren. Die Cluster-Analyse-Leute scheinen diese beiden Fragen jedoch zusammenzufassen. Haben Sie keine Angst davor, andere Kurvenanpassungs-/Änderungspunktmethoden zu untersuchen, und zwar mit der für Sie am besten geeigneten Metrik.

Ich weiß, dass die Ellbogenmethode, mit der Sie verbunden sind, eine bestimmte Methode ist, aber Sie könnten an etwas ähnlichem interessiert sein, das im Bayesschen Informationskriterium (BIC) nach dem "Knie" sucht. Der Knick in BIC gegenüber der Anzahl von Clustern (k) ist der Punkt, an dem man argumentieren kann, dass ein steigender BIC durch Hinzufügen von mehr Clustern angesichts der zusätzlichen Rechenanforderungen der komplexeren Lösung nicht mehr vorteilhaft ist. Es gibt eine nette Methode, die die optimale Anzahl von Clustern aus dem Vorzeichenwechsel der zweiten Ableitung des BIC erkennt. Siehe z.B.

Zhao, Q., V. Hautamaki und P. Franti 2008a: Kniespeicherkennung im BIC zur Erkennung der Anzahl der Cluster. Fortgeschrittene Konzepte für intelligente Bildverarbeitungssysteme, J. Blanc-Talon, S. Bourennane, W. Philips, D. Popescu und P. Scheunders, Hrsg., Springer Berlin/Heidelberg, Vorlesungsnotizen in Informatik, Vol. 2, No. 5259, 664-673, doi: 10.1007/978-3-540-88458-3 60.

Zhao, Q., M. Xu und P. Franti, 2008b: Kniespeicherkennung nach bayesischem Informationskriterium. Werkzeuge mit künstlicher Intelligenz, 2008. ICTAI '08. 20. IEEE International Conference on, Vol. No. 2, 431 -438, doi: 10,1109/ICTAI.2008.154

Sie könnten in einer automatisierten Anwendung dieser interessiert sein, Daten in http://journals.ametsoc.org/doi/abs/10.1175/JAMC-D-11-0227.1

See berichtet Wetter, auch Finding the best trade-off point on a curve für eine ausgezeichnete Diskussion über die allgemeine Ausrichtung.

Eine letzte Beobachtung: stellen Sie sicher, dass Sie in Ihren Logarithmen konsistent sind. Verschiedene Communities verwenden unterschiedliche Schreibweisen, und dies kann eine Fehlerquelle beim Vergleich der Ergebnisse sein.

3

Ja, Sie können die beste Anzahl von Clustern mit Elbow-Methode finden, aber ich fand es mühsam, den Wert von Clustern aus Elbow-Diagramm mit Skript zu finden. Sie können den Elbow-Graphen beobachten und den Ellenbogenpunkt selbst finden, aber es war viel Arbeit, ihn vom Drehbuch aus zu finden.

So eine andere Option ist Silhouette Method zu verwenden, um es zu finden. Das Ergebnis von Silhouette entspricht vollständig dem Ergebnis der Elbow-Methode.

Hier ist, was ich getan habe.

#Dataset for Clustering 
n = 150 
g = 6 
set.seed(g) 
d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))), 
       y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2)))) 
mydata<-d 
#Plot 3X2 plots 
attach(mtcars) 
par(mfrow=c(3,2)) 

#Plot the original dataset 
plot(mydata$x,mydata$y,main="Original Dataset") 

#Scree plot to deterine the 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) 
} 
plot(1:15, wss, type="b", xlab="Number of Clusters",ylab="Within groups sum of squares") 

# Ward Hierarchical Clustering 
d <- dist(mydata, method = "euclidean") # distance matrix 
fit <- hclust(d, method="ward") 
plot(fit) # display dendogram 
groups <- cutree(fit, k=5) # cut tree into 5 clusters 
# draw dendogram with red borders around the 5 clusters 
rect.hclust(fit, k=5, border="red") 

#Silhouette analysis for determining the number of clusters 
library(fpc) 
asw <- numeric(20) 
for (k in 2:20) 
    asw[[k]] <- pam(mydata, k) $ silinfo $ avg.width 
k.best <- which.max(asw) 

cat("silhouette-optimal number of clusters:", k.best, "\n") 
plot(pam(d, k.best)) 

# K-Means Cluster Analysis 
fit <- kmeans(mydata,k.best) 
mydata 
# get cluster means 
aggregate(mydata,by=list(fit$cluster),FUN=mean) 
# append cluster assignment 
mydata <- data.frame(mydata, clusterid=fit$cluster) 
plot(mydata$x,mydata$y, col = fit$cluster, main="K-means Clustering results") 

Hoffe es hilft !!

+1

Einige Abbildungen der Resultate und etwas mehr Erklärung des Gedankenprozesses würden diese umfassende Antwort in eine große Antwort drehen! –

0

Ich habe das GMD-Paket versucht. Aus irgendeinem Grund hat es viel Zeit und kam in diesem Schritt Fehler in elbow.batch (css.obj) mit einem Fehler zurück: Gut k' is not available with provided inc.thres and ev.thres; please make adjustment, e.g. decrease ev.thres', erhöhen inc.thres' or increase k‘.

Also das ist meine Lösung für das Erhalten der optimalen K (Sein Lauf auf einem 54 Spalte Datensatz (alle ganzen Zahlen) mit 6000+ Reihen

mydata <- read.csv(file.choose(), header = TRUE) 
mydata_scaled <- as.data.frame(lapply(mydata, scale)) 
mss <- (nrow(mydata_scaled)-1)*sum(apply(mydata_scaled,2,var)) 
for (i in 2:15) mss[i] <- sum(kmeans(mydata_scaled,centers=i)$withinss) 
plot(1:15, mss, type="b", xlab="Number of Clusters", ylab="Within groups sum of squares") 

Hoffnung, die

Verwandte Themen