Si su pregunta es how can I determine how many clusters are appropriate for a kmeans analysis of my data?
, entonces aquí hay algunas opciones. El artículo de Wikipedia sobre la determinación de la cantidad de grupos tiene una buena revisión de algunos de estos métodos.
Primero, algunos datos reproducibles (los datos en la Q son ... poco claros para mí):
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)
Uno . Busque una curva o codo en la gráfica de suma de error al cuadrado (SSE). Consulte http://www.statmethods.net/advstats/cluster.html y http://www.mattpeeples.net/kmeans.html para obtener más información. La ubicación del codo en la gráfica resultante sugiere un número adecuado de grupos para los medios:
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")
Podríamos concluir que 4 grupos serían indicados por este método:
Dos . Puede realizar particiones alrededor de medoides para estimar el número de clústeres utilizando la pamk
función en el paquete fpc.
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
Tres . Criterio de Calinsky: otro enfoque para diagnosticar cuántos grupos se adaptan a los datos. En este caso tratamos de 1 a 10 grupos.
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!
Cuatro . Determine el modelo óptimo y el número de grupos según el Criterio de información bayesiano para la maximización de expectativas, inicializado por agrupamiento jerárquico para modelos de mezcla gaussiana parametrizados
# 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)
Cinco . Agrupación de propagación de afinidad (AP), consulte 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)
Seis . Estadística de brecha para estimar el número de grupos. Vea también algo de código para una buena salida gráfica . Tratando de 2 a 10 grupos aquí:
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
Aquí está el resultado de la implementación de la estadística de brecha de Edwin Chen:
Siete . También puede resultarle útil explorar sus datos con clustergramas para visualizar la asignación de clústeres, consulte http://www.r-statistics.com/2010/06/clustergram-visualization-and-diagnostics-for-cluster-analysis-r- código / para más detalles.
Ocho . El paquete NbClust proporciona 30 índices para determinar la cantidad de clústeres en un conjunto de datos.
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!
Si su pregunta es how can I produce a dendrogram to visualize the results of my cluster analysis
, entonces debe comenzar con estos:
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/ Y vea aquí para obtener métodos más exóticos: http://cran.r-project.org/ web / views / Cluster.html
Aquí están algunos ejemplos:
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
También para datos de alta dimensión está la pvclust
biblioteca que calcula los valores p para la agrupación jerárquica a través del remuestreo bootstrap multiescala. Aquí está el ejemplo de la documentación (no funcionará en datos de dimensiones tan bajas como en mi ejemplo):
library(pvclust)
library(MASS)
data(Boston)
boston.pv <- pvclust(Boston)
plot(boston.pv)
¿Algo de eso ayuda?
fpc
paquete. Es cierto, luego debe establecer dos parámetros ... pero descubrí quefpc::dbscan
hace un trabajo bastante bueno para determinar automáticamente un buen número de clústeres. Además, en realidad puede generar un solo clúster si eso es lo que le dicen los datos: algunos de los métodos en las excelentes respuestas de @ Ben no lo ayudarán a determinar si k = 1 es realmente el mejor.