dendograma - ¿Cómo calcular las asignaciones de clúster a partir de matrices de vinculación/distancia en scipy en Python?
dendrogram python (2)
Si desea ver a los miembros en cada nivel de clúster y en qué orden se aglomeran, consulte https://stackoverflow.com/a/43170608/5728789
Si tiene esta llamada de agrupamiento jerárquico en Scipy en Python:
from scipy.cluster.hierarchy import linkage
# dist_matrix is long form distance matrix
linkage_matrix = linkage(squareform(dist_matrix), linkage_method)
Entonces, ¿cuál es una manera eficiente de pasar de esto a las asignaciones de cluster para puntos individuales? es decir, un vector de longitud N
donde N
es el número de puntos, donde cada entrada i
es el número de cluster del punto i
, dado el número de clusters generados por un umbral determinado en el clustering resultante?
Para aclarar: el número de grupo sería el grupo en el que se encuentra después de aplicar un umbral al árbol. En cuyo caso, obtendría un grupo único para cada nodo de hoja para el grupo en el que se encuentra. Único en el sentido de que cada punto pertenece a un "grupo más específico" definido por el umbral donde se corta el dendrograma.
Sé que scipy.cluster.hierarchy.fclusterdata
le brinda esta asignación de grupo como su valor de retorno, pero estoy empezando desde una matriz de distancia y una métrica de distancia personalizadas, por lo que no puedo usar fclusterdata
. La pregunta se reduce a: ¿cómo puedo calcular qué datos fclusterdata
está computando: las asignaciones de clúster?
Si te entiendo bien, eso es lo que hace fcluster :
scipy.cluster.hierarchy.fcluster(Z, t, criterion=''inconsistent'', depth=2, R=None, monocrit=None)
Forma agrupaciones planas de la agrupación jerárquica definida por la matriz de vinculación Z.
...
Devoluciones: Una matriz de longitud n. T [i] es el número de grupo plano al que pertenece la observación original i.
Así que simplemente llame a fcluster(linkage_matrix, t)
, donde t
es su umbral.