k-means te obligaba a elegir k. Esto no.
Construye el árbol completo de agrupaciones, desde cada punto solo hasta un único grupo grande, y luego córtalo donde la estructura te lo indique.
Empieza con cada punto como su propio cluster. Luego repite hasta que quede uno:
Veintinueve merges para treinta puntos. Sin k, sin centroides, sin seed.
30 puntos, tres blobs de make_blobs, sin etiquetas. Pequeño a propósito: un
dendrograma dibuja una hoja por punto.
¿Qué tan lejos están dos clusters? Elige una regla:
dsingle(A,B)=a∈A,b∈Bmin∥xa−xb∥ dcomplete(A,B)=a∈A,b∈Bmax∥xa−xb∥ daverage(A,B)=∣A∣∣B∣1a∈A∑b∈B∑∥xa−xb∥Single encadena, complete arma bolitas apretadas, average es el primer intento seguro.
Los puntos se condensan arriba; el dendrograma se construye barra por barra abajo. Cada frame es un merge real. El rojo une los dos clusters que se fusionan en ese paso.
Los merges bajos ocurren dentro de los blobs; luego el árbol brinca un hueco grande para fusionarlos. De ese hueco sale k=3: tú no lo elegiste, las alturas lo anunciaron.
El dendrograma, coloreado por los clusters en k=3, los merges entre blobs en gris arriba, y la línea de corte tirada en el hueco vacío (altura 3.92, entre 1.90 y 5.94):
Nuestro corte en k=3 contra sklearn.cluster.AgglomerativeClustering. Las alturas
de merge coinciden con scipy hasta el epsilon de máquina; las etiquetas planas
coinciden con sklearn; ambos recuperan los blobs verdaderos. Todos los adjusted
Rand index dan 1.0.