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
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)
.
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')
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()