El clustering jerárquico es una técnica de análisis de datos que busca construir una jerarquía de clusters. A diferencia de otros algoritmos de clustering como k-means, no requiere especificar el número de clusters por adelantado. En cambio, construye una estructura jerárquica que permite explorar los datos a diferentes niveles de granularidad.
Este método es especialmente útil cuando no se tiene un conocimiento previo sobre la estructura de los datos o cuando se desea visualizar las relaciones entre los clusters a diferentes escalas. En este artículo, exploraremos cómo funciona el clustering jerárquico, cómo interpretar los dendrogramas resultantes, sus ventajas y desventajas, y cómo implementarlo en Python.
Introducción al clustering jerárquico
El clustering jerárquico se basa en la idea de construir una jerarquía de clusters, ya sea de manera aglomerativa (ascendente) o divisiva (descendente).
Aglomerativo:
Este enfoque, también conocido como bottom-up, comienza considerando cada punto de datos como un cluster individual. Luego, en cada paso, fusiona los dos clusters más cercanos hasta que todos los puntos pertenezcan a un solo cluster o se cumpla un criterio de parada. Los algoritmos aglomerativos más comunes son:
- Enlace simple (Single Linkage): La distancia entre dos clusters se define como la distancia mínima entre cualquier par de puntos en los dos clusters.
- Enlace completo (Complete Linkage): La distancia entre dos clusters se define como la distancia máxima entre cualquier par de puntos en los dos clusters.
- Enlace promedio (Average Linkage): La distancia entre dos clusters se define como la distancia promedio de las distancias entre todos los pares de puntos en los dos clusters.
- Enlace centroide (Centroid Linkage): La distancia entre dos clusters se define como la distancia entre los centroides de los dos clusters.
- Enlace de Ward (Ward’s Linkage): Minimiza la varianza dentro de los clusters que se fusionan. Es decir, busca fusionar clusters que aumenten lo menos posible la varianza total dentro de los clusters.
Divisivo:
El enfoque divisivo, también conocido como top-down, comienza con todos los puntos de datos en un solo cluster y, en cada paso, divide el cluster más grande en clusters más pequeños hasta que cada punto sea un cluster individual o se cumpla un criterio de parada. Un ejemplo de algoritmo divisivo es el algoritmo DIANA (Divisive Analysis Clustering).
La elección del método de enlace (linkage method) es crucial ya que afecta la forma de los clusters resultantes. Por ejemplo, el enlace simple tiende a producir clusters alargados, mientras que el enlace completo tiende a producir clusters más compactos. El enlace de Ward es generalmente preferido cuando se busca clusters de tamaño similar y forma esférica.
Dendrogramas y su interpretación
Un dendrograma es un diagrama de árbol que representa la jerarquía de clusters generada por el clustering jerárquico. El eje vertical representa la distancia o similitud entre los clusters, mientras que el eje horizontal representa los puntos de datos o clusters.
Interpretación:
- Altura de las uniones: La altura a la que se unen dos clusters en el dendrograma indica la distancia entre ellos. Las uniones a menor altura indican que los clusters son más similares.
- Número de clusters: Cortar el dendrograma a una altura específica determina el número de clusters. Por ejemplo, si cortamos el dendrograma a una altura donde hay dos ramas principales, obtendremos dos clusters.
- Estructura de los clusters: El dendrograma muestra cómo se fusionan los clusters a medida que aumenta la distancia. Esto permite identificar la estructura jerárquica de los datos y las relaciones entre los clusters.
Para entender mejor la estructura, considera el siguiente ejemplo visual:
[Aquí debería ir una imagen de un dendrograma explicando sus partes]
Analizando el dendrograma, podemos determinar la cantidad óptima de clusters observando dónde hay mayores saltos en la altura de las uniones. Estos saltos indican que la fusión de clusters a esa altura implicaría una pérdida significativa de similitud.
Ventajas y desventajas
Ventajas:
- No requiere especificar el número de clusters: A diferencia de k-means, el clustering jerárquico no necesita que se defina el número de clusters por adelantado.
- Proporciona una jerarquía de clusters: Permite explorar los datos a diferentes niveles de granularidad.
- Visualización con dendrogramas: Facilita la interpretación de la estructura de los datos.
- Aplicable a diversas formas de datos: No asume una forma específica de los clusters.
Desventajas:
- Coste computacional: Puede ser costoso computacionalmente para grandes conjuntos de datos, especialmente el método aglomerativo. Su complejidad es O(n^3) en la mayoría de las implementaciones.
- Sensibilidad al ruido y outliers: Puede ser sensible al ruido y a los outliers, lo que puede afectar la estructura de los clusters.
- Dificultad para manejar datos de alta dimensionalidad: Al igual que otros algoritmos de clustering basados en distancia, puede sufrir la maldición de la dimensionalidad.
- Irreversibilidad: Una vez que se toma la decisión de unir dos clusters, no se puede deshacer, lo que puede llevar a errores en la estructura final.
Ejemplo en Python
A continuación, mostramos un ejemplo de cómo implementar el clustering jerárquico en Python utilizando la librería scikit-learn
.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram
# Generar datos de ejemplo
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
# Función para dibujar el dendrograma
def plot_dendrogram(model, **kwargs):
# Crear matriz de conteo de hijos y distancias
counts = np.zeros(model.children_.shape[0])
n_samples = len(model.labels_)
for i, merge in enumerate(model.children_):
current_count = 0
for child_idx in merge:
if child_idx < n_samples:
current_count += 1 # nodo hoja
else:
current_count += counts[child_idx - n_samples]
counts[i] = current_count
linkage_matrix = np.column_stack([
model.children_,
model.distances_,
counts
]).astype(float)
# Dibujar el dendrograma
dendrogram(linkage_matrix, **kwargs)
# Aplicar clustering jerárquico aglomerativo
model = AgglomerativeClustering(distance_threshold=0, n_clusters=None, linkage='ward')
model = model.fit(X)
# Dibujar el dendrograma
plt.title('Dendrograma de Clustering Jerárquico')
plot_dendrogram(model, truncate_mode='level', p=3)
plt.xlabel("Número de puntos en el nodo (o índice del punto si no hay paréntesis).")
plt.show()
# Imprimir las etiquetas de los clusters
print("Etiquetas de los clusters:", model.labels_)
Este código genera datos de ejemplo, aplica el clustering jerárquico aglomerativo utilizando el enlace de Ward, y dibuja el dendrograma. El parámetro distance_threshold=0
y n_clusters=None
asegura que el algoritmo construya el dendrograma completo. Luego, se imprime las etiquetas de los clusters asignados a cada punto de datos.
Para interpretar el dendrograma, observa la altura a la que las ramas se unen. Cortar el dendrograma a una altura dada determinará el número de clusters resultantes. En este ejemplo, puedes experimentar cortando el dendrograma a diferentes alturas para obtener diferentes agrupaciones.
El clustering jerárquico es una herramienta poderosa para el análisis de datos, especialmente cuando no se conoce el número de clusters por adelantado. Su capacidad para construir una jerarquía de clusters y visualizarla mediante dendrogramas facilita la interpretación de la estructura de los datos.
Aunque tiene desventajas en términos de coste computacional y sensibilidad al ruido, sus ventajas lo convierten en una técnica valiosa en diversas aplicaciones, desde la segmentación de clientes hasta el análisis de datos genómicos. La elección del método de enlace adecuado y una cuidadosa interpretación del dendrograma son clave para obtener resultados significativos.
Espero que este artículo te haya proporcionado una comprensión clara de cómo funciona el clustering jerárquico y cuándo es apropiado utilizarlo. ¡Anímate a experimentar con diferentes conjuntos de datos y métodos de enlace para descubrir patrones ocultos y obtener información valiosa!