Los clusters de partición son métodos de clustering utilizados para clasificar las observaciones en múltiples grupos basados en su similitud. Los algoritmos requieren que un analista especifique el número de clusters que deben generarse. Los partitioning clusters mas utilizados son:
K-means clustering: cada clúster está representado por la media de los puntos de datos que pertenecen al clúster. El método K-means es sensible a los puntos de datos anómalos y a los valores atípicos.
K-medoids clustering or PAM: cada cluster está representado por uno de los objetos del cluster. PAM es menos sensible a los valores atípicos en comparación con k-means.
CLARA algorithm (clustering large aplications): es una extensión de PAM adaptada para grandes conjuntos de datos.
Por cada uno de estos metodos se tienen: - la idea base y los conceptos matemáticos - el algoritmo de clustering y su implementación en el software R - secciones de laboratorio de R con muchos ejemplos para el análisis y la visualización de clústeres
Se utilizarán los siguientes paquetes de R para calcular y visualizar los partitioning clusters:
Es el algoritmo de aprendizaje automático no supervisado más utilizado para dividir un conjunto de datos dado en un conjunto de k clusters, donde k representa el número de grupos preestablecido por el analista. Clasifica los objetos en múltiples clusters, de forma que los objetos de un mismo cluster sean lo más parecidos posible, mientras que los objetos de clusters diferentes sean lo más disímiles posible. En este metodo cada cluster está representado por su centro que corresponde a la media de los puntos asignados al cluster.
La idea fundamental del clustering de k-means consiste en definir los clusters de forma que se minimice la variación total dentro del cluster (conocida como variación total dentro del cluster). Existen varios algoritmos de k-means. El algoritmo estándar es el de Hartigan-Wong (1979), que define la variación total dentro del clúster como la suma de las distancias cuadradas euclidianas entre los elementos y el centroide correspondiente:
\[W(C_k)=\sum{x_i \in C_k}(x_i-\mu_k)^2 \]
Definimos la variación total dentro de un cúlster así:
\[tot.withinss=\sum_{k=1}^{k}W(C_{k})=\sum_{k=1}^{k}\sum_{x_{i}\epsilon\mathbb{C}_{k}}(x_{i}-\mu_{k})^{2} \]
La suma total de cuadrados dentro del cluster mide la compacidad del cluster y queremos que sea lo más pequeña posible
El primer paso al utilizar el clustering de 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 para que sirvan como centros iniciales de los clusters. Los objetos seleccionados también se conocen como centros de los clusters. A continuación, cada uno de los objetos restantes son asignados a su centroide más cercano que se define utilizando la distancia euclidiana entre el objeto y el medio del clúster. Este paso se denomina “paso de asignación de clusters”. Tenga en cuenta que, para utilizar la distancia de correlación, los datos se introducen como puntuaciones z. Después de la asignación, el algoritmo calcula el nuevo valor medio de cada clúster. Ahora que se han recalculado los centros, se comprueba de nuevo cada observación para ver si puede estar más cerca de un cluster diferente. Todos los objetos se reasignan de nuevo utilizando los medios de cluster actualizados.
Utilizaremos el conjunto de datos de demostración “USArrests”. Los datos deben contener sólo variables continuas, ya que el algoritmo k-means utiliza medias variables. Como no queremos que el algoritmo de k-means dependa de una unidad variable arbitraria, empezaremos por escalar los datos utilizando la función de Rcale() como se indica a continuación:
data("USArrests")
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
La función estándar de R para la agrupación de k-means es kmeans() [statspackage], cuyo formato simplificado es el siguiente:
kmeans(x, centers,iter.max =10,nstart =1)
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.2.2
## Loading required package: ggplot2
## 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. La idea es calcular el clustering de k-means utilizando diferentes valores de clusters k. A continuación, se dibuja la suma de cuadrados interior en función del número de clusters. La ubicación de una curva ( knee) en el gráfico se considera generalmente como un indicador del número adecuado de clusters. La función de R fviz_nbclust() [in factoextra package] proporciona una solución conveniente para estimar el número óptimo de clusters.
library(factoextra)
fviz_nbclust(df, kmeans,method ="wss")+
geom_vline(xintercept =4,linetype =2)
el gráfico representa la varianza dentro de los clusters. Disminuye a
medida que aumenta k, pero puede verse una curva en k = 4. Esta curva
indica que los clusters adicionales más allá del cuarto tienen poco
valor. La curva indica que los clusters adicionales más allá del cuarto
tienen poco valor.
Como el algoritmo de clustering de k-means comienza con k centroides seleccionados aleatoriamente, siempre se recomienda utilizar la función set.seed()para establecer una “semilla” para el generador de números aleatorios de R. El objetivo es hacer reproducibles los resultados.
El código R que se muestra a continuación realiza la agrupación de k-means con k = 4:
set.seed(123)
km.res <-kmeans(df,4,nstart =25)
Como el resultado final del clustering de k-means es sensible a las asignaciones iniciales aleatorias, especificamos nstart = 25. Esto significa que R probará 25 asignaciones iniciales aleatorias diferentes y luego seleccionará los mejores resultados correspondientes a la que tenga la menor variación dentro del clúster. El valor por defecto denstart en R es uno. Pero se recomienda encarecidamente calcular el clustering de k-means con un valor grande de nstart, como 25 o 50, para obtener un resultado más estable.
# visualizar los resultados
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"
Es posible calcular la media de cada una de las variables por clusters 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
Si se quiere añadir las clasificaciones de puntos a los datos originales, se utiliza esto:
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:
clúster: Un vector de enteros (de 1:k) que indica el cluster al que se asigna cada punto
centros: Una matriz de los centros de los clusters (medias de los clusters)
totss: La suma total de cuadrados (TSS), es decir, xi≠̄x)2. La TSS mide la varianza total de los datos.
withinss: Vector de la suma de cuadrados dentro del clúster, un componente por clúster.
tot.withinss: Suma total de cuadrados dentro del clúster, es decir, suma (withinss)
betweenss: La suma de cuadrados entre clusters, es decir, totss≠tot.withinss
tamaño: El número de observaciones en cada clúster
Se puede acceder a estos componentes asi:
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
# tamaño del cluster
km.res$size
## [1] 8 13 16 13
# medios de cluster
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 clusters. Estos pueden utilizarse para evaluar la elección del número de clusters, así como para comparar dos análisis de clusters diferentes.
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.
Si tenemos un conjunto de datos multidimensionales, una solución es realizar un Análisis de Componentes Principales (ACP) y trazar los puntos de datos según las coordenadas de los dos primeros componentes principales.
La funciónfviz_cluster() [factoextrapackage] puede utilizarse para visualizar fácilmente los clusters de k-means. Toma los resultados de k-means y los datos originales como argumentos. En el gráfico resultante, las observaciones se representan mediante puntos, utilizando componentes principales si el número de variables es superior a 2. También es posible dibujar una elipse de concentración alrededor de cada clúster.
fviz_cluster(km.res,data =df,
palette =c("#2E9FDF","#00AFBB","#E7B800","#FC4E07"),
ellipse.type ="euclid",
star.plot =TRUE,
repel =TRUE,
ggtheme =theme_minimal()
)
El clustering de K-means es un algoritmo muy simple y rápido. Puede tratar con eficacia conjuntos de datos muy grandes. Sin embargo, tiene algunos puntos débiles, entre ellos:
Supone un conocimiento previo de los datos y requiere que el analista elija de antemano el número apropiado de clústeres (k).
os resultados finales obtenidos son sensibles a la selección aleatoria inicial de los clustercenters.
Es sensible a los valores atípicos.
Si se reordena los datos, es muy posible que obtenga una solución diferente cada vez que cambie el orden de sus datos.
Una alternativa robusta a k-means es PAM, que se basa en medoides.
El clustering de K-means puede utilizarse para clasificar las observaciones en k grupos, basándose en su similitud. Cada grupo está representado por el valor medio de los puntos del grupo, conocido como el centroide del clúster.
El algoritmo k-medoids es un enfoque de clustering relacionado con el clustering k-means para dividir un conjunto de datos en k grupos o clusters. En el clustering k-medoids, cada cluster está representado por uno de los puntos de datos del cluster. Estos puntos se denominan medoides de cluster.
K-medoid es una alternativa robusta al clustering de k-means. Esto significa que el algoritmo es menos sensible al ruido y a los valores atípicos, en comparación con k-means, porque utiliza medoides como centros de conglomerados en lugar de medias (utilizadas en k-means).
El uso de medias implica que la agrupación de k-means es muy sensible a los valores atípicos. Esto puede afectar gravemente a la asignación de las observaciones a los clusters. El algoritmo PAM ofrece un algoritmo más robusto.
El algoritmo PAM se basa en la búsqueda de k objetos representativos o medoides entre las observaciones del conjunto de datos.
El algoritmo PAM se desarrolla en dos fases:
Seleccione k objetos para que se conviertan en los medoides, o en caso de que estos objetos hayan sido proporcionados, utilícelos como medoides;
Calcule la matriz de disimilitud si no se ha proporcionado;
Asigna cada objeto a su medoide más cercano;
Para cada cluster se busca si alguno de los objetos del cluster disminuye el coeficiente medio de disimilitud; si lo hace, se selecciona la entidad que más disminuye este coeficiente como el medoid para este cluster;
Si al menos un medoide ha cambiado pasar a (3), si no, terminar el algoritmo.
Utilizaremos los conjuntos de datos de demostración “USArrests”, que empezamos a escalar utilizando la función de Rcale()como se indica a continuación:
data("USArrests")
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
La función pam() [clusterpackage] y pamk()[fpcpackage] pueden utilizarse para calcular PAM.
La función pamk() no requiere que el usuario decida el número de clusters K.
pam(x, k, metric = “euclidean”, stand = FALSE)
x: valores posibles
k: El número de clusters
metric: la métrica de la distancia a utilizar. Las opciones disponibles son “euclidiana” y “manhattan”.
stand: valor lógico; si es verdadero, las variables (columnas) de x se estandarizan antes de calcular las disimilitudes. Se ignora cuando x es una matriz de disimilitud.
library(cluster)
## Warning: package 'cluster' was built under R version 4.2.2
library(factoextra)
Para estimar el número óptimo de clusters, utilizaremos el método de la silueta media. La idea es calcular el algoritmo PAM utilizando diferentes valores de clusters k. A continuación, se dibuja la silueta media de los clusters en función del número de clusters. La silueta media mide la calidad de una agrupación.
La función de R fviz_nbclust() [factoextrapackage] proporciona una solución conveniente para estimar el número óptimo de clusters.
fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()
El código R siguiente calcula el algoritmo PAM con k = 2:
pam.res <-pam(df,2)
print(pam.res)
## Medoids:
## ID Murder Assault UrbanPop Rape
## New Mexico 31 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska 27 -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Clustering vector:
## Alabama Alaska Arizona Arkansas California
## 1 1 1 2 1
## Colorado Connecticut Delaware Florida Georgia
## 1 2 2 1 1
## Hawaii Idaho Illinois Indiana Iowa
## 2 2 1 2 2
## Kansas Kentucky Louisiana Maine Maryland
## 2 2 1 2 1
## Massachusetts Michigan Minnesota Mississippi Missouri
## 2 1 2 1 1
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 1 2 2
## New Mexico New York North Carolina North Dakota Ohio
## 1 1 1 2 2
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 2 2 2 2 1
## South Dakota Tennessee Texas Utah Vermont
## 2 1 1 2 2
## Virginia Washington West Virginia Wisconsin Wyoming
## 2 2 2 2 2
## Objective function:
## build swap
## 1.441358 1.368969
##
## Available components:
## [1] "medoids" "id.med" "clustering" "objective" "isolation"
## [6] "clusinfo" "silinfo" "diss" "call" "data"
La salida muestra:
los medoides del cluster: una matriz, cuyas filas son los medoides y las columnas son variables.
el vector de clustering: Un vector de enteros (de 1:k) que indica el cluster al que se asigna cada punto.
Si se quiere añadir las clasificaciones de puntos a los datos originales, se utiliza esto:
dd <-cbind(USArrests,cluster =pam.res$cluster)
head(dd,n=3)
## Murder Assault UrbanPop Rape cluster
## Alabama 13.2 236 58 21.2 1
## Alaska 10.0 263 48 44.5 1
## Arizona 8.1 294 80 31.0 1
La función pam() devuelve un objeto de la clase pam cuyos componentes incluyen: - medoides: Objetos que representan clusters. - clustering: un vector que contiene el número de cluster de cada objeto
pam.res$medoids
## Murder Assault UrbanPop Rape
## New Mexico 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska -0.8008247 -0.8250772 -0.2445636 -0.5052109
head(pam.res$clustering)
## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
Para visualizar los resultados de la partición, utilizaremos la función fviz_cluster() [factoextrapackage]. Dibuja un gráfico de dispersión de los puntos de datos coloreados por los números de cluster. Si los datos contienen más de 2 variables, se utiliza el algoritmo de análisis de componentes principales (PCA) para reducir la dimensionalidad de los datos. En este caso, se utilizan las dos primeras dimensiones principales para trazar los datos.
fviz_cluster(pam.res,
palette =c("#00AFBB","#FC4E07"),
ellipse.type ="t",
repel =TRUE,
ggtheme =theme_classic()
)
El algoritmo K-medoids, PAM, es una alternativa robusta a k-means para la partición de un conjunto de datos en clusters de observación. En el método k-medoids, cada clúster está representado por un objeto seleccionado dentro del mismo. Los objetos seleccionados se denominan medoides y corresponden a los puntos más céntricos del clúster.
Es una extensión de los métodos k-medoides para tratar datos que contienen un gran número de objetos (más de varios miles de observaciones) con el fin de reducir el tiempo de computación y el problema de almacenamiento de RAM. Esto se consigue utilizando el enfoque de muestreo.
En lugar de encontrar medoides para todo el conjunto de datos, CLARA considera una pequeña muestra de los datos con un tamaño fijo (sampsize) y aplica el algoritmo PAM para generar un conjunto óptimo de medoides para la muestra. La calidad de los medoides resultantes se mide por la disimilitud media entre cada objeto del conjunto de datos y el medoide de su clúster, definida como función de coste.
El algoritmo es el siguiente:
Dividir aleatoriamente los conjuntos de datos en múltiples subconjuntos con tamaño fijo.
Calcular el algoritmo PAM en cada subconjunto y elegir los correspondientes k objetos representativos (medoides). Asignar cada observación del conjunto de datos al medoide más cercano.
Calcule la media (o la suma) de las disimilitudes de las observaciones con respecto a su medoide más cercano. Esto se utiliza como medida de la bondad de la agrupación.
Conserve el subconjunto de datos cuya media (o suma) sea mínima. Se lleva a cabo un nuevo análisis de la partición final.
En este caso, generaremos un conjunto de datos aleatorios. Para que el resultado sea reproducible, empezamos por utilizar la función set.seed().
set.seed(1234)
df <-rbind(cbind(rnorm(200,0,8),rnorm(200,0,8)),
cbind(rnorm(300,50,8),rnorm(300,50,8)))
colnames(df) <-c("x","y")
rownames(df) <-paste0("S",1:nrow(df))
head(df,nrow =6)
## x y
## S1 -9.656526 3.881815
## S2 2.219434 5.574150
## S3 8.675529 1.484111
## S4 -18.765582 5.605868
## S5 3.432998 2.493448
## S6 4.048447 6.083699
La función clara() [clusterpackage] puede utilizarse para calcular CLARA. El formato simplificado es el siguiente:
clara(x, k,metric =“euclidean”,stand =FALSE, samples =5,pamLike =FALSE)
x: una matriz de datos numéricos o marco de datos, cada fila corresponde a una observación, y cada columna corresponde a una variable. Se permiten los valores perdidos
k: el número de clusters.
metric: la métrica de distancia que se va a utilizar.
stand: valor lógico; si es verdadero, las variables (columnas) de x se estandarizan antes de calcular las disimilitudes. Se recomienda estandarizar las variables antes de agruparlas.
Muestras: número de muestras que se extraen del conjunto de datos. El valor por defecto es 5, pero se recomienda un valor mucho mayor.
pamLike: lógica que indica si se debe utilizar el mismo algoritmo de la funciónpam(). Debe ser siempre verdadero.
install.packages(c("cluster","factoextra"))
## Warning: packages 'cluster', 'factoextra' are in use and will not be installed
library(cluster)
library(factoextra)
Para estimar el número óptimo de clusters en sus datos, es posible utilizar el método de la silueta media, tal y como se describe en el capítulo de clustering de PAM (Capítulo 5). La función Rfviz_nbclust() [factoextrapackage] proporciona una solución para facilitar este paso.
fviz_nbclust(df, clara,method ="silhouette")+
theme_classic()
El código R siguiente calcula el algoritmo PAM con k = 2:
clara.res <- clara(df,2,samples =50,pamLike =TRUE)
print(clara.res)
## Call: clara(x = df, k = 2, samples = 50, pamLike = TRUE)
## Medoids:
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
## Objective function: 9.87862
## Clustering vector: Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
## - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
## Cluster sizes: 200 300
## Best sample:
## [1] S37 S49 S54 S63 S68 S71 S76 S80 S82 S101 S103 S108 S109 S118 S121
## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
##
## Available components:
## [1] "sample" "medoids" "i.med" "clustering" "objective"
## [6] "clusinfo" "diss" "call" "silinfo" "data"
Si se quiere añadir las clasificaciones de puntos a los datos originales, se utiliza esto:
dd <- cbind(df,cluster =clara.res$cluster)
head(dd,n=4)
## x y cluster
## S1 -9.656526 3.881815 1
## S2 2.219434 5.574150 1
## S3 8.675529 1.484111 1
## S4 -18.765582 5.605868 1
Se puede acceder a los resultados devueltos por clara() como sigue:
clara.res$medoids
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
head(clara.res$clustering,10)
## S1 S2 S3 S4 S5 S6 S7 S8 S9 S10
## 1 1 1 1 1 1 1 1 1 1
Los medoides son S121, S455
Para visualizar los resultados de la partición, utilizaremos la función fviz_cluster() [factoextrapackage]. Dibuja un gráfico de dispersión de los puntos de datos coloreados por los números de clúster.
fviz_cluster(clara.res,
palette = c("#00AFBB", "#FC4E07"),
ellipse.type ="t",
geom ="point", pointsize = 1,
ggtheme =theme_classic()
)
El algoritmo CLARA (Clustering Large Applications) es una extensión del método de clustering PAM (Partitioning Around Medoids) para grandes conjuntos de datos. Su objetivo es reducir el tiempo de cálculo en el caso de grandes conjuntos de datos. Como casi todos los algoritmos de partición, requiere que el usuario especifique el número adecuado de clusters que se producirán. Esto puede estimarse utilizando la función fviz_nbclust [paquete infactoextraR].