Est-il possible de spécifier votre propre fonction de distance en utilisant le clustering K-Means scikit-learn?
172
Est-il possible de spécifier votre propre fonction de distance en utilisant le clustering K-Means scikit-learn?
Réponses:
Voici un petit kmeans qui utilise l'une des 20 distances impaires dans scipy.spatial.distance , ou une fonction utilisateur.
Les commentaires seraient les bienvenus (cela n'a eu qu'un seul utilisateur jusqu'à présent, pas assez); en particulier, quels sont vos N, dim, k, métrique?
Quelques notes ajoutées le 26 mars 2012:
1) pour la distance cosinus, commencez par normaliser tous les vecteurs de données à | X | = 1; puis
est rapide. Pour les vecteurs de bits, gardez les normes séparément des vecteurs au lieu de les développer en flottants (bien que certains programmes puissent s'étendre pour vous). Pour les vecteurs clairsemés, disons 1% de N, X. Y doit prendre le temps O (2% N), l'espace O (N); mais je ne sais pas quels programmes font cela.
2) Le clustering Scikit-learn donne un excellent aperçu des k-means, mini-batch-k-means ... avec du code qui fonctionne sur les matrices scipy.sparse.
3) Vérifiez toujours les tailles de cluster après k-means. Si vous vous attendez à des clusters de taille à peu près égale, mais qu'ils sortent
[44 37 9 5 5] %
... (son de grattage de tête).la source
Malheureusement non: l'implémentation actuelle de k-means par scikit-learn n'utilise que les distances euclidiennes.
Il n'est pas trivial d'étendre k-means à d'autres distances et la réponse de denis ci-dessus n'est pas la bonne façon d'implémenter les k-means pour d'autres métriques.
la source
Utilisez simplement nltk à la place où vous pouvez le faire, par exemple
la source
repeats
), 1,5k points prend 2 minutes et 2k prend ... trop de temps.Oui, vous pouvez utiliser une fonction métrique de différence; cependant, par définition, l'algorithme de clustering k-means repose sur la distance eucldienne de la moyenne de chaque cluster.
Vous pouvez utiliser une métrique différente, donc même si vous calculez toujours la moyenne, vous pouvez utiliser quelque chose comme la distance mahalnobis.
la source
Il y a pyclustering qui est python / C ++ (donc c'est rapide!) Et vous permet de spécifier une fonction métrique personnalisée
En fait, je n'ai pas testé ce code mais je l'ai bricolé à partir d' un ticket et d'un exemple de code .
la source
k-means de Spectral Python permet l'utilisation de la distance L1 (Manhattan).
la source
Sklearn Kmeans utilise la distance euclidienne . Il n'a pas de paramètre métrique. Cela dit, si vous êtes le regroupement des séries chronologiques , vous pouvez utiliser le
tslearn
paquet python, lorsque vous pouvez spécifier une métrique (dtw
,softdtw
,euclidean
).la source