Capítulo 6
CLARA - Agrupamiento de Grandes Aplicaciones
CLARA (Clustering Large Applications, Kaufman y Rousseeuw (1990)) es una extensión de los métodos k-medoids (Capítulo 5) para manejar datos que contienen un gran número de objetos (más de varios miles de observaciones), con el fin de reducir el tiempo de cálculo y los problemas de almacenamiento en RAM. Esto se logra utilizando el enfoque de muestreo.
Concepto de CLARA
CLARA usa una pequeña muestra de datos y aplica el algoritmo PAM para encontrar medoids óptimos para la muestra. La calidad se mide por la disimilitud promedio entre cada objeto del conjunto completo y su medoid de cluster. Repitiendo el muestreo y el agrupamiento varias veces, se minimiza el sesgo y se eligen los medoids con el costo mínimo. El algoritmo se detalla en la siguiente sección.
Algoritmo CLARA
El algoritmo es el siguiente:
Dividir aleatoriamente los conjuntos de datos en múltiples subconjuntos de tamaño fijo (sampsize).
Calcular el algoritmo PAM en cada subconjunto y elegir los k objetos representativos (medoids). Asignar cada observación del conjunto de datos completo al medoid más cercano.
Calcular la media (o suma) de las disimilitudes de las observaciones a su medoid más cercano, como medida de la calidad del agrupamiento.
Retener el subconjunto de datos para el cual la media (o suma) es mínima. Se realiza un análisis adicional en la partición final.
Ten en cuenta que cada subconjunto de datos debe contener los medoids obtenidos del mejor subconjunto hasta el momento. Se añaden observaciones seleccionadas aleatoriamente a este conjunto hasta alcanzar el tamaño de muestra (sampsize).
Cálculo de CLARA en R
Formato y preparación de los datos
Para calcular el algoritmo CLARA en R, los datos
deben prepararse como se indica en el Capítulo 2. Aquí,
utilizaremos un conjunto de datos aleatorio. Para hacer que el resultado
sea reproducible, comenzamos utilizando 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
Paquetes y Funciones de R Requeridos
La función clara() [paquete
cluster] puede ser utilizada 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 un marco de datos, donde cada fila corresponde a una observación y cada columna a una variable. Se permiten valores faltantes (NAs).
- k: El número de clusters.
- metric: Las métricas de distancia a usar. Opciones disponibles: “euclidean” y “manhattan”. Las distancias euclidianas son la raíz de la suma de los cuadrados de las diferencias, y las distancias manhattan son la suma de las diferencias absolutas. La distancia manhattan es menos sensible a los valores atípicos.
- stand: Valor lógico; si es verdadero, las variables (columnas) en x se estandarizan antes de calcular las disimilitudes. Es recomendable estandarizar las variables antes de agrupar.
- samples: Número de muestras a extraer del conjunto de datos. El valor predeterminado es 5, pero se recomienda un valor mucho mayor.
- pamLike: Valor lógico que indica si se debe usar el
mismo algoritmo que en la función
pam(). Esto debe ser siempre verdadero.
Para crear un gráfico atractivo de los clusters generados con la
función clara(), utilizaremos el paquete
factoextra.
- Instalando los paquetes requeridos:
{{r}} install.packages(c("cluster", "factoextra"))
Cargando los paquetes:
## Loading required package: ggplot2## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
Estimación del Número Óptimo de Clusters
Para estimar el número óptimo de clusters en tus datos, es posible
utilizar el método del silhouette promedio,
como se describe en el capítulo de agrupamiento PAM
(Capítulo 5). La función R fviz_nbclust()
[paquete factoextra] proporciona una solución
para facilitar este paso.
library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()Según el gráfico, el número sugerido de clusters es 2. En la próxima sección, clasificaremos las observaciones en 2 clusters.
Cálculo de CLARA
El código R a continuación calcula el algoritmo CLARA con k = 2:
## 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"
La salida de la función clara() incluye
los siguientes componentes:
medoids: Objetos que representan los clusters.
clustering: Un vector que contiene el número de cluster de cada objeto.
sample: Etiquetas o números de caso de las observaciones en la mejor muestra, es decir, la muestra utilizada por el algoritmo clara para la partición final.
Si deseas agregar las clasificaciones de los puntos a los datos originales, utiliza esto:
## 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
Puedes acceder a los resultados devueltos por
clara() de la siguiente manera:
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
## S1 S2 S3 S4 S5 S6 S7 S8 S9 S10
## 1 1 1 1 1 1 1 1 1 1
Los medoids son S121 y S455.
Visualización de clusters CLARA
Para visualizar los resultados de la partición, utilizaremos la
función fviz_cluster() [paquete
factoextra]. Esta función dibuja un gráfico de
dispersión de los puntos de datos coloreados por los números de
cluster.
fviz_cluster(clara.res,
palette = c("#9370DB", "#FFB6C1"),
ellipse.type = "t",
geom = "point", pointsize = 1,
ggtheme = theme_classic()
)Resumen
El algoritmo CLARA (Clustering Large
Applications) es una extensión del método de agrupamiento
PAM (Partitioning Around
Medoids) para conjuntos de datos grandes. Está diseñado
para reducir el tiempo de cálculo en el caso de conjuntos de datos
grandes. Al igual que casi todos los algoritmos de particionamiento,
requiere que el usuario especifique el número apropiado de clusters a
producir. Esto puede ser estimado utilizando la función
fviz_nbclust [en el paquete R
factoextra]. La función R clara()
[paquete cluster] puede ser utilizada para
calcular el algoritmo CLARA. El formato simplificado es
clara(x, k, pamLike = TRUE), donde
“x” son los datos y k es el número de
clusters a generar. Después de calcular CLARA, la
función R fviz_cluster() [paquete
factoextra] puede ser utilizada para
visualizar los resultados. El formato es
fviz_cluster(clara.res), donde
clara.res son los resultados de
CLARA.