К-значить: Які хороші способи вибрати ефективний набір початкових центроїдів?


17

Коли використовується випадкова ініціалізація центроїдів, різні прогони K-засобів виробляють різні загальні SSE. І це має вирішальне значення у виконанні алгоритму. Які ефективні підходи до вирішення цієї проблеми? Останні підходи оцінюються.

Відповіді:


12

Підхід, що дає більш послідовні результати - це K-засоби ++ . Цей підхід визнає, що, мабуть, є кращий вибір початкових центроїдних місць, ніж просте випадкове призначення. Зокрема, K-засоби мають більшу ефективність, коли центроїди висіваються таким чином, що не збивають їх у просторі.

Коротше кажучи, спосіб такий:

  1. Виберіть випадково один із своїх точок даних як початковий центроїд.
  2. Обчисліть , відстань між початковим центроїдом та всіма іншими точками даних, x .D(х)х
  3. Виберіть наступний центроїд із решти точок даних з імовірністю, пропорційною D(х)2
  4. Повторюйте, поки не будуть призначені всі ценроїди.

Примітка: слід оновлювати, оскільки додається більше центроїдів. Потрібно встановити відстань між точкою даних та найближчим центроїдом.D(х)

Вам також може бути цікаво прочитати цей документ, який пропонує метод та описує його загальну очікувану ефективність.


5

Я можу нерозуміти ваше питання, але зазвичай k-означає вибирає ваші центроїди випадковим чином для вас залежно від кількості кластерів, які ви встановили (тобто k). Вибір числа для k, як правило, є суб'єктивною вправою. Хороше місце для початку - сюжет з ліктем / оси, який можна знайти тут:

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


Я думаю, що питання про ініціалізацію центроїдів, які є {'k-означає ++', 'випадковий' або ndarray} на сторінці документації scikit-learn.org/stable/modules/generated/…
Itachi

4

Звичайний підхід до цієї проблеми полягає у повторному запуску алгоритму К-засобів кілька разів, з різними випадковими ініціалізаціями центроїдів, і зберегти найкраще рішення. Це можна зробити, оцінивши результати на ваших навчальних даних або за допомогою перехресної перевірки.

Існує багато інших способів ініціалізації центроїдів, але жоден із них не збирається виконати найкраще для кожної проблеми. Ви можете оцінити ці підходи разом із випадковою ініціалізацією для вашої конкретної проблеми.


0

Я погоджуюся з сюжетом Локоть / Оси. Я вважав це більш інтуїтивно розумним, ніж випадкове насіння. Ось приклад коду, щоб спробувати його.

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.