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.
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.
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.
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