답변:
보다 일관된 결과를 산출하는 방법은 K-means ++ 입니다. 이 접근법은 단순한 무작위 할당보다 초기 중심 위치를 선택하는 것이 더 낫다는 것을 인정합니다. 특히, 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)