1
I have a matrix x= 
[[0,1,1,1,0,0,0,0], 
[1,0,1,1,0,0,0,0], 
[1,1,0,1,0,0,0,0], 
[1,1,1,0,0,0,0,0], 
[0,0,0,0,0,1,1,1], 
[0,0,0,0,1,0,1,1], 
[0,0,0,0,1,1,0,1], 
[0,0,0,0,1,1,1,0],] 

Après avoir appelé AgglomerativeClustering j'attendais les données à diviser en 2 groupes (0-3) et (4-7) soit des étiquettes _ = [0,0,0,0, 1,1,1,1] mais insted la liste labels_ est [0, 0, 0, 1, 0, 0, 0, 1]AgglomerativeClustering scikit apprendre la connectivité

Mon code est le suivant s=AgglomerativeClustering(affinity='precomputed',n_clusters=2,linkage='complete) s.fit(x)

est-ce que le code contient une erreur? Pourquoi la mise en cluster n'est-elle pas conforme aux attentes

+1

S'agit-il d'une matrice d'échantillons ou d'une matrice de connectivité? Si vous supprimez le paramètre d'affinité, vous obtiendrez les résultats souhaités. –

Répondre

0

L'erreur se situe dans la façon dont vous spécifiez la matrice de connectivité. D'après votre description, je suppose que votre matrice indique un lien entre les points, où [0/1] indique [aucun lien/lien]. Cependant, l'algorithme traite cela comme une matrice de distances par paires, ce qui explique pourquoi vous obtenez des résultats inattendus.

Vous pouvez convertir votre matrice d'affinité en une sorte de matrice de distance avec une simple transformation; par exemple.

>>> x = np.array(x) 
>>> s.fit(np.exp(-x)) 
>>> s.labels_ 
array([1, 1, 1, 1, 0, 0, 0, 0]) 

Il vaudrait mieux utiliser une métrique de distance réelle sur les données utilisées pour générer cette matrice d'affinité.

1

Il me semble, après avoir joué avec quelques exemples, que AgglomerativeClustering interprète la matrice 'affinité' comme une matrice de distance, bien que je ne puisse trouver cela spécifié nulle part. Cela signifie que vos 0 et 1 doivent être changés.

De même, il semble seulement considérer la partie triangulaire supérieure de la matrice (tout le reste étant redondant).

Je crois que la définition x comme:

x= 
[[0,0,0,0,1,1,1,1], 
[ 0,0,0,0,1,1,1,1], 
[ 0,0,0,0,1,1,1,1], 
[ 0,0,0,0,1,1,1,1], 
[ 0,0,0,0,0,0,0,0], 
[ 0,0,0,0,0,0,0,0], 
[ 0,0,0,0,0,0,0,0], 
[ 0,0,0,0,0,0,0,0],] 

vous donnera les résultats escomptés.