이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

k-평균 군집화

k-평균 군집화 소개

k-평균 군집화는 분할 방법입니다. 함수 kmeans는 데이터를 k개의 상호 배타적인 군집으로 분할하고 각 관측값을 할당한 군집의 인덱스를 반환합니다. 비유사성 측정값으로 구성된 더 큰 크기의 집합을 대상으로 계산되는 계층적 군집화와 달리, k-평균 군집화는 실제 관측값을 대상으로 수행되며 단일 수준의 군집을 생성합니다. 이러한 차이는 k-평균 군집화가 계층적 군집화보다 대량의 데이터에 더 적합한 경우가 많다는 것을 의미합니다.

kmeans는 데이터의 각 관측값을 공간적 위치를 갖는 객체로 취급합니다. 이 함수는 객체가 각 군집 내에서는 최대한 서로 가까이 있고 다른 군집 내의 객체와는 최대한 멀리 있도록 하는 분할을 찾습니다. 군집화를 수행할 데이터 종류에 따라 5가지 거리 측정법 중에서 선택할 수 있습니다.

분할의 각 군집은 해당 멤버 객체와 그 중심에 의해 정의됩니다. 각 군집의 중심은 해당 군집에 포함된 모든 객체로부터의 거리의 합이 최소화되는 지점입니다. kmeans는 지정된 측정법에 따른 합이 최소화되도록 각 거리 측정법에 대해 군집 중심을 서로 다르게 계산합니다.

군집 중심의 초기값에 대한 파라미터와 최대 반복 횟수에 대한 파라미터를 비롯한 여러 선택적 입력 파라미터를 kmeans에 사용하여 최소화의 세부 사항을 제어할 수 있습니다. 기본적으로, kmeans는 군집 중심 초기화와 제곱 유클리드 측정법에 k-평균++ 알고리즘을 사용하여 거리를 결정합니다.

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

다음 예제에서는 점을 3개, 4개, 5개 군집으로 분할한 결과를 분석함으로써 4차원 데이터에서 가능한 군집화를 살펴봅니다.

참고

이 예제의 각 부분은 새로운 상태를 설정하지 않고 순차적으로 난수를 생성하기 때문에 여기 표시된 결과를 그대로 재현하려면 모든 단계를 순차적으로 수행해야 합니다. 단계를 순차적으로 수행하지 않으면 답은 기본적으로 동일하지만, 중간 결과, 반복 횟수 또는 실루엣 플롯의 순서가 달라질 수 있습니다.

우선, 일부 데이터를 불러옵니다.

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

   560     4

이러한 데이터가 4차원이어서 쉽게 시각화할 수 없더라도, kmeans를 사용하면 데이터 내에 그룹 구조가 존재하는지 여부를 조사할 수 있습니다. 원하는 군집 개수인 k3으로 하여 kmeans를 호출합니다. 이 예에서는 도시 블록 거리 측정법을 지정하고 군집 중심 초기화에 디폴트 k-평균++ 알고리즘을 사용합니다.

idx3 = kmeans(X,3,'Distance','cityblock');

kmeans에서 군집 인덱스 출력값을 사용하여 실루엣 플롯을 생성함으로써 결과로 생성된 군집이 얼마나 잘 분리되었는지 파악할 수 있습니다. 실루엣 플롯은 하나의 군집에 포함된 각 점이 인접 군집에 포함된 점에 얼마나 가까운지를 측정한 값을 표시합니다. 이 측정값의 범위는 인접 군집에서 아주 먼 점을 나타내는 +1부터, 해당 군집에 속하는지 다른 군집에 속하는지 뚜렷이 구분되지 않는 점을 나타내는 0을 거쳐, 필시 잘못된 군집에 할당된 것으로 보이는 점을 나타내는 -1까지입니다. silhouette은 이러한 값을 첫 번째 출력값에 반환합니다.

figure
[silh3,h] = silhouette(X,idx3,'cityblock');
h = gca;
h.Children.EdgeColor = [.8 .8 1];
xlabel 'Silhouette Value'
ylabel 'Cluster'

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

올바른 군집 개수 결정하기

군집 개수를 늘려서 kmeans가 데이터를 더 잘 그룹화할 수 있는지 살펴봅니다. 이번에는 '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

이 해의 실루엣 플롯은 이전 해의 3개 군집보다 4개 군집이 더 잘 분리된다는 것을 나타냅니다.

figure
[silh4,h] = silhouette(X,idx4,'cityblock');
h = gca;
h.Children.EdgeColor = [.8 .8 1];
xlabel 'Silhouette Value'
ylabel 'Cluster'

두 해를 비교하는 더욱 정량적인 방법은 두 사례에 대한 평균 실루엣 값을 살펴보는 것입니다.

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

마지막으로, 5개 군집을 사용하여 데이터 군집화를 수행해 봅니다.

idx5 = kmeans(X,5,'Distance','cityblock','Replicates',5);
figure
[silh5,h] = silhouette(X,idx5,'city');
h = gca;
h.Children.EdgeColor = [.8 .8 1];
xlabel 'Silhouette Value'
ylabel 'Cluster'

mean(silh5)
ans = 0.5266

군집 중 2개가 주로 낮은 실루엣 값을 갖는 점을 포함하기 때문에 이 실루엣 플롯은 이것이 적절한 군집 개수가 아닐 가능성이 높다는 사실을 나타냅니다. 데이터에 실제로 군집이 몇 개나 있는지에 대한 사전 지식 없이 일정 범위의 k 값으로 실험해 보는 것도 좋습니다.

국소 최솟값 피하기

다른 여러 유형의 수치적 최소화 기법과 마찬가지로 kmeans가 도달하는 해는 대개 시작 점에 따라 결정됩니다. kmeans는 임의의 한 점을 새 군집에 재할당하면 점-중심 간 거리의 총합은 증가하지만 다른 더 나은 해가 존재하는 국소 최솟값에 도달할 수 있습니다. 그러나 'Replicates' 이름-값 쌍의 인수를 사용하여 이 문제를 해결할 수 있습니다.

4개 군집에 대해 5개 반복 실험을 지정하고 'Display' 이름-값 쌍의 인수를 사용하여 각 해에 대한 거리의 최종 합을 출력합니다.

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

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

sum(sumdist)
ans = 1.7711e+03

관련 항목