Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

El agrupamiento (clustering) es una forma de clasificación no supervisada: el algoritmo descubre la estructura de los datos a partir de las características (variables explicativas) únicamente, sin etiquetas. La meta es agrupar las observaciones en subgrupos coherentes.

Que un grupo sea coherente depende de la distancia entre los puntos de datos. La métrica de distancia cuantifica qué tan similares o disímiles son dos puntos de datos, y todo algoritmo de agrupamiento depende de una.

Este tutorial no cubre todos los métodos de agrupamiento posibles. Ningún método de agrupamiento funciona mejor en todos los escenarios; la elección correcta depende fuertemente de la estructura inherente de los datos. Un resumen simple, con ejemplos de juguete de estructuras de datos en 2D, está disponible en el paquete sklearn.

Esta lección se centra en conceptos fundamentales relevantes para las geociencias: 1) la definición de distancia, ilustrada con el algoritmo de agrupamiento más popular, 2) el agrupamiento k-means y 3) el agrupamiento aglomerativo.

1. Distancia

La distancia es la medida básica de disimilitud entre puntos de datos, y los resultados del agrupamiento dependen directamente de la métrica que usted elija. La distancia vuelve más adelante en el curso como el bloque constructivo de las funciones de pérdida y de costo para entrenar modelos de aprendizaje profundo.

Hay varias maneras de estimar y cuantificar la distancia entre puntos de datos. Algunas de las métricas de distancia más usadas son:

  • Distancia euclidiana: es la distancia en línea recta entre dos puntos de datos en un espacio multidimensional. Se usa a menudo cuando las características de los datos tienen unidades o escalas similares. d(x,y)=∑i=1N(xi−yi)2d(\mathbf{x},\mathbf{y}) = \sqrt{ \sum_{i=1}^N (x_i-y_i)^2 }

  • Distancia de Manhattan: también conocida como distancia ‘L1’, mide la suma de las diferencias absolutas entre los elementos correspondientes de dos puntos de datos. Es adecuada cuando el movimiento a lo largo de los ejes está restringido, como en datos sobre mallas. d(x,y)=∑i=1N∣xi−yi∣d(\mathbf{x},\mathbf{y}) = \sum_{i=1}^N |x_i-y_i|

  • Distancia geodésica: la distancia geodésica mide el camino más corto entre dos puntos sobre la superficie de una esfera. Importa para la geografía terrestre, incluida la navegación GPS y las mediciones geodésicas.

  • Distancias basadas en correlación: en el análisis de datos geofísicos y geoespaciales, las métricas de distancia basadas en correlación, como la correlación de Pearson o la correlación de rangos de Spearman, se usan a menudo para evaluar relaciones entre variables.

  • Distancias basadas en covarianza: estas distancias, que toman en cuenta la covarianza espacial o los modelos de variograma, son frecuentes en la geoestadística y el análisis espacial.

  • Similitud coseno: esta métrica calcula el coseno del ángulo entre dos vectores de datos, y provee una medida de su similitud, en particular en espacios de alta dimensión. Se usa con frecuencia para datos de texto o de imágenes.

Scikit-learn contiene las métricas más usadas en el contexto del ML clásico en el paquete metrics.DistanceMetric. Más detalles en esta documentación de scikit-learn.

Relación con PCA El agrupamiento y PCA simplifican los datos mediante un número pequeño de resúmenes. Pero las diferencias son:

  • PCA busca reducir la dimensionalidad de los datos, encontrar una representación de baja dimensión que explique una buena fracción de la varianza de los datos,
  • el agrupamiento busca encontrar grupos homogéneos dentro de las observaciones.

De hecho, es común combinar ambos para datos complejos y de alta dimensión: 1) PCA, 2) agrupamiento sobre las componentes principales.

Hay dos métodos principales de agrupamiento: el agrupamiento k-means y el agrupamiento jerárquico.

La caja de herramientas scikit-learn tiene una colección de algoritmos de agrupamiento y una documentación detallada con tutoriales.

2. Preparación del tutorial

Importar los paquetes de Python útiles.

Datos

Las ediciones anteriores de este capítulo usaban una tabla de citometría de flujo de SeaFlow de 146 MB; la retiramos en 2026 en favor de conjuntos de datos más ligeros.

Nuestro primer conjunto de datos de trabajo es el registro del géiser Old Faithful, en Yellowstone. Cada fila empareja la duración de una erupción (current, en minutos) con la duración de la erupción siguiente (next, en minutos). Lo descargamos con pooch, que guarda el archivo en una caché local.

Loading...
<Figure size 640x480 with 1 Axes>

K-means depende de la distancia euclidiana, así que las características con rangos numéricos mayores dominan el resultado. Aquí ambas columnas están en minutos con rangos similares, pero eso es una coincidencia de este conjunto de datos. Estandarizar cada característica (media cero, varianza uno) es un hábito que conviene conservar para cualquier método basado en distancias — en el ejercicio sísmico del final de este cuaderno, las características abarcan órdenes de magnitud y el escalado no es opcional. Estandarizamos ahora y guardamos el resultado en data_faithful, un arreglo de numpy de 2 columnas.

(271, 2)

3. K-means

K-means (k-medias) es un método de agrupamiento no supervisado. La idea principal es separar los datos en K conglomerados (clusters) distintos. Para los grupos que devuelve un algoritmo, «conglomerado», «grupo» y «clúster» circulan por igual según la comunidad; este cuaderno dice «conglomerado» de forma consistente, y «clúster» queda reservado para la infraestructura de cómputo (capítulo 5). Tenemos entonces dos problemas que resolver. Primero, hay que encontrar los k centroides de los k conglomerados. Luego, hay que asignar cada punto de datos al conglomerado cuyo centroide le queda más cerca.

La meta es particionar nn puntos de datos en kk conglomerados. Cada observación se etiqueta con el conglomerado de media más cercana.

K-means es iterativo:

  1. suponga valores iniciales para la media de cada uno de los kk conglomerados
  2. calcule la distancia de cada observación a cada una de las kk medias
  3. etiquete cada observación como perteneciente a la media más cercana
  4. encuentre el centro de masa (la media) de cada grupo de puntos etiquetados. Estas son las nuevas medias para el paso 1.

En lo que sigue, denotamos nn el número de puntos de datos y pp el número de características de cada punto de datos.

K-means solo funciona con la métrica de distancia euclidiana. De hecho, su concepto central es usar la distancia euclidiana para medir y minimizar la inercia o variación intraconglomerado.

We have 271 data points, and each one has 2 features

Definamos una función para inicializar los centroides de los conglomerados. Elegimos puntos aleatorios dentro del rango de valores que toman los datos.

Para poder asignar cada punto de datos al centroide más cercano, necesitamos definir la distancia entre dos puntos de datos. La distancia más común es la distancia euclidiana:

d(x,y)=∑i=1p(xi−yi)2d(x,y) = \sqrt{\sum_{i = 1}^p (x_i - y_i)^2}

donde xx y yy son dos puntos de observación con pp variables.

Definimos entonces una función para calcular la distancia entre cada punto de datos y cada centroide.

Ahora definimos una función para asignar cada punto de datos al conglomerado cuyo centroide le queda más cerca. También definimos una función objetivo que se minimizará hasta alcanzar la convergencia.

Nuestro objetivo es minimizar la suma de los cuadrados de la distancia entre cada punto y el centroide más cercano:

obj=∑j=1k∑i=1Njd(x(i),x(j))2obj = \sum_{j = 1}^k \sum_{i = 1}^{N_j} d(x^{(i)} , x^{(j)}) ^2

donde x(i)x^{(i)} es el ii-ésimo punto del conglomerado jj, x(j)x^{(j)} es el centroide del conglomerado jj, y NjN_j es el número de puntos del conglomerado jj.

Después de asignar todos los puntos a un conglomerado, calcule la nueva ubicación del centroide. Es simplemente el valor de la media de todos los puntos asignados a ese conglomerado:

Para 1≤j≤k1 \leq j \leq k, xp(j)=1Nj∑i=1Njxp(i)x_p^{(j)} = \frac{1}{N_j} \sum_{i = 1}^{N_j} x_p^{(i)}

Ya podemos programar el algoritmo k-means ensamblando todas estas funciones. Detenemos el cálculo cuando la función objetivo deja de disminuir.

Los datos de Old Faithful muestran dos regímenes — erupciones cortas seguidas de erupciones cortas, y erupciones largas seguidas de erupciones largas —, así que fijamos k = 2 y corremos nuestro k-means hecho desde cero.

<Figure size 640x480 with 1 Axes>

K-means con Scikit-learn

Ahora usamos la implementación de scikit-learn sobre los mismos datos escalados.

Dos valores por defecto que vale la pena conocer: init='k-means++' es el esquema de inicialización por defecto, y desde las versiones recientes de scikit-learn n_init toma por defecto 'auto', que corre varios reinicios de k-means++ y conserva el mejor. Ya no hace falta fijar ninguno de los dos parámetros a mano.

<Figure size 640x480 with 1 Axes>

Consejos prácticos para k-means

  1. ¿Cómo evaluar el éxito del agrupamiento? ¿Qué tan bien separados están los conglomerados? Existen muchas maneras de evaluar la calidad de los conglomerados. Scikit-learn ha resumido y empaquetado estas herramientas en el módulo sklearn.metrics. Vea la documentación aquí. En general, los scores altos son mejores. Aquí un resumen:
    • Si los datos tienen etiquetas verdaderas (ground truth; por ejemplo, los tipos de fuente sísmica del ejercicio de abajo), podemos usar varias métricas:
      • homogeneidad (cada conglomerado contiene solo miembros de una clase dada, metrics.homogeneity_score(clusterID,true_label)), completitud (todos los miembros de una clase dada se asignan al mismo conglomerado, metrics.completeness_score), la medida V (2 x homogeneidad x completitud / (homogeneidad+completitud), metrics.v_measure_score) y las tres juntas metrics.homogeneity_completeness_v_measure(clusterID,true_label).
      • el índice de Fowlkes-Mallows, FMI, que usa TP (verdaderos positivos), FP (falsos positivos) y FN (falsos negativos). Vale 0.0 para una asignación aleatoria de conglomerados y 1.0 para asignaciones de etiquetas perfectas.
    • Si los datos no tienen etiquetas verdaderas, puede usar:
      • el coeficiente de silueta con el módulo metrics.silhouette_score; un score o coeficiente alto es mejor. Cuantifica qué tan compactos son los datos dentro de los conglomerados y qué tan bien separados están los conglomerados. Más detalles sobre la implementación y visualización del score de silueta aquí.
  2. El número de conglomerados kk es un parámetro ajustable. Para encontrar el número óptimo de conglomerados, discutimos abajo algunas estrategias.
  3. La optimización de k-means puede tener mínimos locales. El resultado, por lo tanto, puede diferir según la inicialización de los conglomerados. Se recomienda:
    • repetir la inicialización aleatoria, repetir k-means y usar el mejor conjunto de conglomerados (el que tenga el menor error final)
    • elegir el esquema de inicialización K-means++ con el parámetro de sklearn init='k-means++'. El algoritmo selecciona los centroides iniciales mediante un muestreo basado en una distribución de probabilidad empírica de la contribución de los puntos a la inercia total.
  4. La varianza de algunas características puede afectar los resultados. Puede ser difícil encontrar conglomerados si algunas características de los datos (ejes) son mucho más grandes que otras. Los datos pueden requerir preprocesamiento (centrado y escalado) o preacondicionamiento (por ejemplo, PCA).

Análisis de silueta

El coeficiente de silueta y el score de silueta (silhouette score) son métricas para evaluar la calidad de un agrupamiento en el aprendizaje no supervisado.

  1. Coeficiente de silueta: El coeficiente de silueta de una muestra de datos mide qué tan similar es a su propio conglomerado (cohesión) en comparación con los otros conglomerados (separación). Se calcula para cada muestra de datos y va de -1 a 1. Un coeficiente de silueta alto indica que el objeto está bien emparejado con su propio conglomerado y mal emparejado con los conglomerados vecinos. A la inversa, un coeficiente de silueta bajo sugiere que el objeto puede estar en el conglomerado equivocado.

    La fórmula del coeficiente de silueta (s) para un punto de datos individual es:

    s(i)=b(i)−a(i)max⁡{a(i),b(i)} s(i) = \frac{b(i) - a(i)}{\max\{a(i), b(i)\}} donde:

    • a(i)a(i) es la distancia promedio del ii-ésimo punto de datos a los demás puntos de su mismo conglomerado.
    • b(i)b(i) es la menor distancia promedio del ii-ésimo punto de datos a los puntos de un conglomerado distinto, minimizada sobre los conglomerados.
  2. Score de silueta: El score de silueta es el promedio del coeficiente de silueta sobre todas las muestras de datos del conjunto. Provee una medida global de qué tan bien separados están los conglomerados. El score de silueta también va de -1 a 1: un score alto indica un buen agrupamiento y un score bajo sugiere conglomerados superpuestos o mal clasificados.

    La fórmula del score de silueta es:

S=∑i=1Ns(i)N S = \frac{\sum_{i=1}^{N} s(i)}{N} donde:

  • NN es el número de puntos de datos del conjunto.

Interpretación:

  • Un coeficiente de silueta cercano a 1 indica que el punto de datos está bien emparejado con su propio conglomerado y mal emparejado con los conglomerados vecinos, lo que señala un conglomerado robusto y bien diferenciado.
  • Un coeficiente de silueta cercano a -1 sugiere que el punto de datos posiblemente está mal clasificado, pues empareja mejor con un conglomerado vecino.
  • Un coeficiente de silueta alrededor de 0 indica conglomerados superpuestos.

Para el score de silueta:

  • Un score cercano a 1 implica conglomerados bien definidos.
  • Un score alrededor de 0 sugiere conglomerados superpuestos.
  • Un score negativo indica que la mayoría de los puntos de datos puede estar asignada a los conglomerados equivocados.

En resumen, el análisis de silueta ayuda a seleccionar el número de conglomerados y a evaluar la calidad general de un agrupamiento.

Silhouette score for k = 2: 0.5611599583255005
For n_clusters = 2 The average silhouette_score is : 0.5611599583255005
<Figure size 1800x700 with 2 Axes>

Elección del número de conglomerados: el método del codo

El método del codo está diseñado para encontrar el número óptimo de conglomerados. Consiste en ejecutar el algoritmo de agrupamiento con un número creciente de conglomerados kk, midiendo la distancia promedio entre los puntos de datos y los centroides. Hay dos métricas típicas en el método del codo:

  • Distorsión: se calcula como el promedio de las distancias al cuadrado a los centros de los conglomerados respectivos. Típicamente se usa la métrica de distancia euclidiana.
  • Inercia: es la suma de las distancias al cuadrado de las muestras a su centro de conglomerado más cercano.

Para cada valor de kk, calculamos la media del cuadrado de la distancia entre los puntos de datos y el centroide del conglomerado al que pertenecen. Luego graficamos ese valor en función de kk. Con suerte, disminuye y luego alcanza una meseta. El número óptimo de conglomerados es el valor en el quiebre — el «codo» de la curva.

Ilustramos el método sobre los datos estandarizados de Old Faithful.

Calcule el valor de E para k entre 1 y 8 y grafíquelo. Busque el valor de kk donde la curva se dobla.

<Figure size 400x400 with 1 Axes>

El método del codo no siempre funciona bien. Por ejemplo, vea qué pasa cuando los puntos se acercan entre sí. Como data_faithful está estandarizado y centrado en cero, encogemos los datos hacia el origen.

<Figure size 1800x700 with 2 Axes>

Veamos qué pasa cuando disminuimos el número de datos.

<Figure size 1800x700 with 2 Axes>

Ambas pruebas de estrés muestran los límites del criterio del codo: cuando los conglomerados se acercan entre sí, o cuando los datos se vuelven escasos, la curva pierde su quiebre claro y la elección de kk se vuelve ambigua. Use el método del codo como guía, no como regla, y contrástelo con el score de silueta.

Repetir k-means

El resultado es muy sensible a la ubicación de los centroides iniciales. Repita el agrupamiento N veces y elija el agrupamiento con la mejor función objetivo.

Repita k-means 20 veces con k = 2 y conserve la mejor corrida.

<Figure size 600x600 with 1 Axes>

K-means puede ser un proceso lento de calcular y hay vías para acelerarlo. Una solución es usar k-means por mini-lotes (mini-batch), que toma un subconjunto de los datos en cada iteración para construir los centroides.

4. Agrupamiento jerárquico

En k-means, usamos la distancia euclidiana y prescribimos el número de conglomerados K.

En el agrupamiento jerárquico, elegimos distintas métricas de distancia, visualizamos la estructura de los datos y luego decidimos el número de conglomerados. Hay dos enfoques para construir la jerarquía de conglomerados:

  • Aglomerativo: cada punto comienza en su propio conglomerado. Los datos se fusionan por pares mientras se crea una jerarquía de conglomerados.
  • Divisivo: al inicio, todos los datos están en 1 conglomerado. Los datos se dividen recursivamente en conglomerados cada vez más pequeños.

Hay varios tipos de enlaces (linkages). sklearn tiene documentación detallada, sobre todo para el enfoque aglomerativo. Los distintos métodos de enlace son:

  • Ward minimiza la suma de las diferencias al cuadrado dentro de todos los conglomerados. Es un enfoque de minimización de varianza y, en ese sentido, es similar a la función objetivo de k-means, pero abordado con un enfoque jerárquico aglomerativo.
  • El enlace máximo o completo minimiza la distancia máxima entre observaciones de pares de conglomerados.
  • El enlace promedio minimiza el promedio de las distancias entre todas las observaciones de pares de conglomerados.
  • El enlace simple minimiza la distancia entre las observaciones más cercanas de pares de conglomerados.

Primero importamos los paquetes pertinentes.

Aquí creamos un conjunto de datos ficticio con 2 conglomerados que se entremezclan en unos pocos puntos de datos.

<Figure size 500x500 with 1 Axes>

Combinar estos dos conjuntos de datos en uno.

<Figure size 500x500 with 1 Axes>

Primero exploramos los dendrogramas.

<Figure size 500x500 with 1 Axes>
<Figure size 1200x1200 with 1 Axes>

Ya exploramos la estructura de los datos y construimos algo de intuición sobre cuántos conglomerados hay y cómo se distribuyen las muestras de datos entre ellos.

A continuación, elegimos un umbral de distancia y asignamos a cada punto de datos un identificador de conglomerado.

En Scikit-learn, el algoritmo completo está incorporado en la función AgglomerativeClustering documentación de sklearn aquí. La función necesita de todos modos un umbral de distancia o un número de conglomerados para realizar el agrupamiento y asignar un identificador de conglomerado a cada muestra de datos.

3.349805679694126
<Figure size 600x600 with 1 Axes>

5. PCA antes del agrupamiento

Generemos datos sintéticos.

(-6.0, 3.0)
<Figure size 600x600 with 1 Axes>

Hagamos ahora un agrupamiento k-means con 3 conglomerados.

<Figure size 600x600 with 1 Axes>

¿Qué pasa si aplicamos PCA + normalización antes del agrupamiento?

<Figure size 600x600 with 1 Axes>

Ejercicio: agrupar fuentes sísmicas volcánicas y tectónicas

Los volcanes vigilados de cerca — el Popocatépetl, que monitorea el CENAPRED; los volcanes glaciados de los Andes, que monitorean los observatorios de Chile, Ecuador y Colombia; o el Mt Hood, un volcán cubierto de hielo en las Cascadas — producen una mezcla de fuentes sísmicas: sismos volcánicos y tectónicos, eventos superficiales como caídas de rocas y avalanchas, y ruido de fondo. Los analistas etiquetan estos eventos a mano. ¿Puede el agrupamiento encontrar los tipos de fuente a partir de las características de la forma de onda únicamente?

Usamos un conjunto de datos curado de eventos sísmicos del Noroeste del Pacífico estadounidense — sismo, explosión, evento superficial y ruido, 1000 de cada uno —, descritos por características físicas de la forma de onda (forma espectral, estadísticas de la envolvente, curtosis, energías por banda). El conjunto de datos está archivado en Zenodo: DOI 10.5281/zenodo.14025693. Regresa en el cuaderno 3.5 para la clasificación supervisada.

Paso 1: cargar los datos. El cargador de abajo descarga y guarda en caché los cuatro archivos de clase, los concatena y elimina la única columna de características con valores faltantes.

(4000, 61)
source earthquake 1000 explosion 1000 noise 1000 surface event 1000 Name: count, dtype: int64

Paso 2: estandarizar las 61 características. Las características abarcan órdenes de magnitud, así que el escalado es obligatorio antes de cualquier método basado en distancias.

Paso 3: PCA. Grafique la varianza explicada acumulada y conserve suficientes componentes principales para explicar alrededor del 80 % de la varianza.

15 components explain 80% of the variance
<Figure size 600x400 with 1 Axes>

Paso 4: k-means con 4 conglomerados sobre las componentes principales. Sabemos que hay cuatro tipos de fuente, así que fijamos k = 4.

Paso 5: comparar los conglomerados con las etiquetas verdaderas. Este conjunto de datos tiene etiquetas verdaderas (ground truth), así que podemos calificar el agrupamiento con tres métricas:

  • La homogeneidad vale 1 cuando cada conglomerado contiene miembros de una sola clase.
  • La completitud vale 1 cuando todos los miembros de una clase caen en el mismo conglomerado.
  • La medida V es la media armónica de las dos. Las tres van de 0 (asignación aleatoria) a 1 (correspondencia perfecta).
Homogeneity:  0.363
Completeness: 0.393
V-measure:    0.377

Paso 6: cruzar en una tabla los conglomerados contra los tipos de fuente.

Loading...
<Figure size 700x500 with 2 Axes>

Sin ver jamás una etiqueta, k-means recupera buena parte de la estructura: un conglomerado está dominado por los sismos y otro por el ruido. Mire en su tabla cruzada el par de fuentes que más se mezcla — aquí, las explosiones y los eventos superficiales comparten en gran medida un conglomerado. Eso es físicamente plausible: ambas son fuentes someras, cercanas a la superficie (explosiones de cantera, caídas de rocas, avalanchas), así que sus formas de onda llevan poca de la energía profunda de alta frecuencia que separa a los sismos, y sus características de envolvente y espectrales se superponen. Los clasificadores supervisados del cuaderno 3.5 lo hacen mucho mejor sobre las mismas características — ese es precisamente el aporte de las etiquetas.

References
  1. Kharita, A. (2024). Physical features for small sample of data (1000 events per class). Zenodo. 10.5281/ZENODO.14025693