web-dev-qa-db-fra.com

Sklearn kmeans équivalent de la méthode du coude

Supposons que j'examine jusqu'à 10 clusters, avec scipy, je génère généralement le tracé du "coude" comme suit:

from scipy import cluster
cluster_array = [cluster.vq.kmeans(my_matrix, i) for i in range(1,10)]

pyplot.plot([var for (cent,var) in cluster_array])
pyplot.show()

Depuis, je suis devenu motivé à utiliser sklearn pour le clustering, mais je ne sais pas comment créer le tableau nécessaire pour tracer comme dans le cas scipy. Ma meilleure supposition était:

from sklearn.cluster import KMeans

km = [KMeans(n_clusters=i) for i range(1,10)]
cluster_array = [km[i].fit(my_matrix)]

Cela a malheureusement entraîné une erreur de commande non valide. Quelle est la meilleure façon d'apprendre à ce sujet?

Je vous remercie

11
Arash Howaida

Vous avez eu quelques problèmes de syntaxe dans le code. Ils devraient être corrigés maintenant:

Ks = range(1, 10)
km = [KMeans(n_clusters=i) for i in Ks]
score = [km[i].fit(my_matrix).score(my_matrix) for i in range(len(km))]

La méthode fit renvoie simplement un objet self. Dans cette ligne dans le code d'origine

cluster_array = [km[i].fit(my_matrix)]

le cluster_array finirait par avoir le même contenu que km.

Vous pouvez utiliser la méthode score pour obtenir une estimation de l'adéquation du clustering. Pour voir le score de chaque cluster, exécutez simplement plot(Ks, score).

10
J. P. Petersen

vous pouvez utiliser l'attribut inertie de la classe Kmeans.

En supposant que X est votre ensemble de données:

from sklearn.cluster import KMeans
from matplotlib import pyplot as plt

X = # <your_data>
distorsions = []
for k in range(2, 20):
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    distorsions.append(kmeans.inertia_)

fig = plt.figure(figsize=(15, 5))
plt.plot(range(2, 20), distorsions)
plt.grid(True)
plt.title('Elbow curve')
20
Ahmed Besbes

Vous pouvez également utiliser la distance euclidienne entre chaque donnée avec la distance centrale du cluster pour évaluer le nombre de clusters à choisir. Voici l'exemple de code.

import numpy as np
from scipy.spatial.distance import cdist
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

iris = load_iris()
x = iris.data

res = list()
n_cluster = range(2,20)
for n in n_cluster:
    kmeans = KMeans(n_clusters=n)
    kmeans.fit(x)
    res.append(np.average(np.min(cdist(x, kmeans.cluster_centers_, 'euclidean'), axis=1)))

plt.plot(n_cluster, res)
plt.title('elbow curve')
plt.show()
4
lugq