Yanıtlar:
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:
Not: daha fazla sentroid eklendiğinde güncellenmelidir. Bir veri noktası ile en yakın centroid arasındaki mesafe olarak ayarlanmalıdır.
Yöntemi öneren ve genel beklenen performansını açıklayan bu makaleyi okumak da ilginizi çekebilir .
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
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.
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)