El agrupamiento jerarquico
Introducción al agrupamiento jerarquico
El agrupamiento jerarquico es una técnica de aprendizaje no supervisado que organiza los datos en una estructura de árbol, también conocida como dendrograma. Este método permite identificar clústeres anidados dentro de otros clústeres, formando una jerarquía que representa la relación entre los datos. Es ideal para visualizar cómo se agrupan los elementos y descubrir estructuras ocultas en grandes volúmenes de información.

Tipos de agrupamiento jerarquico
El agrupamiento jerárquico se divide en dos enfoques principales:
-
Divisivo: consiste en dividir iterativamente todo el conjunto de muestras en clústeres, separando cada grupo en subgrupos más pequeños hasta que cada uno contenga solo una muestra.
-
Aglomerativo: funciona de manera opuesta; se inicia considerando cada muestra como un grupo independiente y se van fusionando los grupos más cercanos hasta formar un único clúster.
Como funciona el agrupamiento jerárquico y que tipos de algoritmos existen
El agrupamiento jerárquico es una técnica de aprendizaje no supervisado que organiza los datos de forma progresiva. Comienza considerando cada muestra como un grupo individual, y luego fusiona los grupos más cercanos entre sí hasta formar un único clúster.
Dentro del agrupamiento jerárquico aglomerativo, los principales algoritmos son:
-
Enlace simple: agrupa los elementos más similares o cercanos entre sí, utilizando la distancia mínima entre clústeres.
-
Enlace completo: se basa en agrupar los miembros más disímiles, empleando la distancia máxima entre elementos de distintos grupos.
Como implementarlo en Phyton
Primer ejemplo sin usar la Liberia de KMeans
El siguiente código en Python crea y visualiza un conjunto de datos artificiales ya etiquetados en tres clústeres distintos, utilizando colores diferentes para representar cada grupo en un gráfico de dispersión (scatter plot). A continuación, se explican brevemente sus partes principales:
-
getDatos(): genera un array NumPy con 13 puntos bidimensionales (X, Y), donde la tercera columna representa la etiqueta de clúster (0, 1 o 2). -
pintarDatos(X): representa gráficamente los puntos del arrayX, separando visualmente los clústeres por color (rojo, verde y azul), con etiquetas y leyenda. -
Propósito: ilustrar la distribución visual de tres grupos de datos previamente clasificados, ideal como ejemplo introductorio en tareas de clustering o visualización de agrupamientos.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
def getDatos():
X = np.array([[1.0, 1.0, 0],
[2.0, 1.0, 0],
[1.5, 2.0, 0],
[2.5, 1.0, 0],
[2.2, 2.0, 0],
[2.0, 3.0, 0],
[4.0, 4.0, 1],
[3.5, 4.0, 1],
[3.5, 6.0, 1],
[6.0, 2.0, 2],
[7.0, 2.5, 2 ],
[6.0, 4.0, 2],
[7.5, 1.5, 2]
])
return X
def pintarDatos(X):
plt.scatter(X[X[:,2] == 0, 0],
X[X[:,2] == 0, 1],
s=50, c='red',
marker='o', edgecolor='red',
label='cluster 0')
plt.scatter(X[X[:,2] == 1, 0],
X[X[:,2] == 1, 1],
s=50, c='green',
marker='o', edgecolor='green',
label='cluster 1')
plt.scatter(X[X[:,2] == 2, 0],
X[X[:,2] == 2, 1],
s=50, c='blue',
marker='o', edgecolor='blue',
label='cluster 2')
# Mostrar el gráfico
plt.xlim(0, 8)
plt.ylim(0, 7)
plt.xlabel('Coordenada X')
plt.ylabel('Coordenada Y')
plt.legend()
plt.tight_layout()
plt.legend(scatterpoints=1)
plt.show()
X = getDatos()
pintarDatos(X)

Segundo ejemplo usando la Liberia de KMeans
El siguiente codigo en Python realiza agrupamiento no supervisado (clustering) utilizando el algoritmo KMeans del paquete scikit-learn. Los pasos clave del código son:
-
Importación de librerías necesarias para manejo de arrays, visualización y clustering.
-
Generación de datos (
getDatos): Se crean 13 muestras bidimensionales sin etiquetas predefinidas. -
Entrenamiento del modelo: Se usa
KMeans(n_clusters=3)para identificar 3 grupos diferentes en los datos. -
Predicción de etiquetas (
modelo.labels_) para asignar cada punto a un clúster. -
Visualización de los resultados con
matplotlibmediante colores diferenciados por clúster.
⚠️ Nota técnica (muy importante)
Si el código lanza un error como:
es probable que se deba a una incompatibilidad o configuración de librerías internas de hilos paralelos como OpenBLAS o MKL.
✅ Para solucionarlo, instala o actualiza el paquete threadpoolctl, ejecutando en tu terminal de Visual Studio Code:
Esto garantiza una correcta gestión de los hilos durante el entrenamiento del modelo, especialmente en entornos Windows o con múltiples bibliotecas numéricas instaladas.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# Generar datos sin etiquetas predefinidas
def getDatos():
X = np.array([[1.0, 1.0],
[2.0, 1.0],
[1.5, 2.0],
[2.5, 1.0],
[2.2, 2.0],
[2.0, 3.0],
[4.0, 4.0],
[3.5, 4.0],
[3.5, 6.0],
[6.0, 2.0],
[7.0, 2.5],
[6.0, 4.0],
[7.5, 1.5]])
return X
# Pintar los clústeres predichos
def pintarDatos(X, etiquetas):
colores = ['red', 'green', 'blue']
for i in range(3):
plt.scatter(X[etiquetas == i, 0],
X[etiquetas == i, 1],
s=50, c=colores[i],
label=f'Cluster ', edgecolor=colores[i])
plt.xlim(0, 8)
plt.ylim(0, 7)
plt.xlabel('Coordenada X')
plt.ylabel('Coordenada Y')
plt.legend()
plt.tight_layout()
plt.show()
# Proceso principal
X = getDatos()
print(X)
modelo = KMeans(n_clusters=3, random_state=42)
modelo.fit(X)
etiquetas = modelo.labels_
pintarDatos(X, etiquetas)




