pdist dendrograma clustering python scipy hierarchical-clustering

python - dendrograma - ¿Utilizar matriz de distancia en scipy.cluster.hierarchy.linkage()?



linkage hierarchical clustering python (2)

Tengo una matriz de distancia n * n M donde M_ij es la distancia entre object_i y object_j . Así que como se espera, toma la siguiente forma:

/ 0 M_01 M_02 ... M_0n/ | M_10 0 M_12 ... M_1n | | M_20 M_21 0 ... M2_n | | ... | / M_n0 M_n2 M_n2 ... 0 /

Ahora deseo agrupar estos n objetos con agrupamiento jerárquico. Python tiene una implementación de este llamado scipy.cluster.hierarchy.linkage(y, method=''single'', metric=''euclidean'') .

Su documentación dice:

y debe ser un vector de tamaño {n / elegir 2} donde n es el número de observaciones originales emparejadas en la matriz de distancia.

y: ndarray

Una matriz de distancia condensada o redundante. Una matriz de distancia condensada es una matriz plana que contiene el triángulo superior de la matriz de distancia. Esta es la forma que devuelve pdist. Alternativamente, una colección de m vectores de observación en n dimensiones se puede pasar como una matriz m por n.

Estoy confundido por esta descripción de y . ¿Puedo introducir directamente mi M como entrada y ?

Actualizar

@ hongbo-zhu-cn ha planteado este problema en GitHub . Esto es exactamente lo que me preocupa. Sin embargo, como novato en GitHub, no sé cómo funciona y, por lo tanto, no tengo idea de cómo se trata este problema.


Parece que, de hecho, no podemos pasar directamente la matriz cuadrada redundante, aunque la documentación afirma que podemos hacerlo.

Para beneficiar a cualquier persona que enfrente el mismo problema en el futuro, escribo mi solución como una respuesta adicional aquí. Así que los chicos de copiar y pegar pueden continuar con el agrupamiento.

Utilice el siguiente fragmento de código para condensar la matriz y continuar felizmente.

import scipy.spatial.distance as ssd # convert the redundant n*n square matrix form into a condensed nC2 array distArray = ssd.squareform(distMatrix) # distArray[{n choose 2}-{n-i choose 2} + (j-i-1)] is the distance between points i and j

Por favor, corríjame si estoy equivocado.


Por ahora, debe pasar en la ''matriz de distancia condensada'', es decir, solo el triángulo superior de la matriz de distancia en forma vectorial:

y = M[np.triu_indices(n,1)]

Desde la discusión de la solicitud de extracción de @ hongbo-zhu-cn, parece que la solución será agregar un argumento de palabra clave adicional a la función de linkage que permitirá al usuario especificar explícitamente que están pasando una matriz de distancia nxn en lugar de una Matriz de observación mxn .