귀퉁이 서재

머신러닝 - 7. K-평균 클러스터링(K-means Clustering) 본문

머신러닝

머신러닝 - 7. K-평균 클러스터링(K-means Clustering)

Baek Kyun Shin 2019. 7. 29. 23:21

K-means clustering은 비지도 학습의 클러스터링 모델 중 하나입니다. 

클러스터란 비슷한 특성을 가진 데이터끼리의 묶음입니다. (A cluster refers to a collection of data points aggregated together because of certain similarities) (Reference1) 여기서 말하는 비슷한 특성이란 가까운 위치를 의미합니다. 아래 그림에서는 총 3개의 클러스터가 있습니다. 같은 클러스터끼리 같은 색으로 표시를 해놨습니다. 거리가 서로 가까운 데이터끼리 군집(Cluster)을 이루고 있습니다. 

출처: Wikipeida

클러스터링이란 어떤 데이터들이 주어졌을 때, 그 데이터들을 클러스터로 그루핑 시켜주는 것을 의미합니다. 위 데이터들은 처음엔 모두 까만 점이었습니다. 클러스터의 구분이 없었습니다. 하지만 클러스터링을 해줌으로써 서로 같은 클러스터끼리 그루핑이 된 것입니다. (Reference2)

또한, 각 클러스터의 중심을 Centroid라고 합니다. 

K-means Clustering에서 K는 클러스터의 갯수를 뜻합니다. 위 예시에서는 클러스터가 총 3개입니다. 따라서 K도 3입니다. means는 한 클러스터 안의 데이터 중심, 즉 centroid를 뜻합니다. 결론적으로 K-means Clustering은 K개의 Centroid를 기반으로 K개의 클러스터를 만들어주는 것을 의미합니다.

K-means Clustering의 목적은 유사한 데이터 포인트끼리 그루핑 하여 패턴을 찾아내는 것입니다. 프로세스는 아래와 같습니다.

프로세스

1. 얼마나 많은 클러스터가 필요한지 결정 (K 결정)

2. 초기 Centroid 선택
  - 랜덤하게 설정
  - 수동으로 설정
  - Kmean++ 방법

3. 모든 데이터를 순회하며 각 데이터마다 가장 가까운 Centroid가 속해있는 클러스터로 assign

4. Centroid를 클러스터의 중심으로 이동

5. 클러스터에 assign 되는 데이터가 없을 때까지 스텝 3, 4를 반복

위 프로세스를 설명하려면 그림이 상당히 많이 필요합니다. 공간 제약상 유튜브 영상 (kmean 클러스터링 알고리즘 및 파이썬 실습)을 참고해주시기 바랍니다. 아주 간략하고 쉽게 k-means clustering을 설명해놓은 영상입니다.

실습

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
%matplotlib inline

X= -2 * np.random.rand(100,2)
X1 = 1 + 2 * np.random.rand(50,2)
X[50:100, :] = X1
plt.scatter(X[ : , 0], X[ :, 1], s = 50, c = 'b')
plt.show()

위 데이터는 두개의 클러스터로 구분할 수 있다는 걸 쉽게 알 수 있습니다.

from sklearn.cluster import KMeans
Kmean = KMeans(n_clusters=2)
Kmean.fit(X)

클러스터를 2개로 할 것이기 때문에 n_clusters 파라미터를 2로 줬습니다. fit을 해주면 아래와 같은 결과가 나옵니다.

KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
         n_clusters=2, n_init=10, n_jobs=None, precompute_distances='auto',
         random_state=None, tol=0.0001, verbose=0)

init 파라미터의 default 값은 k-mean++입니다. k-mean++는 초기 Centroid를 정하는 방법 중 하나입니다. 먼저 맨 처음 데이터를 centroid1으로 둡니다. enctoid1으로부터 가장 멀리 떨어져 있는 데이터를 centroid2로 둡니다. centroid1과 centroid2로부터 가장 멀리 떨어져 있는 데이터를 centroid3로 둡니다. 이렇게 K번 반복하여 초기 centroid를 정해주는 것입니다. 임의로 정하거나 랜덤하게 정하는 것보다 iteration 횟수를 줄여주어 좀 더 효율적입니다.

max_iter=300으로 되어있습니다. 위에서 설명한 프로세스에서 스텝 3~4를 클러스터에 assign되는 데이터가 없을 때까지 반복한다고 했습니다. 하지만 max_iter를 정해주면 max_iter까지 하거나 assign 되는 데이터가 없을 때까지 반복합니다. 웬만하면 스텝 3~4의 iteration이 300번 이전에 끝나기 때문에 default가 300입니다.

Kmean.cluster_centers_

>>> array([[ 2.02664296,  1.88206121],
          [-1.01085055, -1.03792754]])

두 centroid의 위치입니다. 두 centroid와 함께 plot을 그려보겠습니다.

plt.scatter(X[ : , 0], X[ : , 1], s =50, c='b')
plt.scatter(-0.94665068, -0.97138368, s=200, c='g', marker='s')
plt.scatter(2.01559419, 2.02597093, s=200, c='r', marker='s')
plt.show()

K-means 단점

K-means Clustering은 local minimum이 발생할 수 있다는 단점이 있습니다.

아래의 데이터를 두 개의 클러스터로 나누려면 어떻게 해야할까요?

출처: Udacity

바로 왼쪽 6개 데이터 묶음과 오른쪽 6개 데이터 묶음을 각각의 클러스터로 나누어주면 됩니다. 하지만 초기에 설정된 Centroid가 아래와 같다면 클러스터를 위, 아래로 나눌 것입니다.

출처: Udacity

위쪽 6개 점은 위쪽 Centroid와 가장 가깝고, 아래쪽 6개 점은 아래쪽 Centroid와 가깝기 때문에 이대로 iteration이 끝나버립니다. 이런 현상을 local minimum이라고 합니다. 하지만 centroid 위치를 양 옆으로 조금만 움직여도 클러스터는 우리가 원하는 대로 오른쪽, 왼쪽으로 바뀔 것입니다. 

참고

클러스터링 시각화 시뮬레이션 사이트: naftali harris에 가시면 k-means clustering을 시각화하여 볼 수 있습니다. 초기 Centroid, data 종류, 클러스터 개수를 직접 골라서 k-means clustering 시뮬레이션해볼 수 있습니다.

References

Reference1: towardsdatascience (Understanding K-means Clustering in Machine Learning)

Reference2: Wikipedia (Cluster analysis)

Reference3: youtube (kmean 클러스터링 알고리즘 및 파이썬 실습)

Reference4: naftali harris (Visualizing K-Means Clustering)

Comments