2015-03-19 1 views
3

Lorsque vous utilisez scipy.spatial.distance.pdist pour créer une matrice de distance condensée et passer à ward et je reçois cette erreur:Comment avez-vous accès au cluster/centroid/median clustering dans scipy?

Valid methods when the raw observations are omitted are 'single', 'complete', 'weighted', and 'average' error. 

La documentation indique bien que la fonction linkage() attend une matrice de distance condensée. Comment puis-je contourner ce problème?

foo = np.random.randint(3, size=(10,10)) 
scipy.spatial.distance.pdist(foo) 
scipy.cluster.hierarchy.linkage(foo) 
bar = scipy.spatial.distance.pdist(foo) 
scipy.cluster.hierarchy.linkage(bar, method='ward') 

donne:

Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
     File "/usr/lib/python2.7/dist-packages/scipy /cluster/hierarchy.py", line 627, in linkage 
raise ValueError("Valid methods when the raw observations are " 
ValueError: Valid methods when the raw observations are omitted are 'single', 'complete', 'weighted', and 'average'. 

J'ai cherché un peu et trouvé this link, ce qui indique que quelques autres personnes ont le problème, mais je ne pouvais pas trouver une solution pour fournir les données sous une forme Scipy acceptera.

Répondre

2

De l'docstring:

y : ndarray

A condensed or redundant distance matrix. A condensed distance matrix is a flat array containing the upper triangular of the distance matrix. This is the form that pdist returns. Alternatively, a collection of m observation vectors in n dimensions may be passed as an m by n array.

En passant vos observations originales x dimensions tableau foo semble fonctionner:

scipy.cluster.hierarchy.linkage(foo, method='ward') 

donne:

array([[ 1.  , 2.  , 2.23606798, 2.  ], 
     [ 5.  , 8.  , 2.23606798, 2.  ], 
     [ 3.  , 7.  , 2.64575131, 2.  ], 
     [ 9.  , 11.  , 2.64575131, 3.  ], 
     [ 0.  , 10.  , 3.31662479, 3.  ], 
     [ 12.  , 13.  , 3.71483512, 5.  ], 
     [ 6.  , 14.  , 4.12310563, 4.  ], 
     [ 4.  , 16.  , 4.17133072, 5.  ], 
     [ 15.  , 17.  , 5.5136195 , 10.  ]]) 

Je suis d'accord que le documentation pour linkage() pourrait faire avec l'amélioration au minimum.

+0

Merci, je ne l'ai pas vu dans les docs. Mais j'ai essayé de nourrir directement ma matrice (ce qui n'est pas une donnée de jouet, mais une matrice de 64x64x53160), et cela n'a pas fonctionné. Le dendrogramme issu des liens n'était pas décrivant, par exemple. – user1603472

+0

Votre matrice doit être bidimensionnelle (c'est-à-dire, observations x dimensions) –

+0

Droite. En fait, ce n'était pas le problème, il a été redimensionné dans le format correct, mais j'avais fait une autre erreur de programmation incroyablement stupide qui l'a brisé (en utilisant le même nom de variable pour deux choses (!)). Merci. – user1603472

0

scipy.cluster.hierarchy.linkage(y, method) renvoie les résultats corrects pour simple, complet, moyen, pondéré lorsque y est une matrice de distance ou une matrice de données. Mais pour les méthodes centroïde, médiane et ward, y doit être une matrice de données, une erreur se produit si y est une matrice de distance. Je suis d'accord que la documentation n'est pas claire.

from scipy.cluster.hierarchy import linkage 
from scipy.spatial.distance import pdist 

inp = np.loadtxt('iris.txt',delimiter=",", usecols=(0,1,2,3)) 
x = np.asarray(inp) 
Y = pdist(x,'euclidean') 
res_linkage = linkage(x,"weighted")` 

Vous pouvez tester le code ci-dessus par inputing x une matrice de données, ou Y une matrice de distance euclidienne dans la fonction de liaison().

J'ai également découvert que, par rapport à la mise en œuvre équivalente dans R, package hclust, scipy.cluster.hierarchy.linkage renvoie différents restuls pour les méthodes centroid, median et ward. Il semble que scipy.cluster.hierarchy.linkage contient des erreurs lors de la mise à jour de la distance d'un cluster nouvellement fusionné avec un cluster existant.