2010-05-30 7 views
10

Je fais une classification hiérarchique d'une matrice bidimensionnelle par mesure de distance de corrélation (c'est-à-dire 1 - corrélation de Pearson). Mon code est le suivant (les données sont dans une variable appelée "données"):problème avec la classification hiérarchique en Python

from hcluster import * 

Y = pdist(data, 'correlation') 
cluster_type = 'average' 
Z = linkage(Y, cluster_type) 
dendrogram(Z) 

L'erreur que je reçois est:

ValueError: Linkage 'Z' contains negative distances. 

Quelles sont les causes de cette erreur? La matrice « données » que j'utilise est tout simplement:

[[ 156.651968 2345.168618] 
[ 158.089968 2032.840106] 
[ 207.996413 2786.779081] 
[ 151.885804 2286.70533 ] 
[ 154.33665 1967.74431 ] 
[ 150.060182 1931.991169] 
[ 133.800787 1978.539644] 
[ 112.743217 1478.903191] 
[ 125.388905 1422.3247 ]] 

Je ne vois pas comment pdist pourrait jamais produire des nombres négatifs lors de la prise 1 - corrélation pearson. Des idées à ce sujet?

merci.

Répondre

5

De beaux problèmes de virgule flottante se posent. Si vous regardez les résultats de pdist, vous trouverez de très petits nombres négatifs (-2.22044605e-16). Essentiellement, ils devraient être zéro. Vous pouvez utiliser la fonction de clip de numpy pour y faire face si vous le souhaitez.

+0

J'ai essayé les suivants, mais il ne fonctionne pas: # calculer Y de pdist en utilisant « corrélation » Y = clip (Y, 0, 1) et les clusterings que je reçois pour la matrice, j'ai montré ci-dessus sont très bizarre. Une idée de ce qui pourrait arriver? Cela se produit uniquement avec la 'corrélation' comme argument de pdist. – user248237dfsf

+1

Vous pourriez essayer d'utiliser quelque chose comme 'Y [abs (Y) <3e-16] = 0.0 'parce que vous avez aussi de très petites distances positives. Parfois, des chiffres comme ceux-là peuvent vraiment jeter des choses. Je n'ai pas beaucoup d'expérience en utilisant le module de clustering très franchement. Il pourrait avoir à faire avec l'utilisation de «moyenne» pour le type de cluster peut-être? –