Capítulo 6 - CLARA - Clustering Large

Fredys Marmolejo

2024-05-22

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:

  1. Dividir aleatoriamente los conjuntos de datos en múltiples subconjuntos de tamaño fijo (sampsize).

  2. 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.

  3. Calcular la media (o suma) de las disimilitudes de las observaciones a su medoid más cercano, como medida de la calidad del agrupamiento.

  4. 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.

  1. Instalando los paquetes requeridos:
chooseCRANmirror(ind=1)

{{r}} install.packages(c("cluster", "factoextra"))

  1. Cargando los paquetes:

    library(cluster)
    library(factoextra)
    ## 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:

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"

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:

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

Puedes acceder a los resultados devueltos por clara() de la siguiente manera:

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 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.