##CAPITULO 4
##Agrupación de K-medias El agrupamiento de K-medias (MacQueen, 1967) es el metodo no supervisado más utilizado de algoritmo de aprendizaje automatico para dividir un conjunto de datos determinado en un conjunto de k grupos (es decir, k grupos), donde k representad el numero de grupos preespecificos por el analista. Clasifica objetos en multiples grupos (es decir, grupos) de modo que los objetos dentro del mismo grupo sean lo mas similares posible (es decir, baja interclase, similitud de clase) En la agrupacion de k-medias, cada grupo está representado por su centro (es decir, centroide) que corresponde a la media de los puntos asignados al grupo
##4.1 K-significa ideas básicas La idea basica detras de la agrupacion de k-medias consiste en definir grupos de modo que se minimice la variacion total intra-grupo (conocida como variacion total dentro del grupo).
Hay varios algoritmos de k-medias disponibles. El algoritmo estándar es el algoritmo Hartigan-Wong (1979), que define la variacion total dentro del grupo como la suma de las distancias al cuadrado (distintas euclidianas entre elementos y el centroide correspondiente)
##4.2 K-significa algoritmos El primer paso al utilizar la agrupacion de k-medias es indicar el numero de agrupaciones (k) que se generaran en la solucion final. El algoritmo comienza seleccionando aleatoriamente k objetos del conjunto de datos para que sirvan como centros iniciales de los grupos. Los objetos seleccionados tambien se conocen como medias de conglomerados o centroides. A continuacion, cada uno de los objetos restantes se asigna a su centroide, donde el mas cercano se define utilizando la distancia euclidiana (Capitulo 3) entre el objeto y la media del grupo. Este paso se denomina “paso de asignacion de clústeres”. Tenga en cuenta que, para utilizar la distancia de correlacion, los datos se ingresan como puntuaciones z. Despues del paso de asignacion, el algoritmo calcula el nuevo valor medio de cada grupo. El termino “actualizacion de centroide” del grupo se utiliza para diseñar este paso. Ahora que se han recalculado los centros, se vuelve a comprobar cada observacion para ver si se podría estar mas cerca de un grupo diferente. Todos los onjetos se reasignan nuevamente utilizando los medios de clúster actualizados. Los pasos de asignacion de conglomerados y actualizacion de centroides se repiten iterativamente hasta que las asignaciones de conglomerados dejan de cambiar (es decir, hasta que se logra la convergencia). Eso es el grupo formado en la interación actual que son los mismos que los obtenidos en la iteracion anterior.
##4.3 Computando k-significado en R #4.3.1 Datos Usaremos los conjuntos de datos de demostración “USArrets”. Los datos deben prepararse como se describe en el capitulo . Los datos deben contener solo variables continuas, ya que el algoritmo k-means utiliza medias variables. Como no queremos que el algoritmo k-means dependa de una unidad variable arbitraria, comenzamos escalando los datos usando la función R scale() de la sgte manera:
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
#4.3.2 Paquetes y funciones de R necesarios La funcion estandar de R para la sgte agrupacion de k-medias es kmeans () [paquete de estadisticas], cuyo fromato simplificado es el sgte:
#kmeans(x, centers, iter.max = 10, nstart = 1)
Para crear un grafico de los clusters generados con la funcion kmeans(), usaremos lo sgt:
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.3
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
#4.3.3 Estimacion del numero optimo de conglomerados
La agrupacion en clústeres k-means requiere que los usuarios especifiquen la cantidad de clusteres que se generarán.
Una pregunta fundamental es: ¿Cómo elegir el numero correcto de conglomerados esperados (k)?
Se presentaran diferentes metodos en el capitulo “estadisticas de evaluacion y validacion de conglomerados”
Aquí ofrecemos una solucion sencilla. La idea es calcular la agrupacion de k-medias utilizando diferentes valores de agrupaciones k. A continuación, se dibuja el wss (dentro de la suma de los cuadrados) segun el numero de grupos. La ubicacion de una curva (rodilla) en la parcela generalmente se considera un indicador del numero apropiado de conglomerados.
La funcion R fviz_nbclust() [en el paquete factoextra] proporciona una solucion conveniente para estimar el numero optimo de clusteres.
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
El grafico de arriba representa la varianza dentro de los grupos. Disminuye a medida que k aumenta, pero se puede ver una curvatura (o “codo”) en k=4. Esta curvatura indica que los grupos adicionales mas alla del cuarto tienen poco valor. En la siguiente sección, clasificaremos las observaciones en 4 racimos.
#4.3.4 Calculo del agrupamiento de k-medias Como el algoritmo de agrupamiento de k-medias comienza con k centroides seleccionados aleatoriamente, siempre se recomiendo usar la funicon set.seed() para establecer una semilla para el algoritmo aleatorio de R generador de numeros. El objetivo de hacer reproducibles los resultados, de modo que el lector de este artículo obtenga exactamente los mismos resultados que los que se muestran a continuación.
El sgte codigo R realiza agrupacion de k-medias con k = 4.
set.seed(13)
km.res <- kmeans(df, 4, nstart = 25)
Como el resultado final del resultado de agrupamiento de k-medias 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 aquel que tenga el mas bajo dentro del grupo. El valor predeterminado de nstar en R es 1. Sin emabrago, se recomienda encarecidamente calcular la agrupacion de k-medias 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 16, 13, 13, 8
##
## Cluster means:
## Murder Assault UrbanPop Rape
## 1 -0.4894375 -0.3826001 0.5758298 -0.26165379
## 2 0.6950701 1.0394414 0.7226370 1.27693964
## 3 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 4 1.4118898 0.8743346 -0.8145211 0.01927104
##
## Clustering vector:
## Alabama Alaska Arizona Arkansas California
## 4 2 2 4 2
## Colorado Connecticut Delaware Florida Georgia
## 2 1 1 2 4
## Hawaii Idaho Illinois Indiana Iowa
## 1 3 2 1 3
## Kansas Kentucky Louisiana Maine Maryland
## 1 3 4 3 2
## Massachusetts Michigan Minnesota Mississippi Missouri
## 1 2 3 4 2
## Montana Nebraska Nevada New Hampshire New Jersey
## 3 3 2 3 1
## New Mexico New York North Carolina North Dakota Ohio
## 2 2 4 3 1
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 1 1 1 1 4
## South Dakota Tennessee Texas Utah Vermont
## 3 4 2 1 3
## Virginia Washington West Virginia Wisconsin Wyoming
## 1 1 3 3 1
##
## Within cluster sum of squares by cluster:
## [1] 16.212213 19.922437 11.952463 8.316061
## (between_SS / total_SS = 71.2 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Es posible computar el significado de las multiples mariables que fueron usadas para utilizar los datos originales en grupos:
aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
## cluster Murder Assault UrbanPop Rape
## 1 1 5.65625 138.87500 73.87500 18.78125
## 2 2 10.81538 257.38462 76.00000 33.19231
## 3 3 3.60000 78.53846 52.07692 12.17692
## 4 4 13.93750 243.62500 53.75000 21.41250
Si tu quieres añadir un punto sobre las clasificaciones de los datos originales, usa:
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
## Murder Assault UrbanPop Rape cluster
## Alabama 13.2 236 58 21.2 4
## Alaska 10.0 263 48 44.5 2
## Arizona 8.1 294 80 31.0 2
## Arkansas 8.8 190 50 19.5 4
## California 9.0 276 91 40.6 2
## Colorado 7.9 204 78 38.7 2
##4.3.5 Accediendo a los resultados de la funcion kmeans () La función kmeans () devuelve una lista de competentes, que incluye: - cluster: Un vector de numeros enteros (de 1:k) que indica el cluster al que se le asigna cada punto - centros: una matriz de centros de conglomerados (medias de conglomerados) - totss: la suma total de cuadrados (TSS), es decir, TSS, mide varianza total en los datos. - insidess: vector de suma de cuadrados dentro del grupo, un componente por grupo - tot.withinss: suma total de cuadrados dentro del grupo, es decir, sum(withinss) - Betweenss: suma de cuadrados entre grupos, es decir, totss - tot.withinss - Tamaño: el numero de observaciones en cada grupo
Se puede acceder a estos componentes de la sgte manera:
km.res$cluster
## Alabama Alaska Arizona Arkansas California
## 4 2 2 4 2
## Colorado Connecticut Delaware Florida Georgia
## 2 1 1 2 4
## Hawaii Idaho Illinois Indiana Iowa
## 1 3 2 1 3
## Kansas Kentucky Louisiana Maine Maryland
## 1 3 4 3 2
## Massachusetts Michigan Minnesota Mississippi Missouri
## 1 2 3 4 2
## Montana Nebraska Nevada New Hampshire New Jersey
## 3 3 2 3 1
## New Mexico New York North Carolina North Dakota Ohio
## 2 2 4 3 1
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 1 1 1 1 4
## South Dakota Tennessee Texas Utah Vermont
## 3 4 2 1 3
## Virginia Washington West Virginia Wisconsin Wyoming
## 1 1 3 3 1
head(km.res$cluster, 4)
## Alabama Alaska Arizona Arkansas
## 4 2 2 4
km.res$size
## [1] 16 13 13 8
km.res$centers
## Murder Assault UrbanPop Rape
## 1 -0.4894375 -0.3826001 0.5758298 -0.26165379
## 2 0.6950701 1.0394414 0.7226370 1.27693964
## 3 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 4 1.4118898 0.8743346 -0.8145211 0.01927104
#4.3.6 Visualizacion de grupos de k-medias Es una buena idea de trazar los resultados del grupo. Estos se pueden utilizar para evaluar la eleccion del numero de conglomerados, así como para comparar dos analisis de conglomerados diferentes.
Ahora, queremos visualizar los datos en un diagrama de dispersión coloreando cada punto de datos de acuerdo con su signacion de grupo.
El probema es que los datos contienen mas de 2 variables y la pregunta es que variables elegir para el diagrama de dispersion xy.
Una solucion es reducir el numero de dimensiones aplicando un algoritmo de reduccion de dimensionalidad, como el analisis de componentes principales (PCA), que opera en las cuatro variables y genera dos nuevas variables (que representan las variables originales) que puede usar para hacer el trama.
La funcion fviz_cluster() [paquete factoextra] se puede utilizar para visualizar facilmente grupos de k-medias. Toma los resultados de k-medias y los datos originales como argumentos. En el grafico resultante, las observaciones se representan mediante puntos, utilizando componentes principales si el numero de variables es mayor que 2. Tambien es posible dibujar una elipse de concentración alrededor de cada grupo.
fviz_cluster(km.res, data = df,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid",
start.plot = TRUE,
#repel = TRUE,
ggtheme = theme_minimal()
)
#4.4 K-means ventajas y desventakas del clustering La agrupacion de
k-means es un algoritmo muy simple y rapido. Puede manejar
eficientemente conjuntos de datos muy grandes.
#4.5 Alternativa a la agrupacion k-means Una alterntiva solida a k-means es PAM, que se basa en medoides. Como se analiza en el siguiente capitulo, la agrupacion en clústeres de PAM se puede calcular utilizando la funcion pam() [paquete de clusteres]. La funcion pamk() [paquete fpc] es un contenedor para PAM que tambien imprime el numero sugerido de grupos en funcio del ancho promedio óptimo de la silueta.
##CAPITULO 5
El algoritmo k-medoids es un enfoque de agrupamiento relacionado con el agrupamiento de k-means (capitulo 4) para dividir un conjunto de datos en k grupos o clusters. En la agrupacion de k-medoides, cada grupo está representado por uno de los puntos de datos del grupo. Estos puntos se denominan medoides del cúmulo.
El termino medodide se refiere a un objeto dentro de un grupo para el cual la disimilitud promedio entre el y todos demas miembros del grupo es minima. Corresponde al punto más centrico del cluster. Estos objetos (uno por grupo) pueden considerarse como un ejemplo representativo de los miembros de ese grupo que puede resultar útil en algunas situaciones. Recuerde que, en la agrupacion de k-medias, el centro de un grupo determinado se calcula como el valor medio de todos los puntos de datos del grupo.
K-medoid es un alternativa solida a la agrupacion de k-medias. Esto significa que el algoritmo es menos sensible al ruido y a los valores atípicos, en comparación con las k-medias, porque utiliza medoides como centros de grupo en lugar de medias (usadas en k-medias).
El algoritmo k-medoids requiere que el usuario especifique k, el numeo de clusters que se generarán (como en el clustering k-means). Un enfoque util para determinar el numero optimo de conglomerados es el metodo silueta, que se describe en las sgtes secciones.
El metodo de agrupacion de k-medoides mas comun es el algoritmo PAM (Partitioning Around Medoids, Kaufam & Rousseeuw, 1990).
##5.1 Concepto PAM El uso de medias implica que la agrupacion de k-medias es muy sensible a los valores atípicos. Esto puede afectar gravemente la asignacion de observaciones a los conglomerados. El algoritmo PAM proporciona un algoritmo más robusto.
##5.2 Algoritmo PAM El algoritmo PAM se basa en la búsqueda de k objetos representativos o medoides entre las observaciones de los datos sct. Despues de encontrar un conjunto de k medoides, se construyen grupos asignando cada observación al medoide más cercano. A continuacion, se intercambian cada medoide m seleccionado y cada punto de datos que no es medoide y se calcula la función objetivo. L función objetivo corresponde a la suma de las diferencias de todos los objetivos con respecto a su medoide más cercano. El paso SWAP intenta mejorar la calidad de la agrupacion intercambiando objetos seleccionados (medoides) y objetos no seleccionados. Si la funcion objetivo se puede reducir intercambiando un objeto seleccionado con un objeto no seleccionado, entonces se lleva a cabo el intercambio. Esto se continúa hasta que ya no se puede disminuir la funcion objetivo. El objetivo es encontrar k objetos representativos que minimicen la suma de las diferencias de las observaciones con su objetivo representativo más cercano.
##5.3 Computando PAM en R #5.3.1 Datos
Usaremos los conjuntos de datos de demostración “USArrests”, que comenzamos escalando (Capitulo 2) usando ña funcion R.scale () de la sgte manera:
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
#5.3.2 Funciones y paquetes de R necesarios La funciones pam() y pamk() se pueden utilizar para calcular PAM. La funcion pamk() no requiere que un usuario decida el numero de grupos K. En los sgtes ejemplos, describiremos solo la funicon pam(), cuyo formato simplificado es:
#PAM(x, k, metric = "euclidean", stand = FALSE) #no aparece como paquete en esa version de R
x: los valores posibles incluyen:
Matriz de datos numericos o marco de datos numericos: cada fila corresponde a una observacion y cada columna corresponde a una variable.
Matriz de dismilitud: en este caso, x suele ser la salida de daisy() o dist()
k: el numero de grupos
Metrica: las metricas de distancia que se utilizarán. Las opciones disponibles son “cuclidcan” y “manhattan”.
Soporte: valor logico; si es verdad, las variables (columnas) en x son estandarizadas antes de calcular las diferencias. Se ignora cuando x es una matriz de dismilitud.
Para crear un grafico de los clusters generados con la funcion pam(), usaremos el sgte comando:
library(cluster)
library(factoextra)
#5.3.3 Estimacion del numero optimo de conglomerados Para estimar el numero d¿optimo de grupos, utilizaremos el metodo de silueta promedio. La idea es calcular el algoritmo PAM utilizando diferentes valores de grupos k. A continuacion, se dibuja la silueta promedio de los conglomerados segun el numero de conglomerados. La silueta media mide la calidad de un agrupamiento. Un ancho de la silueta promedio alto indica un buen agrupamiento. El numero optimo de conglomerados k es aquel que maximiza la silueta promedio en un rango de valores posibles para k.
La funcion R fviz_nbclus() proporciona una solucion conveniente para estimar el numero optimo de clústeres.
fviz_nbclust(df, pam, method = "silhouette") +
theme_classic()
#5.3.4 Computando PAM clustering
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"
Ahora, si quieres usar los puntos clasificados con los datos originales, usa lo stge:
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
#5.3.5 Accediendo a los resultados de la funcion pam()
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
#5.3.6 Visualizando PAM clusters
fviz_cluster(pam.res,
palette= c("#00AFBB", "#FC4E07"),
ellipse.type = "t",
#repel = TRUE,
ggtheme = theme_classic()
)