Die Lückenstatistik ist eine großartige Möglichkeit, dies zu tun. Tibshirani, Hastie & Walther (2001).
http://stat.ethz.ch/R-manual/R-devel/library/cluster/html/clusGap.html - Das relevante R-Paket.
Die Idee ist, dass es einen sequentiellen Hypothesentest zum Clustering Ihrer Daten für K = 1,2,3, ... gegen eine Nullhypothese des zufälligen Rauschens durchführt, die einem Cluster entspricht. Seine besondere Stärke ist, dass es Ihnen einen zuverlässigen Hinweis darauf gibt, ob K = 1 ist, dh ob es keine Cluster gibt.
Hier ist ein Beispiel: Ich habe vor einigen Tagen einige Astronomiedaten untersucht, und zwar aus einer Exoplaneten-Umfrage. Ich wollte wissen, welche Beweise es für (konvexe) Cluster gibt. Meine Daten sind "Transit"
library(cluster)
cgap <- clusGap(transit, FUN=kmeans, K.max=kmax, B=100)
for(k in 1:(kmax-1)) {
if(cgap$Tab[k,3]>cgap$Tab[(k+1),3]-cgap$Tab[(k+1),4]) {print(k)};
break;
}
Mit der Lückenstatistik suchen Sie nach dem ersten Wert von K, bei dem der Test "fehlschlägt", dh die Lückenstatistik sinkt erheblich. Die obige Schleife gibt eine solche ak aus. Wenn Sie jedoch cgap einfach zeichnen, erhalten Sie die folgende Abbildung:
Sehen Sie, wie die Lücke von k = 1 auf k = 2 signifikant abfällt , was bedeutet, dass tatsächlich keine Cluster vorhanden sind (dh 1 Cluster).
Sie können auch eine neuere Methode ausprobieren: A. Kalogeratos und A. Likas, Dip-means: eine inkrementelle Clustering-Methode zur Schätzung der Anzahl der Cluster , NIPS 2012.
Die Idee ist, statistische Hypothesentests auf Unimodalität für Vektoren zu verwenden, die die Ähnlichkeit / Entfernung zwischen einem Punkt und den übrigen Punkten der Menge enthalten. Der Test wird unter Verwendung des Hartigan-Hartigan- Tauchtests Ann durchgeführt. Statist. 13 (1): 70-84.
Die Methode beginnt mit dem gesamten Datensatz als ein Cluster und teilt ihn schrittweise auf, solange die Unimodalitätshypothese verworfen wird (dh mehr als ein Cluster vorhanden ist).
Diese Methode würde also anzeigen, ob die Daten mehr als einen Cluster enthalten (Ihre Frage), kann aber auch das endgültige Clustering bereitstellen.
Hier finden Sie Code in Matlab .
quelle
Angenommen, ich betrachte das gleiche Beispiel.
Bibliothek (Cluster) cgap <- clusGap (Transit, FUN = kmeans, K.max = kmax, B = 100) für (k in 1: (kmax-1)) {if (cgap Tab [(k + 1), 3] -cgap $ Tab [(k + 1), 4]) {print (k)}; brechen; }}T.a b [ k , 3 ] > c ga p
Wie kann ich Elemente von Clustern unterteilen, die der besten Clusterlösung basierend auf der Statistik der maximalen Lücke entsprechen? Damit ich es für weitere Analysen auf jedem der Cluster verwenden kann.
Ich weiß, dass es einen Befehl namens Subset gibt. Es gibt keine Probleme mit diesem Befehl, wenn wir die Anzahl der gewünschten Cluster angegeben haben. Aber wie kann man eine Teilmenge erstellen, wenn man eine Teilmenge basierend auf dem optimalen k unter Verwendung der Lücke erhalten möchte (kurz gesagt, Teilmenge von Clustern, wenn es eine Schleife gibt)?
quelle