Utilice la matriz de distancia en scipy.Cluster.jerarquía.linkage()?


Tengo una matriz de distancia n*n M donde M_ij es la distancia entre object_i y object_j. Así que como era de esperar, 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 esto llamada scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean').

Su documentación dice:

Y debe ser un vector de tamaño {n \choose 2} donde n es el número de observaciones originales emparejadas en la matriz de distancias.

Y: ndarray

Una matriz de distancia condensada o redundante. Condensar matriz de distancia es una matriz plana que contiene el triangular superior de la matriz de distancia. Esta es la forma que devuelve pdist. Alternativamente, a la colección de vectores de observación m en n dimensiones puede pasarse como una matriz m por n.

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


Update

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

Author: Sibbs Gambling, 2013-09-23

2 answers

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

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

Utilice el siguiente fragmento para condensar la matriz y proceder 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.

 30
Author: Sibbs Gambling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-23 08:40:23

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)]

De 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 linkage que permitirá al usuario especificar explícitamente que están pasando una matriz de distancia n x n en lugar de una matriz de observación m x n.

 6
Author: ali_m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-23 08:31:11