Відповіді:
Підхід, що дає більш послідовні результати - це K-засоби ++ . Цей підхід визнає, що, мабуть, є кращий вибір початкових центроїдних місць, ніж просте випадкове призначення. Зокрема, K-засоби мають більшу ефективність, коли центроїди висіваються таким чином, що не збивають їх у просторі.
Коротше кажучи, спосіб такий:
Примітка: слід оновлювати, оскільки додається більше центроїдів. Потрібно встановити відстань між точкою даних та найближчим центроїдом.
Вам також може бути цікаво прочитати цей документ, який пропонує метод та описує його загальну очікувану ефективність.
Я можу нерозуміти ваше питання, але зазвичай k-означає вибирає ваші центроїди випадковим чином для вас залежно від кількості кластерів, які ви встановили (тобто k). Вибір числа для k, як правило, є суб'єктивною вправою. Хороше місце для початку - сюжет з ліктем / оси, який можна знайти тут:
http://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set#The_Elbow_Method
Звичайний підхід до цієї проблеми полягає у повторному запуску алгоритму К-засобів кілька разів, з різними випадковими ініціалізаціями центроїдів, і зберегти найкраще рішення. Це можна зробити, оцінивши результати на ваших навчальних даних або за допомогою перехресної перевірки.
Існує багато інших способів ініціалізації центроїдів, але жоден із них не збирається виконати найкраще для кожної проблеми. Ви можете оцінити ці підходи разом із випадковою ініціалізацією для вашої конкретної проблеми.
Я погоджуюся з сюжетом Локоть / Оси. Я вважав це більш інтуїтивно розумним, ніж випадкове насіння. Ось приклад коду, щоб спробувати його.
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)