K- 평균 : 효율적인 초기 중심 세트를 선택하는 좋은 방법은 무엇입니까?


17

중심의 무작위 초기화가 사용될 때, 다른 K- 평균 실행은 다른 총 SSE를 생성합니다. 그리고 알고리즘 성능에 중요합니다. 이 문제를 해결하기위한 효과적인 방법은 무엇입니까? 최근의 접근법이 높이 평가됩니다.

답변:


12

보다 일관된 결과를 산출하는 방법은 K-means ++ 입니다. 이 접근법은 단순한 무작위 할당보다 초기 중심 위치를 선택하는 것이 더 낫다는 것을 인정합니다. 특히, K- 평균은 우주에서 중심을 모으지 않는 방식으로 중심이 파종 될 때 더 잘 수행되는 경향이 있습니다.

간단히 말해서 방법은 다음과 같습니다.

  1. 데이터 센터 중 하나를 초기 중심으로 임의로 선택하십시오.
  2. 계산 , 초기 중심 및 다른 모든 데이터 포인트 사이의 거리 .(엑스)엑스
  3. 비례하는 확률로 나머지 데이터 포인트에서 다음 중심을 선택하십시오.(엑스)2
  4. 모든 중심이 할당 될 때까지 반복하십시오.

참고 : 더 많은 중심이 추가되면 를 업데이트해야합니다. 데이터 포인트와 가장 가까운 중심 사이의 거리로 설정해야합니다.(엑스)

방법을 제안하고 전반적인 예상 성능을 설명하는 이 백서 를 읽어보십시오 .


5

나는 당신의 질문을 오해 할 수도 있지만 일반적으로 k- 평균은 설정 한 군집 수 (즉 k)에 따라 무작위로 중심을 선택합니다. k의 숫자를 선택하는 것은 주관적인 운동 인 경향이 있습니다. 시작하기에 좋은 곳은 팔꿈치 / 스크린 플롯입니다.

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



4

이 문제에 대한 일반적인 접근 방식은 K- 평균 알고리즘을 여러 번 다시 실행하여 다른 임의의 중심 값 초기화를 수행하고 최상의 솔루션을 유지하는 것입니다. 훈련 데이터의 결과를 평가하거나 교차 검증을 통해이를 수행 할 수 있습니다.

중심을 초기화하는 다른 많은 방법이 있지만 그중 하나가 모든 단일 문제에 대해 최선을 다하지는 않습니다. 특정 문제에 대한 무작위 초기화와 함께 이러한 접근 방식을 평가할 수 있습니다.


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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.