K-means: Quels sont les bons moyens de choisir un ensemble efficace de centroïdes initiaux?

17

Lorsqu'une initialisation aléatoire des centroïdes est utilisée, différentes séries de K-moyennes produisent différentes SSE totales. Et c'est crucial dans les performances de l'algorithme. Quelles sont les approches efficaces pour résoudre ce problème? Les approches récentes sont appréciées.

ngub05
la source

Réponses:

12

Une approche qui donne des résultats plus cohérents est K-means ++ . Cette approche reconnaît qu'il existe probablement un meilleur choix d'emplacements centroïdes initiaux qu'une simple assignation aléatoire. Plus précisément, K-means a tendance à mieux fonctionner lorsque les centroïdes sont ensemencés de manière à ne pas les regrouper dans l'espace.

En bref, la méthode est la suivante:

  1. Choisissez l'un de vos points de données au hasard comme centroïde initial.
  2. Calculez , la distance entre votre centroïde initial et tous les autres points de données, .(X)X
  3. Choisissez votre prochain centroïde parmi les points de données restants avec une probabilité proportionnelle à(X)2
  4. Répétez jusqu'à ce que tous les centroïdes aient été attribués.

Remarque: doit être mis à jour à mesure que d'autres centroïdes sont ajoutés. Il doit être défini comme la distance entre un point de données et le centroïde le plus proche.(X)

Vous pouvez également être intéressé par la lecture de cet article qui propose la méthode et décrit ses performances globales attendues.

Ryan J. Smith
la source
5

Je peux mal comprendre votre question, mais généralement k-means choisit vos centroïdes au hasard pour vous en fonction du nombre de clusters que vous définissez (c'est-à-dire k). Le choix du nombre pour k tend à être un exercice subjectif. Un bon point de départ est un tracé Elbow / Scree qui peut être trouvé ici:

http://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set#The_Elbow_Method

Jake C.
la source
Je pense que la question concerne l'initialisation des centroïdes, qui sont {'k-means ++', 'random' ou un ndarray} sur la page de documentation scikit-learn.org/stable/modules/generated/…
Itachi
4

L'approche habituelle de ce problème consiste à réexécuter votre algorithme K-means plusieurs fois, avec différentes initialisations aléatoires des centroïdes, et à conserver la meilleure solution. Vous pouvez le faire en évaluant les résultats sur vos données d'entraînement ou au moyen d'une validation croisée.

Il existe de nombreuses autres façons d'initialiser les centroïdes, mais aucune d'entre elles ne donnera les meilleurs résultats pour chaque problème. Vous pouvez évaluer ces approches avec une initialisation aléatoire pour votre problème particulier.

Pablo Suau
la source
0

Je suis d'accord avec l'intrigue Elbow / Scree. Je l'ai trouvé plus intuitivement sensible qu'une graine aléatoire. Voici un exemple de code pour l'essayer.

Ks=30
mean_acc=np.zeros((Ks-1))
std_acc=np.zeros((Ks-1))
ConfustionMx=[];
for n in range(1,Ks):    
    #Train Model and Predict  
    kNN_model = KNeighborsClassifier(n_neighbors=n).fit(X_train,y_train)
    yhat = kNN_model.predict(X_test)
    mean_acc[n-1]=np.mean(yhat==y_test);
    std_acc[n-1]=np.std(yhat==y_test)/np.sqrt(yhat.shape[0])

plt.plot(range(1,Ks),mean_acc,'g')
plt.fill_between(range(1,Ks),mean_acc - 1 * std_acc,mean_acc + 1 * std_acc, alpha=0.10)
plt.legend(('Accuracy ', '+/- 3xstd'))
plt.ylabel('Accuracy ')
plt.xlabel('Number of Nabors (K)')
plt.tight_layout()
plt.show()

print( "The best accuracy was with", mean_acc.max(), "with k=", mean_acc.argmax()+1)
Web Ster
la source