Utiliser la matrice des distances en principe.cluster.hiérarchie.lien()?

j'ai une matrice de distance n*n MM_ij est la distance entre object_i et object_j. Ainsi, comme prévu, il prend la forme suivante:

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

maintenant je souhaite regrouper ces N objets avec un regroupement hiérarchique. Python a une implémentation de ceci appelée scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean').

sa documentation dit:

y doit être un vecteur de taille {n \choose 2} où n est le nombre de les observations originales jumelées dans le matrice de distance.

y : ndarray

une matrice de distance condensée ou redondante. Un condensé de la matrice de distance est un tableau plat contenant le triangle supérieur de la matrice de distance. C'est la forme que renvoie le pdist. Sinon, un la collecte des vecteurs d'observation m en n dimensions peut être passée comme suit: un tableau m par n.

je suis confus par cette description de y. puis-je alimenter directement mon M in comme entrée

2 ответов

il semble en effet que nous ne pouvons pas passer directement la matrice carrée redondante, bien que la documentation affirme que nous pouvons le faire.

pour le bénéfice de quiconque fait face au même problème dans le futur, j'écris ma solution comme une réponse supplémentaire ici. Donc les gars de copier-coller peuvent juste procéder avec le clustering.

Utilisez l'extrait suivant pour condenser la matrice et procéder avec plaisir.

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

s'il vous Plaît corrigez-moi si je me trompe.

30
répondu Sibbs Gambling 2013-09-23 12:40:23
la source

pour l'instant vous devez passer dans la 'matrice de distance condensée', c'est-à-dire juste le triangle supérieur de la matrice de distance sous forme de vecteur:

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

la discussion de @hongbo-zhu-cn pull request il semble que la solution sera d'ajouter un argument mot-clé à l' linkage fonction qui permettra à l'utilisateur de spécifier explicitement qu'il passe dans un n x n matrice de distance plutôt qu'un m x n observation matrice.

6
répondu ali_m 2013-09-23 12:31:11
la source

Autres questions sur