K-평균 클러스터링(K-Means)은 데이터를 K개의 클러스터로 자동 분류하는 비지도 학습 알고리즘이다. 각 클러스터의 중심(Centroid)과 데이터 포인트 간 거리를 최소화한다.
동작 알고리즘
1. K개의 중심점을 임의로 초기화
2. 반복:
a. 각 데이터 포인트를 가장 가까운 중심에 할당
b. 각 클러스터의 새 중심을 평균으로 갱신
c. 중심 변화가 없으면 종료
구현
python
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
# 데이터 생성
from sklearn.datasets import make_blobs
X, _ = make_blobs(n_samples=300, centers=4, random_state=42)
# K-Means 클러스터링
kmeans = KMeans(n_clusters=4, init='k-means++', n_init=10, random_state=42)
labels = kmeans.fit_predict(X)
centers = kmeans.cluster_centers_
print(f"관성(Inertia): {kmeans.inertia_:.2f}")
# 관성 = 클러스터 내 거리 제곱합 (작을수록 좋음)
최적 K 찾기 (Elbow Method)
python
inertias = []
for k in range(1, 11):
km = KMeans(n_clusters=k, random_state=42)
km.fit(X)
inertias.append(km.inertia_)
# 그래프에서 "팔꿈치" 지점이 최적 K
# 감소량이 급격히 줄어드는 지점
한계와 대안
| 한계 | 대안 |
|---|
| K를 미리 알아야 함 | DBSCAN, Hierarchical |
| 구형(spherical) 클러스터만 | Gaussian Mixture Model |
| 이상치에 민감 | K-Medoids |
| 스케일 의존 | 정규화 전처리 필요 |
K-Means++ 초기화
무작위 초기화 대신, 기존 중심으로부터 거리에 비례한 확률로 새 중심을 선택 → 수렴 속도 향상, 더 좋은 결과.
관련 개념
- •머신러닝 — K-Means가 속하는 범주
- •PCA — K-Means 전 차원 축소에 사용
- •임베딩 — 클러스터링할 벡터 표현
- •벡터 DB — 유사도 기반 클러스터링