K-anlamı: Verimli bir başlangıç ​​sentroid seti seçmenin iyi yolları nelerdir?


17

Centroidlerin rastgele başlatılması kullanıldığında, K-araçlarının farklı çalışmaları farklı toplam SSE'ler üretir. Ve algoritmanın performansında çok önemlidir. Bu sorunun çözümünde bazı etkili yaklaşımlar nelerdir? Son yaklaşımlar takdir edilmektedir.

Yanıtlar:


12

Daha tutarlı sonuçlar veren bir yaklaşım K-++ anlamına gelir . Bu yaklaşım, başlangıçtaki sentroid bölgelerinin basit rastgele atamadan daha iyi bir seçenek olduğunu kabul eder. Spesifik olarak, K-ortalamaları, sentroidler onları uzayda bir araya toplamayacak şekilde tohumlandığında daha iyi performans gösterir.

Kısacası, yöntem aşağıdaki gibidir:

  1. Veri noktalarınızdan birini rastgele bir başlangıç ​​sentroidi olarak seçin.
  2. , ilk sentroidiniz ile diğer tüm veri noktaları arasındaki mesafeyi hesaplayın , x .D(x)x
  3. Kalan veri noktalarından D ( x ) 2 ile orantılı olan bir sonraki sentroidinizi seçinD(x)2
  4. Tüm sentroidler atanana kadar tekrarlayın.

Not: daha fazla sentroid eklendiğinde güncellenmelidir. Bir veri noktası ile en yakın centroid arasındaki mesafe olarak ayarlanmalıdır.D(x)

Yöntemi öneren ve genel beklenen performansını açıklayan bu makaleyi okumak da ilginizi çekebilir .


5

Sorunuzu yanlış anlıyor olabilirim, ancak genellikle k-anlamına gelir, belirlediğiniz kümelerin sayısına (yani k) bağlı olarak sentroidlerinizi sizin için rastgele seçer. K için sayı seçimi subjektif bir alıştırmadır. Başlamak için iyi bir yer, burada bulunan bir Dirsek / Scree çizimidir:

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



4

Bu soruna olağan yaklaşım, K-ortalama algoritmanızı birkaç kez, sentroidlerin farklı rastgele başlatmalarıyla yeniden çalıştırmak ve en iyi çözümü korumaktır. Bunu, egzersiz verilerinizdeki sonuçları değerlendirerek veya çapraz doğrulamayla yapabilirsiniz.

Centroidleri başlatmanın başka birçok yolu vardır, ancak hiçbiri her bir sorun için en iyisini yapmayacaktır. Sorununuz için rastgele başlatma ile birlikte bu yaklaşımları değerlendirebilirsiniz.


0

Dirsek / Scree grafiğine katılıyorum. Rastgele bir tohumdan daha sezgisel olarak buldum. İşte denemek için bir örnek kod.

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.