2016-01-19 2 views
1

J'applique un clustering spectral (sklearn.cluster.SpectralClustering) sur un jeu de données avec certaines fonctionnalités relativement peu nombreuses. Lorsque vous effectuez la classification spectrale en Python, je reçois l'avertissement suivant:Clustering spectral sur un jeu de données fragmenté

UserWarning: Graph is not fully connected, spectral embedding may not work as expected. warnings.warn("Graph is not fully connected, spectral embedding"

Ceci est souvent suivi d'une erreur comme celle-ci:

` 
File "****.py", line 120, in perform_clustering_spectral_clustering 
    predicted_clusters = cluster.SpectralClustering(n_clusters=n).fit_predict(features) 
File "****\sklearn\base.py", line 349, in fit_predict 
    self.fit(X) 
File "****\sklearn\cluster\spectral.py", line 450, in fit 
    assign_labels=self.assign_labels) 
File "****\sklearn\cluster\spectral.py", line 256, in spectral_clustering 
    eigen_tol=eigen_tol, drop_first=False) 
File "****\sklearn\manifold\spectral_embedding_.py", line 297, in spectral_embedding 
    largest=False, maxiter=2000) 
File "****\scipy\sparse\linalg\eigen\lobpcg\lobpcg.py", line 462, in lobpcg 
    activeBlockVectorBP, retInvR=True) 
File "****\scipy\sparse\linalg\eigen\lobpcg\lobpcg.py", line 112, in _b_orthonormalize 
    gramVBV = cholesky(gramVBV) 
File "****\scipy\linalg\decomp_cholesky.py", line 81, in cholesky 
    check_finite=check_finite) 
File "****\scipy\linalg\decomp_cholesky.py", line 30, in _cholesky 
    raise LinAlgError("%d-th leading minor not positive definite" % info) 
numpy.linalg.linalg.LinAlgError: 9-th leading minor not positive definite 
numpy.linalg.linalg.LinAlgError: 9-th leading minor not positive definite 
numpy.linalg.linalg.LinAlgError: the leading minor of order 12 of 'b' is not positive definite. The factorization of 'b' could not be completed and no eigenvalues or eigenvectors were computed.` 

Toutefois, cet avertissement/erreur ne se produit pas toujours lors de l'utilisation des mêmes paramètres (c'est-à-dire que son comportement n'est pas très cohérent, ce qui le rend difficile à tester). Cela se produit pour différentes valeurs de n_clusters, mais cela arrive plus souvent pour les valeurs n = 2 et n> 7 (c'est ma courte expérience au moins, comme je l'ai mentionné, son comportement n'est pas très cohérent).

Comment devrais-je faire face à cet avertissement et à une erreur connexe? Cela dépend-il de la quantité de fonctionnalités? Que faire si j'ajoute plus?

+1

Je suppose que vous utilisez 'sklearn.cluster.SpectralClustering'? Vous devez vraiment le mentionner dans la question. Aussi, s'il vous plaît montrer les retraçages complets pour l'erreur et l'avertissement, pas seulement la dernière ligne. –

+0

Votre matrice de similarité clairsemée * est-elle définie positive *? –

+0

J'ai modifié le message avec les informations demandées. La matrice n'est probablement pas définie positive (puisque c'est ce que l'erreur dit). La question est de savoir comment y faire face? – Guido

Répondre

1

J'ai également rencontré ce problème avec n_clusters. Comme il s'agit d'un ML non supervisé, il n'y a pas de valeur correcte unique pour n_clusters. Dans votre cas, il semble que n_cluster se situe entre 3 et 7. En supposant que vous ayez une certaine vérité à regrouper, la meilleure façon de gérer serait d'essayer quelques valeurs de n_cluster pour voir si un pattern émerge pour un ensemble de données donné tout en évitant -raccord. Vous pouvez également utiliser le coefficient de silhouette (sklearn.metrics.silhouette_score)