#Agrupación K-Means El clustering de K-means, es el algoritmo de aprendizaje automático no supervisado más utilizado para dividir un conjunto de datos en k grupos (es decir, un grupo). de aprendizaje automático para dividir un conjunto de datos en un conjunto de k grupos (es decir k clusters), donde k representa el número de grupos especificado previamente por el analista. El algoritmo clasifica los objetos en varios grupos (es decir, conglomerados), de modo que los objetos de un mismo conglomerado sean lo más parecidos posible (es decir, lo más parecidos posible).
La idea básica consiste en definir los conglomerados de forma que se minimice la variación total intraconglomerado (conocida como variación total dentro del conglomerado). (conocida como variación total dentro del conglomerado). Existen varios algoritmos k-means.
El algoritmo estándar es el, que define la variación total dentro del cluster como la suma de las distancias euclidianas al cuadrado entre los elementos y el correspondiente centroide
El primer paso cuando se utiliza el clustering k-means es indicar el número de clusters (k) que se generarán en la solución final. El algoritmo comienza seleccionando aleatoriamente k objetos del conjunto de datos que servirán de centros iniciales de los conglomerados. Los objetos seleccionados también se conocen como medios de cluster o centroides.
Utilizaremos el conjunto de datos de demostración “USArrests”. Los datos deben prepararse como se describe en el capítulo 2. Los datos deben contener sólo variables continuas, ya que el algoritmo k-means utiliza medias variables. Como no queremos que el algoritmo k-means dependa de una unidad de variable arbitraria, empezamos escalando los datos usando la función de R scale() como siga
data("USArrests") # Loading the data set
df <- scale(USArrests)
head(df, n = 3)
## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
# kmeans(x, centers, iter.max = 10, nstart = 1)
##x: matriz numérica, marco de datos numéricos o vector numérico ## centros: Los valores posibles son el número de conglomerados (k) o un conjunto de centros de conglomerados iniciales (distintos). iniciales (distintos). Si es un número, se elige un conjunto aleatorio de filas (distintas) de x como centros iniciales. como centros iniciales. ## iter.max: El número máximo de iteraciones permitidas. El valor por defecto es 10. ## nstart: El número de particiones iniciales aleatorias cuando centers es un número. Se suele recomendar nstart > 1.
Para crear un bonito gráfico de los clusters generados con la función kmeans(), se utilizar el paquete factoextra.
Instalar el paquete factoextra como:
install.packages("factoextra")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
Cargando factoextra:
library(ggplot2)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
El clustering de k-means requiere que los usuarios especifiquen el número de clusters a generar. generar. Una cuestión fundamental es: ¿cómo elegir el número correcto de conglomerados previstos (k)?
Los distintos métodos se presentarán en el capítulo “Evaluación y validación de clústeres estadísticas” Aquí se ofrece una solución sencilla. La idea es calcular el clustering de k-means utilizando diferentes valores para los clusters
La función de R fviz_nbclust() [en el paquete factoextra] ofrece una solución práctica para estimar el número óptimo de conglomerados
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
El gráfico anterior representa la varianza dentro de los conglomerados. Disminuye a medida que aumenta k pero puede verse una curva (o “codo”) en k = 4.
Esta curva indica que los conglomerados clusters más allá del cuarto tienen poco valor… En la siguiente sección, clasificaremos las observaciones en 4 clusters
generador de números. El objetivo es hacer reproducibles los resultados, de modo que el lector de este artículo obtenga exactamente los mismos resultados que se muestran a continuación. El siguiente código R realiza la agrupación k-means con k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
Dado que el resultado final del clustering k-means es sensible a las asignaciones aleatorias de inicio aleatorias, especificamos nstart = 25.
Esto significa que R probará 25 asignaciones asignaciones de inicio aleatorias y luego seleccionará los mejores resultados correspondientes a la que tenga la variación más baja dentro del cluster. El valor por defecto de nstart en R es uno. Pero, es Sin embargo, se recomienda encarecidamente calcular la agrupación k-means con un valor grande de nstart como 25 o 50, para obtener un resultado más estable.
print(km.res)
## K-means clustering with 4 clusters of sizes 8, 13, 16, 13
##
## Cluster means:
## Murder Assault UrbanPop Rape
## 1 1.4118898 0.8743346 -0.8145211 0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001 0.5758298 -0.26165379
## 4 0.6950701 1.0394414 0.7226370 1.27693964
##
## Clustering vector:
## Alabama Alaska Arizona Arkansas California
## 1 4 4 1 4
## Colorado Connecticut Delaware Florida Georgia
## 4 3 3 4 1
## Hawaii Idaho Illinois Indiana Iowa
## 3 2 4 3 2
## Kansas Kentucky Louisiana Maine Maryland
## 3 2 1 2 4
## Massachusetts Michigan Minnesota Mississippi Missouri
## 3 4 2 1 4
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 4 2 3
## New Mexico New York North Carolina North Dakota Ohio
## 4 4 1 2 3
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 3 3 3 3 1
## South Dakota Tennessee Texas Utah Vermont
## 2 1 4 3 2
## Virginia Washington West Virginia Wisconsin Wyoming
## 3 3 2 2 3
##
## Within cluster sum of squares by cluster:
## [1] 8.316061 11.952463 16.212213 19.922437
## (between_SS / total_SS = 71.2 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
La salida impresa muestra: - las medias o centros de los clusters: una matriz, cuyas filas son el número de cluster (1 a 4) y las columnas son variables - el vector de clusterización: Un vector de enteros (de 1:k) que indica el cluster al que se asigna cada punto. al que se asigna cada punto
Es posible calcular la media de cada variable por conglomerados utilizando los datos originales
aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
## cluster Murder Assault UrbanPop Rape
## 1 1 13.93750 243.62500 53.75000 21.41250
## 2 2 3.60000 78.53846 52.07692 12.17692
## 3 3 5.65625 138.87500 73.87500 18.78125
## 4 4 10.81538 257.38462 76.00000 33.19231
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
## Murder Assault UrbanPop Rape cluster
## Alabama 13.2 236 58 21.2 1
## Alaska 10.0 263 48 44.5 4
## Arizona 8.1 294 80 31.0 4
## Arkansas 8.8 190 50 19.5 1
## California 9.0 276 91 40.6 4
## Colorado 7.9 204 78 38.7 4
La función kmeans() devuelve una lista de componentes, incluyendo: # cluster: Un vector de enteros (de 1:k) que indica el cluster al que se asigna cada punto #centros: Una matriz de centros de cluster (medias de cluster) # totss: La suma total de cuadrados (SST), es decir, q (xi ≠ x¯)2. TSS mide la varianza total de los datos. # withinss: Vector de la suma de cuadrados dentro del conglomerado, un componente por conglomerado. #tot.withinss: Suma total de cuadrados dentro del conglomerado, es decir, sum(withinss) #betweenss: La suma de cuadrados entre conglomerados, es decir, totss ≠ tot.withinss # tamaño: El número de observaciones en cada conglomerado. Se puede acceder a estos componentes de la siguiente manera:
aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
## cluster Murder Assault UrbanPop Rape
## 1 1 13.93750 243.62500 53.75000 21.41250
## 2 2 3.60000 78.53846 52.07692 12.17692
## 3 3 5.65625 138.87500 73.87500 18.78125
## 4 4 10.81538 257.38462 76.00000 33.19231
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
## Murder Assault UrbanPop Rape cluster
## Alabama 13.2 236 58 21.2 1
## Alaska 10.0 263 48 44.5 4
## Arizona 8.1 294 80 31.0 4
## Arkansas 8.8 190 50 19.5 1
## California 9.0 276 91 40.6 4
## Colorado 7.9 204 78 38.7 4
km.res$cluster
## Alabama Alaska Arizona Arkansas California
## 1 4 4 1 4
## Colorado Connecticut Delaware Florida Georgia
## 4 3 3 4 1
## Hawaii Idaho Illinois Indiana Iowa
## 3 2 4 3 2
## Kansas Kentucky Louisiana Maine Maryland
## 3 2 1 2 4
## Massachusetts Michigan Minnesota Mississippi Missouri
## 3 4 2 1 4
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 4 2 3
## New Mexico New York North Carolina North Dakota Ohio
## 4 4 1 2 3
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 3 3 3 3 1
## South Dakota Tennessee Texas Utah Vermont
## 2 1 4 3 2
## Virginia Washington West Virginia Wisconsin Wyoming
## 3 3 2 2 3
head(km.res$cluster, 4)
## Alabama Alaska Arizona Arkansas
## 1 4 4 1
km.res$size
## [1] 8 13 16 13
km.res$centers
## Murder Assault UrbanPop Rape
## 1 1.4118898 0.8743346 -0.8145211 0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001 0.5758298 -0.26165379
## 4 0.6950701 1.0394414 0.7226370 1.27693964
Es una buena idea trazar los resultados de los grupos. Éstos pueden utilizarse para evaluar la elección del número de conglomerados, así como para comparar dos análisis de conglomerados diferentes. Ahora, queremos visualizar los datos en un diagrama de dispersión con el color de cada punto de datos en función de su asignación a un conglomerado. El problema es que los datos contienen más de 2 variables y la cuestión es qué variables elegir para el gráfico de dispersión xy. variables elegir para el gráfico de dispersión xy. Una solución es reducir el número de dimensiones aplicando un algoritmo de reducción de la dimensionalidad, como el algoritmo de componentes principales. dimensionalidad, como el Análisis de Componentes Principales (ACP), que opera sobre las cuatro variables y produce dos nuevas variables (que representan las variables originales) que puede utilizar para hacer el gráfico
fviz_cluster(km.res, data = df,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid", # Concentration ellipse
star.plot = TRUE, # Add segments from centroids to items
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_minimal()
)
K-means clustering es un algoritmo muy sencillo y rápido. Puede tratar eficazmente grandes conjuntos de datos. Sin embargo, tiene algunos puntos débiles pero estos puntos debiles tienen lagunas alternativas de solucion.
Una alternativa robusta a k-means es PAM, que se basa en medoides. Como se en el capítulo siguiente, la agrupación PAM puede calcularse utilizando la función pam() [paquete cluster]. La función pamk( ) [paquete fpc] es una envoltura para PAM que también imprime el número sugerido de conglomerados basándose en la anchura media óptima de la silueta.
El clustering de K-means puede utilizarse para clasificar observaciones en k grupos, basándose en su similitud. Cada grupo está representado por el valor medio de los puntos del grupo, denominado centroide del clúster.
El algoritmo K-means requiere que los usuarios especifiquen el número de clústeres que deben generarse. La función kmeans() [paquete stats] puede utilizarse para calcular el algoritmo k-means. El formato simplificado de formato simplificado es kmeans(x, centers), donde “x” son los datos y centers es el número de conglomerados que se van a producir.