Los clusters de partición son procedimientos de clustering usados para clasificar las visualizaciones en diversos equipos basados en su analogía. Los algoritmos necesitan que un analista especifique el número de clusters que tienen que generarse. Los partitioning clusters mas usados son:
K-means clustering: cada clúster está representado por la media de los puntos de vista de datos que pertenecen al clúster. El procedimiento K-means es sensible a los puntos de vista de datos anormales 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 comparativamente con k-means.
CLARA algorithm (clustering large aplications): es una expansión de PAM adaptada para enormes conjuntos de datos.
Por todos dichos metodos se poseen: - la iniciativa base y los conceptos matemáticos - el algoritmo de clustering y su utilización en el programa R - secciones de laboratorio de R con varios ejemplos para la investigación y la visualización de clústeres
Se usarán los próximos paquetes de R para calcular y visualizar los partitioning clusters:
Es el algoritmo de aprendizaje automático no supervisado más usado para dividir un grupo de datos dado en un grupo de k clusters, donde k representa el número de equipos preestablecido por el analista. Cataloga los objetos en diversas clusters, de manera que los objetos de un mismo cluster sean lo más parecidos viable, en lo que los objetos de clusters diferentes sean lo más disímiles viable. En este metodo cada cluster está representado por su centro correspondiente a la media de los puntos de vista designados al cluster.
La iniciativa importante del clustering de k-means se apoya en conceptualizar los clusters de manera que se minimice la alteración total dentro del cluster (conocida como alteración total dentro del cluster). Hay diversos algoritmos de k-means. El algoritmo estándar es el de Hartigan-Wong (1979), que define la alteración total dentro del clúster como la suma de las distancias cuadradas euclidianas entre los recursos y el centroide que corresponde:
\[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 algoritmo empieza seleccionando aleatoriamente k objetos del grupo de datos para que sirvan como centros iniciales de los clusters. Los objetos seleccionados además son identificados como centros de los clusters. Después, todos los objetos restantes son designados a su centroide más cercano que se define usando la distancia euclidiana entre el objeto y el medio del clúster. Tenga presente que, para usar la distancia de correlación, los datos se introducen como puntuaciones z. Todos los objetos se reasignan otra vez usando 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 necesita que los usuarios especifiquen el número de clusters a producir. La iniciativa es calcular el clustering de k-means usando diferentes valores de clusters k. En seguida, se dibuja la suma de cuadrados interior en funcionalidad del número de clusters. La localización de una curva ( knee) en el gráfico se estima principalmente como un indicador del número correcto de clusters. La capacidad de R fviz_nbclust() [in factoextra package] da una solución adecuado para valorar 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. Sin embargo se propone encarecidamente calcular el clustering de k-means con un costo enorme 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 funcionalidad kmeans()devuelve una lista de elementos, incluyendo:
clúster: Un vector de completos (de 1:k) que sugiere 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), o sea, xi≠̄x)2. La TSS mide la varianza total de los datos.
withinss: Vector de la suma de cuadrados dentro del clúster, un elemento por clúster.
tot.withinss: Suma total de cuadrados dentro del clúster, o sea, suma (withinss)
betweenss: La suma de cuadrados entre clusters, o sea, totss≠tot.withinss
tamaño: El número de visualizaciones en cada clúster
Se puede entrar a dichos elementos 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 iniciativa dibujar los resultados de los clusters. Dichos tienen la posibilidad de utilizarse para evaluar la votación del número de clusters, así como para equiparar 2 estudio de clusters diferentes.
Si poseemos un grupo de datos multidimensionales, una solución es hacer un Estudio de Elementos Primordiales (ACP) y dibujar los puntos de vista de datos según las coordenadas de ambos primeros elementos primordiales.
En el gráfico resultante, las visualizaciones se representan por medio de puntos de vista, usando elementos primordiales si el número de cambiantes es mayor a 2.
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 bastante sencilla y veloz. Puede intentar con efectividad conjuntos de datos bastante gigantes. No obstante, tiene ciertos puntos de vista débiles, entre ellos:
Implica un entendimiento anterior de los datos y necesita que el analista escoja de antemano el número apropiado de clústeres (k).
os resultados finales conseguidos son propensos a la selección aleatoria inicial de los clustercenters.
Es sensible a los valores atípicos.
Si se reordena los datos, es bastante viable que obtenga una solución distinto 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 referente con el clustering k-means para dividir un grupo de datos en k equipos o clusters. En el clustering k-medoids, cada cluster está representado por uno de los puntos de vista de datos del cluster. Dichos puntos de vista se llaman medoides de cluster.
K-medoid es una elección robusta al clustering de k-means. Esto quiere decir que el algoritmo es menos sensible al sonido y a los valores atípicos, comparativamente con k-means, pues usa medoides como centros de conglomerados en vez 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 fundamenta en la averiguación de k objetos representativos o medoides en medio de las visualizaciones del grupo de datos.
El algoritmo PAM se lleva a cabo en 2 etapas:
Seleccione k objetos para que se conviertan en los medoides, o en caso de que dichos objetos hayan sido proporcionados, utilícelos como medoides;
Calcule la matriz de diferencia 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 reduce el coeficiente medio de diferencia; si lo hace, se selecciona la entidad que más reduce este coeficiente como el medoid para este cluster;
Si por lo menos un medoide cambió pasar a (3), si no, concluir 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)
library(factoextra)
Para valorar el número óptimo de clusters, usaremos el procedimiento de la silueta media. La iniciativa es calcular el algoritmo PAM usando diferentes valores de clusters k. En seguida, se dibuja la silueta media de los clusters en funcionalidad del número de clusters. La silueta media mide la calidad de una agrupación.
La capacidad de R fviz_nbclust() [factoextrapackage] da una solución correcto para valorar 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 PAM de k-medoides es una opción robusta de k-medias para dividir un conjunto de datos en grupos de observaciones. De acuerdo con el procedimiento k-medoids, cada grupo está representado por un objeto seleccionado de él. El objeto seleccionado se llama medoide y corresponde a la faceta central del grupo.
Es una expansión de los procedimientos k-medoides para intentar datos que tienen dentro un enorme conjunto de objetos (más de diversos una cantidad enorme de observaciones) con el propósito de minimizar la era de computación y el problema de almacenamiento de RAM. Esto se consigue usando el enfoque de muestreo.
En vez de hallar medoides para todo el grupo de datos, CLARA estima una pequeña muestra de los datos con un tamaño fijo (sampsize) y aplica el algoritmo PAM para producir un grupo óptimo de medoides para la muestra. La calidad de los medoides resultantes se mide por la desigualdad media entre cada objeto del grupo de datos y el medoide de su clúster, determinada como funcionalidad 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 expansión del procedimiento de clustering PAM (Partitioning Around Medoids) para enormes conjuntos de datos. Su objetivo es minimizar la era de cálculo en la situación de monumentales conjuntos de datos. Como casi todos los algoritmos de partición, necesita que el cliente especifique el número conveniente de clusters que se producirán. Esto puede estimarse usando la funcionalidad fviz_nbclust [paquete infactoextraR].