Algoritmos de agrupación en clústeres: agrupación jerárquica

Introducción a la agrupación jerárquica

El agrupamiento jerárquico es otro algoritmo de aprendizaje no supervisado que se utiliza para agrupar los puntos de datos no etiquetados que tienen características similares. Los algoritmos de agrupamiento jerárquico se dividen en las siguientes dos categorías:

Agglomerative hierarchical algorithms- En los algoritmos jerárquicos de aglomeración, cada punto de datos se trata como un solo grupo y luego se fusionan o aglomeran sucesivamente (enfoque de abajo hacia arriba) los pares de grupos. La jerarquía de los grupos se representa como un dendrograma o estructura de árbol.

Divisive hierarchical algorithms - Por otro lado, en los algoritmos jerárquicos divisivos, todos los puntos de datos se tratan como un gran grupo y el proceso de agrupación implica dividir (enfoque de arriba hacia abajo) el gran grupo en varios grupos pequeños.

Pasos para realizar agrupaciones jerárquicas aglomerativas

Vamos a explicar el agrupamiento jerárquico más utilizado e importante, es decir, el aglomerativo. Los pasos para realizar el mismo son los siguientes:

  • Step 1- Trate cada punto de datos como un solo grupo. Por lo tanto, tendremos, digamos, K grupos al principio. El número de puntos de datos también será K al inicio.

  • Step 2- Ahora, en este paso necesitamos formar un gran clúster uniendo dos puntos de datos de armario. Esto resultará en un total de grupos K-1.

  • Step 3- Ahora, para formar más grupos, necesitamos unir dos grupos de clústeres. Esto resultará en un total de grupos K-2.

  • Step 4 - Ahora, para formar un gran grupo, repita los tres pasos anteriores hasta que K se convierta en 0, es decir, no queden más puntos de datos para unir.

  • Step 5 - Por último, después de hacer un solo gran grupo, los dendrogramas se usarán para dividir en múltiples grupos según el problema.

Papel de los dendrogramas en la agrupación jerárquica aglomerativa

Como comentamos en el último paso, el papel del dendrograma comienza una vez que se forma el gran grupo. Dendrogram se utilizará para dividir los grupos en múltiples grupos de puntos de datos relacionados, dependiendo de nuestro problema. Se puede entender con la ayuda del siguiente ejemplo:

Ejemplo 1

Para entender, comencemos por importar las bibliotecas requeridas de la siguiente manera:

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

A continuación, trazaremos los puntos de datos que hemos tomado para este ejemplo:

X = np.array([[7,8],[12,20],[17,19],[26,15],[32,37],[87,75],[73,85], [62,80],[73,60],[87,96],])
labels = range(1, 11)
plt.figure(figsize=(10, 7))
plt.subplots_adjust(bottom=0.1)
plt.scatter(X[:,0],X[:,1], label='True Position')
for label, x, y in zip(labels, X[:, 0], X[:, 1]):
   plt.annotate(label,xy=(x, y), xytext=(-3, 3),textcoords='offset points', ha='right', va='bottom')
plt.show()

En el diagrama anterior, es muy fácil ver que tenemos dos grupos en puntos de datos, pero en los datos del mundo real, puede haber miles de grupos. A continuación, trazaremos los dendrogramas de nuestros puntos de datos utilizando la biblioteca Scipy:

from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt
linked = linkage(X, 'single')
labelList = range(1, 11)
plt.figure(figsize=(10, 7))
dendrogram(linked, orientation='top',labels=labelList, distance_sort='descending',show_leaf_counts=True)
plt.show()

Ahora, una vez que se forma el gran grupo, se selecciona la distancia vertical más larga. Luego se traza una línea vertical a través de él como se muestra en el siguiente diagrama. Cuando la línea horizontal cruza la línea azul en dos puntos, el número de grupos sería dos.

A continuación, necesitamos importar la clase para la agrupación en clústeres y llamar a su método fit_predict para predecir el clúster. Estamos importando la clase AgglomerativeClustering de la biblioteca sklearn.cluster -

from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
cluster.fit_predict(X)

A continuación, trace el clúster con la ayuda del siguiente código:

plt.scatter(X[:,0],X[:,1], c=cluster.labels_, cmap='rainbow')

El diagrama anterior muestra los dos grupos de nuestros puntos de datos.

Ejemplo 2

Como entendimos el concepto de dendrogramas a partir del ejemplo simple discutido anteriormente, pasemos a otro ejemplo en el que estamos creando grupos del punto de datos en Pima Indian Diabetes Dataset mediante el uso de agrupaciones jerárquicas:

import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
import numpy as np
from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
data.shape
(768, 9)
data.head()
Si. No. preg Plas Pres piel prueba masa pedi años clase
0 6 148 72 35 0 33,6 0,627 50 1
1 1 85 66 29 0 26,6 0.351 31 0
2 8 183 64 0 0 23,3 0,672 32 1
3 1 89 66 23 94 28,1 0,167 21 0
4 0 137 40 35 168 43,1 2.288 33 1
patient_data = data.iloc[:, 3:5].values
import scipy.cluster.hierarchy as shc
plt.figure(figsize=(10, 7))
plt.title("Patient Dendograms")
dend = shc.dendrogram(shc.linkage(data, method='ward'))
from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
cluster.fit_predict(patient_data)
plt.figure(figsize=(10, 7))
plt.scatter(patient_data[:,0], patient_data[:,1], c=cluster.labels_, cmap='rainbow')