Main Content

k-평균 군집화

이 항목에서는 k-평균 군집화에 대해 소개하고, Statistics and Machine Learning Toolbox™ 함수 kmeans를 사용하여 데이터 세트에 가장 적합한 군집화 해를 구하는 예제를 살펴봅니다.

k-평균 군집화 소개

k-평균 군집화는 분할 방법입니다. 함수 kmeans는 데이터를 k개의 상호 배타적인 군집으로 분할하고 각 관측값을 할당하는 군집의 인덱스를 반환합니다. kmeans는 데이터의 각 관측값을 공간적 위치를 갖는 객체로 취급합니다. 이 함수는 객체가 각 군집 내에서는 최대한 서로 가까이 있고 다른 군집 내의 객체와는 최대한 멀리 있도록 하는 분할을 찾습니다. 데이터 특성에 따라 kmeans와 함께 사용할 거리 측정법을 선택할 수 있습니다. 여러 군집화 방법과 마찬가지로, k-평균 군집화를 수행하려면 군집화하기 전에 군집 개수 k를 지정해야 합니다.

계층적 군집화와 달리, k-평균 군집화는 데이터에 포함된 모든 관측값 쌍 간의 비유사성이 아니라 실제 관측값을 대상으로 연산을 수행합니다. 또한 k-평균 군집화는 다중 수준 계층의 군집이 아니라 단일 수준의 군집을 생성합니다. 따라서 대량의 데이터를 처리할 때는 k-평균 군집화가 계층적 군집화보다 더 적합한 경우가 많습니다.

k-평균 분할의 각 군집은 멤버 객체와 중심으로 구성됩니다. kmeans는 각 군집에서 군집의 중심과 군집 내 모든 멤버 객체와의 거리에 대한 합을 최소화합니다. kmeans는 중심 군집을 지원되는 여러 거리 측정법마다 다르게 계산합니다. 자세한 내용은 'Distance'를 참조하십시오.

kmeans에 지원되는 이름-값 쌍의 인수를 사용하여 최소화의 세부 사항을 제어할 수 있습니다. 예를 들어, 알고리즘에 사용할 최대 반복 횟수와 군집 중심의 초기값을 지정할 수 있습니다. 기본적으로 kmeansk-평균++ 알고리즘을 사용하여 군집 중심을 초기화하고, 제곱 유클리드 거리 측정법을 사용하여 거리를 확인합니다.

k-평균 군집화를 수행할 경우 다음 모범 사례를 따르십시오.

  • 여러 다른 k 값에 대한 k-평균 군집화 해를 비교하여 데이터의 최적의 군집 개수를 결정합니다.

  • 실루엣 플롯과 실루엣 값을 검토하여 군집화 해를 평가합니다. 또는 evalclusters 함수를 사용해서 갭 값, 실루엣 값, Davies-Bouldin 인덱스 값, Calinski-Harabasz 인덱스 값 같은 기준을 근거로 군집화 해를 평가할 수도 있습니다.

  • 여러 다른 중심을 무작위로 선택하여 군집화를 반복 실험한 후 모든 반복 실험 중에서 거리 총합이 가장 낮은 해를 반환합니다.

대화형 방식으로 k-평균 군집화를 수행하려면 데이터 군집화 라이브 편집기 작업을 사용하십시오.

k-평균 군집화 해 비교하기

이 예제에서는 4차원 데이터 세트에 대한 k-평균 군집화를 살펴봅니다. 이 예제에서는 실루엣 플롯과 실루엣 값을 사용하여 여러 다른 k-평균 군집화 해의 결과를 분석하고 이를 통해 데이터 세트의 올바른 군집 개수를 결정하는 방법을 보여줍니다. 또한, 'Replicates' 이름-값 쌍의 인수를 사용하여, 지정된 횟수만큼 가능한 해를 테스트하고 거리 총합이 가장 낮은 해를 반환하는 방법도 보여줍니다.

데이터 세트 불러오기

kmeansdata 데이터 세트를 불러옵니다.

rng('default')  % For reproducibility
load('kmeansdata.mat')
size(X)
ans = 1×2

   560     4

데이터 세트가 4차원이므로 쉽게 시각화할 수 없습니다. 그러나 kmeans를 사용하면 데이터 내에 그룹 구조가 존재하는지 여부를 조사할 수 있습니다.

군집을 생성하고 분리 결정하기

k-평균 군집화를 사용하여 데이터 세트를 3개의 군집으로 분할합니다. 도시 블록 거리 측정법을 지정하고 군집 중심 초기화에 디폴트 k-평균++ 알고리즘을 사용합니다. 해의 최종 거리 합을 출력하려면 'Display' 이름-값 쌍 인수를 사용하십시오.

[idx3,C,sumdist3] = kmeans(X,3,'Distance','cityblock', ...
    'Display','final');
Replicate 1, 7 iterations, total sum of distances = 2459.98.
Best total sum of distances = 2459.98

idx3에는 X의 각 행의 군집 할당을 나타내는 군집 인덱스가 들어 있습니다. 결과로 생성된 군집이 잘 분리되었는지 확인하기 위해 실루엣 플롯을 생성할 수 있습니다.

실루엣 플롯은 어느 한 군집에 포함된 각 점이 인접 군집의 점들과 얼마나 가까운지 측정한 값을 표시합니다. 이 측정값의 범위는 인접 군집에서 아주 먼 점을 나타내는 1부터, 해당 군집에 속하는지 다른 군집에 속하는지 뚜렷이 구분되지 않는 점을 나타내는 0을 거쳐, 필시 잘못된 군집에 할당된 것으로 보이는 점을 나타내는 -1까지입니다. silhouette은 이러한 값을 첫 번째 출력값에 반환합니다.

idx3으로 실루엣 플롯을 만듭니다. k-평균 군집화가 절대차이합을 기준으로 한다는 점을 나타내기 위해 'cityblock'을 거리 측정법으로 지정합니다.

[silh3,h] = silhouette(X,idx3,'cityblock');
xlabel('Silhouette Value')
ylabel('Cluster')

Figure contains an axes object. The axes object with xlabel Silhouette Value, ylabel Cluster contains an object of type bar.

실루엣 플롯에서 두 번째 군집에 포함된 대부분의 점이 큰 실루엣 값(0.6보다 큼)을 가지는 것을 알 수 있습니다. 이는 이 군집이 인접 군집과 어느 정도 분리되어 있음을 나타냅니다. 그러나, 세 번째 군집은 낮은 실루엣 값을 갖는 점을 많이 포함하며, 첫 번째 군집과 세 번째 군집은 음수 값을 갖는 점을 조금 포함하고 있습니다. 따라서 이 두 군집은 잘 분리되지 않았음을 알 수 있습니다.

kmeans가 데이터를 더 잘 그룹화할 수 있는지 살펴보기 위해 군집 개수를 4개로 늘립니다. 'Display' 이름-값 쌍의 인수를 사용하여 각 반복에 대한 정보를 출력합니다.

idx4 = kmeans(X,4,'Distance','cityblock','Display','iter');
  iter	 phase	     num	         sum
     1	     1	     560	     1792.72
     2	     1	       6	      1771.1
Best total sum of distances = 1771.1

4개 군집에 대한 실루엣 플롯을 생성합니다.

[silh4,h] = silhouette(X,idx4,'cityblock');
xlabel('Silhouette Value')
ylabel('Cluster')

Figure contains an axes object. The axes object with xlabel Silhouette Value, ylabel Cluster contains an object of type bar.

이 실루엣 플롯은 이전 해의 3개 군집보다 4개 군집이 더 잘 분리됨을 나타냅니다. 두 사례에 대한 평균 실루엣 값을 구하면 두 해를 더욱 정량적인 방법으로 비교할 수 있습니다.

평균 실루엣 값을 구합니다.

cluster3 = mean(silh3)
cluster3 = 
0.5352
cluster4 = mean(silh4)
cluster4 = 
0.6400

4개 군집의 평균 실루엣 값이 3개 군집의 평균 실루엣 값보다 높습니다. 이들 값은 실루엣 플롯에서 나타난 결론을 뒷받침해 줍니다.

마지막으로, 데이터에서 5개 군집을 찾습니다. 실루엣 플롯을 생성하고, 5개 군집에 대한 평균 실루엣 값을 구합니다.

idx5 = kmeans(X,5,'Distance','cityblock','Display','final');
Replicate 1, 7 iterations, total sum of distances = 1647.26.
Best total sum of distances = 1647.26
[silh5,h] = silhouette(X,idx5,'cityblock');
xlabel('Silhouette Value')
ylabel('Cluster')

Figure contains an axes object. The axes object with xlabel Silhouette Value, ylabel Cluster contains an object of type bar.

mean(silh5)
ans = 
0.5721

이 실루엣 플롯은 5개가 적합한 군집 개수가 아닐 가능성이 높음을 나타내고 있습니다. 왜냐하면 2개 군집에 주로 낮은 실루엣 값을 갖는 점이 들어있고 5번째 군집에는 음수 값을 갖는 점이 몇 개 들어있기 때문입니다. 또한 5개 군집에 대한 평균 실루엣 값이 4개 군집에 대한 평균 실루엣 값보다 낮습니다. 데이터에 군집이 몇 개나 있는지 알지 못하는 상태에서 군집 개수 k 값을 특정 범위에서 실험해 보는 것도 좋습니다.

참고로, 군집 개수가 증가할수록 거리 합은 줄어듭니다. 예를 들어, 군집 개수가 3에서 4, 그리고 5로 증가하면 거리 합은 2459.98에서 1771.1, 1647.26으로 줄어듭니다. 따라서 거리 합은 최적의 군집 개수를 결정하는 데 유용하지 않습니다.

국소 최솟값 피하기

기본적으로, kmeans는 일련의 초기 중심 위치값을 임의로 선택하여 군집화 과정을 시작합니다. kmeans 알고리즘은 국소 최솟값인 해로 수렴할 수 있습니다. 즉, kmeans는 어느 한 점을 다른 군집으로 옮기면 거리 총합이 증가하도록 데이터를 분할할 수 있습니다. 그러나 다른 여러 유형의 수치적 최소화 기법과 마찬가지로 kmeans가 도달하는 해는 시작 점에 따라 결정되기도 합니다. 따라서 이 데이터에는 거리 총합이 더 낮은 다른 해(국소 최솟값)가 있을 수 있습니다. 'Replicates' 이름-값 쌍의 인수를 사용하여 여러 해를 테스트해 볼 수 있습니다. 둘 이상의 반복 실험을 지정하면 kmeans가 각 반복 실험마다 다른 중심들을 임의로 선택하여 군집화를 반복하고, 모든 반복 실험 중에서 거리 총합이 가장 낮은 해를 반환합니다.

데이터에서 4개 군집을 찾고, 군집화를 5번 반복 실험합니다. 또한 도시 블록 거리 측정법을 지정하고, 'Display' 이름-값 쌍의 인수를 사용하여 각 해에 대한 거리의 최종 합을 출력합니다.

[idx4,cent4,sumdist] = kmeans(X,4,'Distance','cityblock', ...
    'Display','final','Replicates',5);               
Replicate 1, 2 iterations, total sum of distances = 1771.1.
Replicate 2, 3 iterations, total sum of distances = 1771.1.
Replicate 3, 3 iterations, total sum of distances = 1771.1.
Replicate 4, 6 iterations, total sum of distances = 2300.23.
Replicate 5, 2 iterations, total sum of distances = 1771.1.
Best total sum of distances = 1771.1

반복 실험 4번에서 kmeans가 국소 최솟값을 찾았습니다. 각 반복 실험이 임의로 선택된 서로 다른 초기 중심들의 집합에서 시작되기 때문에 kmeans가 국소 최솟값을 둘 이상 찾는 경우도 있습니다. 그러나 kmeans가 반환하는 최종 해는 모든 반복 실험 중에서 가장 작은 거리 총합을 갖는 해입니다.

kmeans에서 반환된 최종 해에 대해 점-중심 간 거리의 군집 내 총합을 구합니다.

sum(sumdist)
ans = 
1.7711e+03

참고 항목

| |

관련 항목