본문 바로가기
[AI] - Machine Learning

# 16. 군집화 알고리즘 (K-Means Clustering)

by Bebsae 2021. 12. 9.

이번 포스트에서는 저번 포스트에서 다루었던 군집화 알고리즘 중 대표적인 방법인 K-Means Clustering에 대해 알아보겠다. K-Means Clustering 알고리즘은 이름에서 알 수 있다시피 K개의 군집을 정하며, 데이터들의 평균 중심(거리의 평균)을 각 군집의 중심점으로 삼는다.

 

K-Means Clustering 매커니즘 / 출처 : https://ai-creator.tistory.com/591

 

  • STEP 1 : 군집의 갯수만큼 임의의 위치에 중심점을 정한다.
  • STEP 2 : 각 데이터를 가장 가까운 중심점에 해당하는 군집에 소속시킨다.
  • STEP 3 : 각 군집에 속해있는 데이터들의 평균 거리를 갖는 중심위치로 군집의 중심점을 이동시킨다.

 

STEP 2~3의 과정을 반복하고, 중심점의 위치에 변화가 없을 경우 군집화 과정을 멈춘다. 알고리즘 자체는 단순하지만, 피처 수가 많아지면 기하급수적으로 느려지는 현상이 있기 때문에, PCA와 같은 차원 축소 알고리즘을 통해 피처 수를 줄여주어야 한다.

 

$X = C_1 \cup C_2 \cup .. \cup C_k, C_i \cap C_j = \varnothing$

$argmin_{C}\sum^K_{i=1}\sum_{x \in C_{i}} \|x_j - c_i \|^2$

 

K-Means Clustering 알고리즘을 수식화하면 다음과 같다. 먼저 X가 의미하는 것은 모든 군집들을 의미한다. 그리고 $C_i \cap C_j = \varnothing$은 각 군집은 상호배타적임을 의미한다. $x_j$는 $i$번째 군집의 데이터들을 의미하고, $c_i$는 해당 군집의 중심점을 의미한다. 즉, 모든 군집들이 군집의 중심점과 해당 군집안에 존재하는 모든 데이터들의 거리가 최소가 되도록 해야한다.

 

Scikit-learn을 통한 K-Means Clustering

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# iris 데이터셋 로드 후 데이터프레임으로 변환
iris = load_iris()
irisDF = pd.DataFrame(data=iris.data, columns=['sepal_length','sepal_width','petal_length','petal_width'])

# KMeans 인스턴스 생성 후 iris 데이터 셋 학습
kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300,random_state=0)
kmeans.fit(irisDF)

# KMeans 인스턴스의 라벨 출력
print(kmeans.labels_)
"""
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 0 3 0 3 0 3 0 0 0 0 3 0 3 0 0 3 0 3 0 3 3
 3 3 3 3 3 0 0 0 0 3 0 3 3 3 0 0 0 3 0 0 0 0 0 3 0 0 2 3 2 2 2 2 0 2 2 2 3
 3 2 3 3 2 2 2 2 3 2 3 2 3 2 2 3 3 2 2 2 2 2 3 3 2 2 2 3 2 2 2 3 2 2 2 3 3
 2 3]
 """
 
 # 붓꽃들의 품종과 군집을 토대로 그룹화 후 sepal_length 의 갯수를 출력
irisDF['target'] = iris.target
irisDF['cluster']=kmeans.labels_
iris_result = irisDF.groupby(['target','cluster'])['sepal_length'].count()
print(iris_result)
"""
target  cluster
0       1          50
1       0          27
        3          23
2       0           1
        2          32
        3          17
Name: sepal_length, dtype: int64
"""

 

위 코드는 사이킷 런을 통해서 K-Means Clustering을 수행하는 코드이다. KMeans 클래스의 파라미터는 다음과 같다. 다음 포스트에서는 군집화를 적절하게 수행했는지 확인할 수 있는 지표인 실루엣 계수와 inertia_에 대해 알아보겠다.

 

참고

https://ai-creator.tistory.com/591

 

[머신러닝 기초] 비지도학습(Unsupervised-learning) - 군집화(Clustering)

ㅁ 들어가기 ㅁ 군집화 알고리즘 종류 ㅁ 군집 평가 ㅁ 군집화 알고리즘 - Kmeans ㅁ 군집화 알고리즘 - DBSCAN ㅁ 들어가기 우리가 트럼프 카드를 군집을 만들 때 군집의 수를 과연 둘로 하는 것이

ai-creator.tistory.com

https://ratsgo.github.io/machine%20learning/2017/04/19/KC/

 

K-평균 군집화(K-means Clustering) · ratsgo's blog

이번 글에서는 K-평균 군집화(K-means Clustering)에 대해 살펴보겠습니다. (줄여서 KC라 부르겠습니다) 이번 글은 고려대 강필성 교수님과 역시 같은 대학의 김성범 교수님 강의를 정리했음을 먼저 밝

ratsgo.github.io

 

댓글