Wenn Ihre Frage ist how can I determine how many clusters are appropriate for a kmeans analysis of my data?
, dann sind hier einige Optionen. Der Wikipedia-Artikel zur Bestimmung der Anzahl von Clustern bietet einen guten Überblick über einige dieser Methoden.
Erstens einige reproduzierbare Daten (die Daten im Q sind ... für mich unklar):
n = 100
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))))
plot(d)
Eins . Suchen Sie nach einer Biegung oder einem Ellbogen in der Summe der SSE-Geröllkurven (Squared Error). Weitere Informationen finden Sie unter http://www.statmethods.net/advstats/cluster.html und http://www.mattpeeples.net/kmeans.html . Die Position des Ellbogens in der resultierenden Darstellung legt eine geeignete Anzahl von Clustern für die Kilometer nahe:
mydata <- d
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")
Wir könnten daraus schließen, dass 4 Cluster durch diese Methode angezeigt würden:
Zwei . Sie können mithilfe der pamk
Funktion im fpc-Paket eine Partitionierung um Medoide durchführen, um die Anzahl der Cluster zu schätzen .
library(fpc)
pamk.best <- pamk(d)
cat("number of clusters estimated by optimum average silhouette width:", pamk.best$nc, "\n")
plot(pam(d, pamk.best$nc))
# we could also do:
library(fpc)
asw <- numeric(20)
for (k in 2:20)
asw[[k]] <- pam(d, k) $ silinfo $ avg.width
k.best <- which.max(asw)
cat("silhouette-optimal number of clusters:", k.best, "\n")
# still 4
Drei . Calinsky-Kriterium: Ein weiterer Ansatz zur Diagnose, wie viele Cluster zu den Daten passen. In diesem Fall versuchen wir 1 bis 10 Gruppen.
require(vegan)
fit <- cascadeKM(scale(d, center = TRUE, scale = TRUE), 1, 10, iter = 1000)
plot(fit, sortg = TRUE, grpmts.plot = TRUE)
calinski.best <- as.numeric(which.max(fit$results[2,]))
cat("Calinski criterion optimal number of clusters:", calinski.best, "\n")
# 5 clusters!
Vier . Bestimmen Sie das optimale Modell und die Anzahl der Cluster gemäß dem Bayes'schen Informationskriterium für die Erwartungsmaximierung, das durch hierarchisches Clustering für parametrisierte Gaußsche Mischungsmodelle initialisiert wird
# See http://www.jstatsoft.org/v18/i06/paper
# http://www.stat.washington.edu/research/reports/2006/tr504.pdf
#
library(mclust)
# Run the function to see how many clusters
# it finds to be optimal, set it to search for
# at least 1 model and up 20.
d_clust <- Mclust(as.matrix(d), G=1:20)
m.best <- dim(d_clust$z)[2]
cat("model-based optimal number of clusters:", m.best, "\n")
# 4 clusters
plot(d_clust)
Fünf . Affinity Propagation (AP) -Clustering, siehe http://dx.doi.org/10.1126/science.1136800
library(apcluster)
d.apclus <- apcluster(negDistMat(r=2), d)
cat("affinity propogation optimal number of clusters:", length(d.apclus@clusters), "\n")
# 4
heatmap(d.apclus)
plot(d.apclus, d)
Sechs . Lückenstatistik zur Schätzung der Anzahl von Clustern. Siehe auch Code für eine schöne grafische Ausgabe . Versuchen Sie hier 2-10 Cluster:
library(cluster)
clusGap(d, kmeans, 10, B = 100, verbose = interactive())
Clustering k = 1,2,..., K.max (= 10): .. done
Bootstrapping, b = 1,2,..., B (= 100) [one "." per sample]:
.................................................. 50
.................................................. 100
Clustering Gap statistic ["clusGap"].
B=100 simulated reference sets, k = 1..10
--> Number of clusters (method 'firstSEmax', SE.factor=1): 4
logW E.logW gap SE.sim
[1,] 5.991701 5.970454 -0.0212471 0.04388506
[2,] 5.152666 5.367256 0.2145907 0.04057451
[3,] 4.557779 5.069601 0.5118225 0.03215540
[4,] 3.928959 4.880453 0.9514943 0.04630399
[5,] 3.789319 4.766903 0.9775842 0.04826191
[6,] 3.747539 4.670100 0.9225607 0.03898850
[7,] 3.582373 4.590136 1.0077628 0.04892236
[8,] 3.528791 4.509247 0.9804556 0.04701930
[9,] 3.442481 4.433200 0.9907197 0.04935647
[10,] 3.445291 4.369232 0.9239414 0.05055486
Hier ist die Ausgabe von Edwin Chens Implementierung der Lückenstatistik:
Sieben . Es kann auch nützlich sein, Ihre Daten mit Clustergrammen zu untersuchen, um die Clusterzuweisung zu visualisieren. Siehe http://www.r-statistics.com/2010/06/clustergram-visualization-and-diagnostics-for-cluster-analysis-r- Code / für weitere Details.
Acht . Das NbClust-Paket enthält 30 Indizes, um die Anzahl der Cluster in einem Dataset zu bestimmen.
library(NbClust)
nb <- NbClust(d, diss=NULL, distance = "euclidean",
method = "kmeans", min.nc=2, max.nc=15,
index = "alllong", alphaBeale = 0.1)
hist(nb$Best.nc[1,], breaks = max(na.omit(nb$Best.nc[1,])))
# Looks like 3 is the most frequently determined number of clusters
# and curiously, four clusters is not in the output at all!
Wenn Ihre Frage lautet how can I produce a dendrogram to visualize the results of my cluster analysis
, sollten Sie mit folgenden Punkten beginnen:
http://www.statmethods.net/advstats/cluster.html
http://www.r-tutor.com/gpu-computing/clustering/hierarchical-cluster-analysis
http://gastonsanchez.wordpress.com/2012/10/03/7-ways-to-plot-dendrograms-in-r/ Weitere exotische Methoden finden Sie hier: http://cran.r-project.org/ web / views / Cluster.html
Hier einige Beispiele:
d_dist <- dist(as.matrix(d)) # find distance matrix
plot(hclust(d_dist)) # apply hirarchical clustering and plot
# a Bayesian clustering method, good for high-dimension data, more details:
# http://vahid.probstat.ca/paper/2012-bclust.pdf
install.packages("bclust")
library(bclust)
x <- as.matrix(d)
d.bclus <- bclust(x, transformed.par = c(0, -50, log(16), 0, 0, 0))
viplot(imp(d.bclus)$var); plot(d.bclus); ditplot(d.bclus)
dptplot(d.bclus, scale = 20, horizbar.plot = TRUE,varimp = imp(d.bclus)$var, horizbar.distance = 0, dendrogram.lwd = 2)
# I just include the dendrogram here
Ebenfalls für hochdimensionale Daten ist die pvclust
Bibliothek vorgesehen, die p-Werte für hierarchisches Clustering über Multiskalen-Bootstrap-Resampling berechnet. Hier ist das Beispiel aus der Dokumentation (funktioniert nicht mit so niedrigdimensionalen Daten wie in meinem Beispiel):
library(pvclust)
library(MASS)
data(Boston)
boston.pv <- pvclust(Boston)
plot(boston.pv)
Hilft irgendetwas davon?
fpc
Paket verfügbaren DBSCAN-Clustering-Algorithmus ausprobieren . Es ist wahr, Sie müssen dann zwei Parameter einstellen ... aber ich habe festgestellt, dass esfpc::dbscan
dann ziemlich gute Arbeit leistet, automatisch eine gute Anzahl von Clustern zu bestimmen. Außerdem kann tatsächlich ein einzelner Cluster ausgegeben werden, wenn die Daten dies aussagen. Einige der Methoden in @ Bens hervorragenden Antworten helfen Ihnen nicht dabei, festzustellen, ob k = 1 tatsächlich am besten ist.