K-significa: quali sono alcuni buoni modi per scegliere un insieme efficiente di centroidi iniziali?


17

Quando viene utilizzata un'inizializzazione casuale di centroidi, diverse esecuzioni di K significano diversi SSE totali. Ed è cruciale nelle prestazioni dell'algoritmo. Quali sono alcuni approcci efficaci per risolvere questo problema? Sono apprezzati gli approcci recenti.

Risposte:


12

Un approccio che produce risultati più coerenti è K-mean ++ . Questo approccio riconosce che esiste probabilmente una scelta migliore delle posizioni del centroide iniziale rispetto alla semplice assegnazione casuale. In particolare, i mezzi K tendono a funzionare meglio quando i centroidi sono seminati in modo tale da non raggrupparli nello spazio.

In breve, il metodo è il seguente:

  1. Scegli uno dei tuoi punti dati a caso come centroide iniziale.
  2. Calcola , la distanza tra il centroide iniziale e tutti gli altri punti dati, .D(x)x
  3. Scegli il tuo prossimo centroide dai restanti punti dati con probabilità proporzionale aD(x)2
  4. Ripetere fino a quando non sono stati assegnati tutti i centroidi.

Nota: deve essere aggiornato man mano che vengono aggiunti più centroidi. Dovrebbe essere impostato per essere la distanza tra un punto dati e il centroide più vicino.D(x)

Potresti anche essere interessato a leggere questo documento che propone il metodo e descrive le prestazioni complessive previste.


5

Potrei fraintendere la tua domanda, ma di solito k-mean sceglie i tuoi centroidi in modo casuale per te a seconda del numero di cluster che hai impostato (cioè k). Scegliere il numero per k tende ad essere un esercizio soggettivo. Un buon punto di partenza è una trama Elbow / Scree che può essere trovata qui:

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


Penso che la domanda riguardi l'inizializzazione del centroide, che sono {'k-mean ++', 'random' o un ndarray} nella pagina della documentazione scikit-learn.org/stable/modules/generated/…
Itachi

4

L'approccio usuale a questo problema è rieseguire l'algoritmo K-mean più volte, con diverse inizializzazioni casuali dei centroidi e mantenere la soluzione migliore. Puoi farlo valutando i risultati sui tuoi dati di allenamento o attraverso la validazione incrociata.

Esistono molti altri modi per inizializzare i centroidi, ma nessuno di questi funzionerà al meglio per ogni singolo problema. È possibile valutare questi approcci insieme all'inizializzazione casuale per il problema specifico.


0

Sono d'accordo con la trama Elbow / Scree. L'ho trovato più intuitivamente sensato di un seme casuale. Ecco un codice di esempio per provarlo.

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.