2017-12-06 8 views
1

Die Datenmenge, die ich verwende, ist unten abgebildet. Wie man sieht, würden Sie denken, dass die K-Means-Cluster-Analyse die Zentren dieser Cluster leicht finden würde.K-Means-Clustering findet nicht alle Cluster in Daten

Initial Data

Allerdings, wenn ich laufen K-Means-Clusteranalyse und zeichnen Sie die Zentren ich diese.

K-means Cluster Centers

ich nur der grundlegende KMeans Code verwenden:

cluster <- kmeans(mydata,90) 
cluster$centers 
+0

Kmeans ist kein deterministischer Algorithmus, die Zufälligkeit der ursprünglichen Zentren wird die endgültige beeinflussen Ergebnis. Wenn Sie ein erwartetes Ergebnis haben, dann geben Sie die Anfangszentren vor oder suchen Sie einen anderen Algorithmus. – Dave2e

+0

Es sind ungefähr 5.000 Datenpunkte. Sie sind jedoch in strukturierte Cluster eingeteilt (ca. 40-60 Datenpunkte pro Cluster). – tylerp

+0

Haben Sie versucht, einen anderen Cluster-Algorithmus zu verwenden, um die Zentren zu finden, und dann die Zentren an k-means zu senden? [z.B. h-clust] (https://stackoverflow.com/questions/44547697/cluster-algorithm-with-levenshtein-distance-and-additional-features-variables/44551452#44551452) – AkselA

Antwort

1

Wie ich im Kommentar erwähnt, könnte die Verwendung hclust(), um die Zentren zu finden, ein praktikabler Ansatz sein.

enter image description here

set.seed(1) 

l <- 1e4 
v1 <- sample(1:10, l, replace=TRUE) + rnorm(l, 0, 0.05) 
v2 <- sample(1:13, l, replace=TRUE) + rnorm(l, 0, 0.05) 
dtf <- data.frame(v1, v2) 

par(mar=c(2, 2, 1, 1)) 
plot(dtf, pch=16, cex=0.2, col="#00000044") 

km <- kmeans(dtf, 10*13) 
points(km$centers, cex=2, lwd=0.5, col="red") 

hc <- hclust(dist(dtf)) 
hc <- cutree(hc, 10*13) 
hcent <- aggregate(dtf, list(hc), mean)[, -1] 

hckm <- kmeans(dtf, hcent) 

points(hckm$centers, cex=3, lwd=0.5, col="blue") 
2

Eine wenig bekannte Tatsache über KMeans dass zuverlässige Ergebnisse zu erhalten, ist, müssen Sie den Algorithmus wiederholt mit vielen zufälligen Initialisierungen laufen . Ich verwende normalerweise kmeans(, nstart = 1000).

In der Theorie leidet der kmeans++ Algorithmus nicht so viel von der Initialisierung Problem, aber ich finde oft, dass kmeans mit vielen zufälligen Neustarts besser als kmeans++ führt. Dennoch möchten Sie vielleicht kmeans++ mit dem flexclust R-Paket versuchen.

+0

Leider löste das nicht das Problem, das ich hatte . Es hat die Ergebnisse leicht verbessert, aber ich bekomme immer noch überlappende Cluster-Zentren. – tylerp

+0

Versuchen Sie, zu 'nstart = 10000' oder sogar' nstart = 100000' zu gehen. Wenn keiner von beiden funktioniert, benötigen Sie eine andere Möglichkeit, eine gute Initialisierung durchzuführen. Nicht eine sehr befriedigende Antwort, ich weiß, aber optimale k-Means-Clustering ist ein NP-vollständiges Problem, so dass Sie nicht viel mehr tun können. –

0

Dieser Datensatz ist wahrscheinlich viel besser sein durch DBSCAN geclustert werden.

Wählen Sie Epsilon kleiner als der Abstand von Clustern (zB 10) und MinPts soll nicht viel dann, zum Beispiel MinPts = 4

+0

Dies scheint mir die 90 Cluster zu geben, nach denen ich suche, aber wie extrahiere ich den Mittelpunkt/Mittelwert jedes Clusters? – tylerp

+0

DBSCAN ist nicht zentriert, Fehler können Sie den Mittelwert selbst berechnen. –

Verwandte Themen