El agrupamiento jerárquico es un método de aprendizaje no supervisado para agrupar puntos de datos. El algoritmo crea grupos midiendo las diferencias entre los datos. El aprendizaje no supervisado significa que no es necesario entrenar un modelo y no necesitamos una variable «objetivo». Este método se puede utilizar en cualquier dato para visualizar e interpretar la relación entre puntos de datos individuales.
Aquí usaremos el agrupamiento jerárquico para agrupar puntos de datos y visualizar los clústeres mediante un dendrograma y un diagrama de dispersión.
¿Como funciona?
Usaremos Agglomerative Clustering, un tipo de clustering jerárquico que sigue un enfoque de abajo hacia arriba. Comenzamos tratando cada punto de datos como su propio grupo. Luego, unimos los grupos que tienen la distancia más corta entre ellos para crear grupos más grandes. Este paso se repite hasta que se forma un grupo grande que contiene todos los puntos de datos.
El agrupamiento jerárquico requiere que decidamos sobre un método tanto de distancia como de vinculación. Usaremos la distancia euclidiana y el método de vinculación de Ward, que intenta minimizar la varianza entre los conglomerados.
Ejemplo:
Comience visualizando algunos puntos de datos:
import numpy as np import matplotlib.pyplot as plt x = [4,5,10,4,3,11,14,6,10,12] y = [21,19,24,17,16,25,24,22,21,21] plt.scatter(x, y) plt.show()
Ahora calculamos el vínculo de barrio usando la distancia euclidiana y lo visualizamos usando un dendrograma:
Ejemplo
import numpy as np import matplotlib.pyplot as plt from scipy.cluster.hierarchy import dendrogram, linkage x = [4,5,10,4,3,11,14,6,10,12] y = [21,19,24,17,16,25,24,22,21,21] data = list(zip(x, y)) linkage_data = linkage(data, method='ward', metric='euclidean') dendrogram(linkage_data) plt.show()
Aquí, hacemos lo mismo con la biblioteca scikit-learn de Python. Luego, visualice en una gráfica de 2 dimensiones:
import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import AgglomerativeClustering x = [4,5,10,4,3,11,14,6,10,12] y = [21,19,24,17,16,25,24,22,21,21] data = list(zip(x, y)) hierarchical_cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward') labels = hierarchical_cluster.fit_predict(data) plt.scatter(x, y, c=labels) plt.show()
Ejemplo explicado
Importa los módulos que necesites.
import numpy as np import matplotlib.pyplot as plt from scipy.cluster.hierarchy import dendrogram, linkage from sklearn.cluster import AgglomerativeClustering
Puede obtener información sobre el módulo Matplotlib en nuestro «Tutorial de Matplotlib.
Puede obtener información sobre el módulo SciPy en nuestro tutorial de SciPy.
NumPy es una biblioteca para trabajar con arreglos y matrices en Python, puede obtener información sobre el módulo NumPy en nuestro Tutorial de NumPy.
scikit-learn es una biblioteca popular para el aprendizaje automático.
Cree matrices que se parezcan a dos variables en un conjunto de datos. Tenga en cuenta que si bien solo tenemos dos variables aquí, este método funcionará con cualquier cantidad de variables:
x = [4,5,10,4,3,11,14,6,10,12] y = [21,19,24,17,16,25,24,22,21,21]
Convierta los datos en un conjunto de puntos:
data = list(zip(x, y)) print(data)
Resultado
[(4,21),(5,19),(10,24),(4,17),(3,16),(11,25),(14,24),(6,22),(10,21),(12,21)]
Calcule el vínculo entre todos los puntos diferentes. Aquí usamos una medida de distancia euclidiana simple y el enlace de Ward, que busca minimizar la varianza entre grupos.
linkage_data = linkage(data, method='ward', metric='euclidean')
Finalmente, grafique los resultados en un dendrograma. Este gráfico nos mostrará la jerarquía de grupos desde abajo (puntos individuales) hasta arriba (un solo grupo que consta de todos los puntos de datos).
plt.show() nos permite visualizar el dendrograma en lugar de solo los datos de vinculación sin procesar.
dendrogram(linkage_data) plt.show()
La biblioteca scikit-learn nos permite usar la agrupación jerárquica de una manera diferente. Primero, inicializamos la clase AgglomerativeClustering con 2 clústeres, usando la misma distancia euclidiana y enlace Ward.
hierarchical_cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
Se puede llamar al método .fit_predict en nuestros datos para calcular los clústeres utilizando los parámetros definidos en el número de clústeres elegido.
labels = hierarchical_cluster.fit_predict(data) print(labels)
Resultado:
[0 0 1 0 0 1 1 0 1 1]
Finalmente, si graficamos los mismos datos y coloreamos los puntos usando las etiquetas asignadas a cada índice por el método de agrupación jerárquica, podemos ver el grupo al que se asignó cada punto:
plt.scatter(x, y, c=labels) plt.show()