Big Data Analytics: agrupación en clústeres de K-medias
El agrupamiento de k-medias tiene como objetivo dividir n observaciones en k grupos en los que cada observación pertenece al grupo con la media más cercana, sirviendo como un prototipo del grupo. Esto da como resultado una partición del espacio de datos en celdas de Voronoi.
Dado un conjunto de observaciones (x 1 , x 2 ,…, x n ) , donde cada observación es un vector real d-dimensional, la agrupación de k-medias tiene como objetivo dividir las n observaciones en k grupos G = {G 1 , G 2 ,…, G k } para minimizar la suma de cuadrados dentro del clúster (WCSS) definida de la siguiente manera:
$$ argmin \: \ sum_ {i = 1} ^ {k} \ sum_ {x \ in S_ {i}} \ paralelo x - \ mu_ {i} \ paralelo ^ 2 $$
La última fórmula muestra la función objetivo que se minimiza para encontrar los prototipos óptimos en la agrupación de k-medias. La intuición de la fórmula es que nos gustaría encontrar grupos que sean diferentes entre sí y cada miembro de cada grupo debería ser similar a los demás miembros de cada grupo.
El siguiente ejemplo demuestra cómo ejecutar el algoritmo de agrupación de k-means en R.
library(ggplot2)
# Prepare Data
data = mtcars
# We need to scale the data to have zero mean and unit variance
data <- scale(data)
# Determine number of clusters
wss <- (nrow(data)-1)*sum(apply(data,2,var))
for (i in 2:dim(data)[2]) {
wss[i] <- sum(kmeans(data, centers = i)$withinss)
}
# Plot the clusters
plot(1:dim(data)[2], wss, type = "b", xlab = "Number of Clusters",
ylab = "Within groups sum of squares")
Para encontrar un buen valor para K, podemos trazar la suma de cuadrados dentro de los grupos para diferentes valores de K.Esta métrica normalmente disminuye a medida que se agregan más grupos, nos gustaría encontrar un punto donde la disminución en la suma dentro de los grupos de cuadrados comienza a disminuir lentamente. En el gráfico, este valor se representa mejor con K = 6.
Ahora que se ha definido el valor de K, es necesario ejecutar el algoritmo con ese valor.
# K-Means Cluster Analysis
fit <- kmeans(data, 5) # 5 cluster solution
# get cluster means
aggregate(data,by = list(fit$cluster),FUN = mean)
# append cluster assignment
data <- data.frame(data, fit$cluster)