데이터를 자동으로 분류할 수 있는 클러스터링 알고리즘 중 가장 널리 사용되는 K-means Clustering!
이번 포스트에서는 이론적인 배경부터, 저사양 CPU에서도 무리 없이 돌릴 수 있는 실습 코드까지 깔끔하게 정리해볼게요.
목차
- K-means Clustering이란?
- 작동 원리 (알고리즘 흐름)
- 수학적 개념 정리
- 장점과 단점
- 실행 가능한 예제 코드 (CPU 저사양 OK!)
- 마무리 요약
1. K-means Clustering 이란?
K-means는 데이터를 **K개의 클러스터(군집)**로 나누는 대표적인 비지도 학습(Unsupervised Learning) 알고리즘입니다.
각 클러스터는 중심점(centroid)을 가지며, 데이터는 가장 가까운 중심점에 소속됩니다.
📌 예를 들어, 고객을 3개의 소비 성향 그룹으로 나누고 싶을 때 사용할 수 있어요.
2. 작동 원리
K-means는 아래 4단계를 반복하며 군집을 형성합니다.
- 초기 중심점 설정 (보통 랜덤 또는 K-means++ 방식)
- 데이터 포인트를 가장 가까운 중심점에 할당
- 각 클러스터의 평균으로 중심점 업데이트
- 중심점 변화가 없으면 종료 (또는 max 반복 횟수까지)
3. 수학적으로 살펴보기
유클리드 거리
데이터 간의 거리는 보통 **유클리드 거리(Euclidean Distance)**로 계산합니다:
최적화 목표 (Objective)
K-means는 Within-Cluster Sum of Squares (WCSS) 를 최소화하는 것이 목표입니다:
$$J = \sum_{i=1}^{k} \sum_{x \in C_i} \|x - \mu_i\|^2$$
- $C_i$: i번째 클러스터
- $\mu_i$: 클러스터 중심점
4. 장점과 단점
장점
- 구현이 매우 간단하고 빠름
- 대용량 데이터에서도 확장 가능
- 널리 사용됨
단점
- K를 미리 알아야 함
- 이상치(outlier)에 민감
- 구형(원형)이 아닌 클러스터에 부적합
5. 실습 코드: 저사양 CPU에서도 OK!
아래 코드는 scikit-learn을 이용한 간단한 2D 데이터 클러스터링 예제입니다.
저사양 환경(CPU 1코어, 1GB RAM 정도)에서도 무리 없이 실행됩니다.
필요한 라이브러리 설치
pip install numpy matplotlib scikit-learn
전체 코드
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# 1. 2D 클러스터 데이터 생성
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=0)
# 2. K-means 모델 학습
kmeans = KMeans(n_clusters=3, random_state=0, n_init='auto')
kmeans.fit(X)
# 3. 클러스터 예측 결과
y_kmeans = kmeans.predict(X)
# 4. 시각화
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=40, cmap='viridis')
# 중심점 시각화
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5, marker='X')
plt.title("K-means Clustering 결과")
plt.xlabel("X1")
plt.ylabel("X2")
plt.show()
결과
- 3개의 색깔로 나뉜 점들이 각각 클러스터
- 빨간 X는 각 클러스터의 중심점
마무리 요약
알고리즘 종류 | 비지도 학습 (Unsupervised) |
사용 목적 | 자동으로 데이터 분류 |
주요 개념 | 중심점, 유클리드 거리, WCSS 최소화 |
실습 환경 | 저사양 CPU에서도 실행 가능 |
🔗 참고 자료
https://matplotlib.org/stable/tutorials/introductory/pyplot.html
matplotlib.org
make_blobs
Gallery examples: Release Highlights for scikit-learn 1.1 Release Highlights for scikit-learn 0.23 Probability Calibration for 3-class classification Probability calibration of classifiers Normal, ...
scikit-learn.org
KMeans
Gallery examples: Release Highlights for scikit-learn 1.1 Release Highlights for scikit-learn 0.23 A demo of K-Means clustering on the handwritten digits data Bisecting K-Means and Regular K-Means ...
scikit-learn.org