클러스터링 (Clustering)¶
난이도: 초급~중급
선수 지식: 거리 메트릭, 기초 확률/통계
관련 문서: k-NN | 차원 축소 | 손실 함수 | 볼록성
개요¶
클러스터링(Clustering)은 비지도 학습(Unsupervised Learning)의 대표적 기법으로, 레이블 없이 데이터를 유사한 그룹(클러스터)으로 나누는 것이 목적이다.
주요 클러스터링 알고리즘: - K-Means: 중심점 기반, 가장 널리 사용 - DBSCAN: 밀도 기반, 임의 형태 클러스터 발견 - 계층적 클러스터링 (Hierarchical Clustering): 덴드로그램 기반, 다중 스케일 분석 - GMM (Gaussian Mixture Models): 확률 기반, 소프트 할당
핵심 개념¶
1. K-Means¶
알고리즘 (Lloyd's Algorithm)¶
- k개의 중심점(centroid) 초기화
- 각 데이터 포인트를 가장 가까운 중심점에 할당
- 각 클러스터의 중심점을 해당 클러스터 평균으로 갱신
- 수렴할 때까지 2-3 반복
목적 함수¶
이를 군집 내 제곱합 (WCSS, Within-Cluster Sum of Squares) 또는 관성(inertia)이라고 한다.
초기화 전략¶
| 방법 | 설명 | 특징 |
|---|---|---|
| 무작위 | 랜덤으로 k개 선택 | 불안정, 나쁜 수렴 가능 |
| K-Means++ | \(D(x)^2\)에 비례하여 초기 중심 선택 | 표준 방법, 수렴 보장 개선 |
| K-Means|| | K-Means++의 병렬 버전 | 대규모 데이터용 |
k 선택 방법¶
| 방법 | 설명 |
|---|---|
| 엘보우 방법 (Elbow Method) | WCSS vs k 그래프에서 "팔꿈치" 지점 |
| 실루엣 점수 (Silhouette Score) | 클러스터 내 응집도 vs 클러스터 간 분리도 |
| 갭 통계량 (Gap Statistic) | 실제 WCSS와 랜덤 분포의 WCSS 차이 |
| 정보 기준 (BIC/AIC) | 모델 복잡도 페널티 포함 |
가정과 한계¶
- 가정: 구형 클러스터, 동일 분산, 동일 크기
- 한계: 초기화에 민감, 볼록 클러스터만 가능, k를 사전 지정, 이상치에 민감
변형¶
- Mini-batch K-Means: 배치 단위 업데이트, 대규모 데이터에 빠름
- K-Medoids (PAM): 중심을 실제 데이터 포인트로, 이상치에 강건
- K-Modes: 범주형 데이터용
- K-Prototypes: 혼합 데이터 (연속 + 범주)
복잡도¶
\(O(nkdi)\) (\(n\): 데이터 수, \(k\): 클러스터 수, \(d\): 차원, \(i\): 반복 횟수)
2. DBSCAN¶
Density-Based Spatial Clustering of Applications with Noise
파라미터¶
- \(\epsilon\) (eps): 이웃 반경
- MinPts: 코어 포인트가 되기 위한 최소 이웃 수
포인트 분류¶
flowchart LR
A[데이터 포인트] --> B{ε 내 이웃 ≥ MinPts?}
B -->|예| C[코어 포인트<br/>Core Point]
B -->|아니오| D{코어 포인트의 ε 내?}
D -->|예| E[경계 포인트<br/>Border Point]
D -->|아니오| F[노이즈<br/>Noise] 알고리즘¶
- 임의의 미방문 포인트 선택
- \(\epsilon\)-이웃 계산
- 코어 포인트면 클러스터 확장 (밀도 도달성으로 연결)
- 코어가 아니면 노이즈로 표시 (나중에 경계로 바뀔 수 있음)
파라미터 선택¶
- k-distance plot으로 \(\epsilon\) 결정: k=MinPts에서의 거리를 정렬, 급격한 변화 지점이 적정 \(\epsilon\)
- MinPts \(\ge d + 1\) (차원 + 1) 이 경험적 가이드
장단점¶
| 장점 | 단점 |
|---|---|
| 임의 형태 클러스터 발견 | 밀도가 다른 클러스터에 약함 |
| 노이즈 자동 식별 | \(\epsilon\), MinPts에 민감 |
| k 사전 지정 불필요 | 고차원에서 성능 저하 |
| 결정론적 | 경계 포인트 할당은 순서 의존 |
변형¶
- HDBSCAN: 계층적 + 밀도 기반, 다양한 밀도 처리 가능
- OPTICS: 순서 기반, 다양한 밀도에서 클러스터 추출
3. 계층적 클러스터링 (Hierarchical Clustering)¶
병합형 (Agglomerative, Bottom-up)¶
- 각 포인트를 개별 클러스터로 시작
- 가장 가까운 클러스터 쌍을 병합
- 원하는 k개가 될 때까지 반복
연결 기준 (Linkage Criteria)¶
| 연결 방법 | 정의 | 특징 |
|---|---|---|
| 단일 연결 (Single) | 클러스터 간 최소 거리 | 체이닝 문제 |
| 완전 연결 (Complete) | 클러스터 간 최대 거리 | 조밀한 클러스터 |
| 평균 연결 (Average) | 평균 쌍별 거리 | 절충안 |
| Ward | 군집 내 분산 증가 최소화 | K-Means와 유사, 가장 많이 사용 |
덴드로그램 (Dendrogram)¶
- 병합 이력의 트리 시각화
- 원하는 수준에서 "잘라서" k개의 클러스터 획득
- 다중 스케일(multi-scale) 분석 가능
분할형 (Divisive, Top-down)¶
- 하나의 클러스터에서 시작하여 재귀적으로 분할
- 실무에서는 병합형이 훨씬 일반적
복잡도¶
- 시간: \(O(n^3)\) (일반), \(O(n^2 \log n)\) (일부 구현)
- 공간: \(O(n^2)\) (거리 행렬)
4. 가우시안 혼합 모델 (GMM)¶
모델¶
각 클러스터가 가우시안 분포를 따른다고 가정하고, 데이터가 이들의 혼합으로부터 생성되었다고 모델링한다.
EM 알고리즘¶
E-step (기대): 각 포인트의 클러스터별 소속 확률(responsibility) 계산
M-step (최대화): \(\boldsymbol{\mu}_k\), \(\boldsymbol{\Sigma}_k\), \(\pi_k\) 갱신
K-Means와의 비교¶
| 속성 | K-Means | GMM |
|---|---|---|
| 할당 방식 | 하드 (0 또는 1) | 소프트 (확률적) |
| 클러스터 형태 | 구형만 | 타원형 가능 |
| 불확실성 | 없음 | 소속 확률 제공 |
| 공분산 제약 | 등방성 | full, tied, diagonal, spherical |
\(\boldsymbol{\Sigma}_k = \sigma^2\mathbf{I}\) (spherical)로 제약하면 K-Means와 동치가 된다.
공분산 유형¶
| 유형 | 파라미터 수 | 클러스터 형태 |
|---|---|---|
| full | \(O(d^2)\) per cluster | 완전 자유 (타원) |
| tied | \(O(d^2)\) 공유 | 동일 형태 |
| diagonal | \(O(d)\) per cluster | 축 정렬 타원 |
| spherical | \(O(1)\) per cluster | 구형 |
모델 선택¶
BIC (Bayesian Information Criterion)와 AIC (Akaike Information Criterion)로 K 결정.
상세 비교표¶
| 속성 | K-Means | DBSCAN | 계층적 | GMM |
|---|---|---|---|---|
| k 사전 지정 | 필요 | 불필요 | 선택적 | 필요 |
| 클러스터 형태 | 구형 | 임의 | 연결 방법 의존 | 타원형 |
| 노이즈 처리 | 불가 | 자동 식별 | 불가 | 어느 정도 |
| 확장성 | 최고 | 양호 | 나쁨 | 중간 |
| 소프트 할당 | 불가 | 불가 | 불가 | 가능 |
| 결정론적 | 아니오 | 예 | 예 | 아니오 |
flowchart TD
A[클러스터링 알고리즘 선택] --> B{클러스터 형태를 아는가?}
B -->|구형으로 예상| C{클러스터 수를 아는가?}
C -->|예| D[K-Means]
C -->|아니오| E[K-Means + 엘보우/실루엣]
B -->|임의 형태| F{노이즈가 많은가?}
F -->|예| G[DBSCAN / HDBSCAN]
F -->|아니오| H{확률적 할당 필요?}
H -->|예| I[GMM]
H -->|아니오| J[계층적 클러스터링]
A --> K{다양한 스케일에서 분석?}
K -->|예| L[계층적 클러스터링] 클러스터링 평가 지표 (레이블 없이)¶
| 지표 | 범위 | 설명 |
|---|---|---|
| 실루엣 점수 (Silhouette) | [-1, 1] | 1에 가까울수록 좋음 |
| Davies-Bouldin Index | [0, ∞) | 0에 가까울수록 좋음 |
| Calinski-Harabasz Index | [0, ∞) | 클수록 좋음 |
실루엣 점수 공식:
- \(a(i)\): 같은 클러스터 내 평균 거리
- \(b(i)\): 가장 가까운 다른 클러스터까지의 평균 거리
언제 사용하는가¶
| 상황 | 추천 알고리즘 |
|---|---|
| 대규모 데이터, 구형 클러스터 | K-Means / Mini-batch K-Means |
| 임의 형태 클러스터, 노이즈 포함 | DBSCAN / HDBSCAN |
| 다중 스케일 분석, 시각적 탐색 | 계층적 클러스터링 |
| 확률적 소속, 불확실성 필요 | GMM |
| 이상치에 강건해야 하는 경우 | K-Medoids, DBSCAN |
흔한 오해와 함정¶
1. "K-Means는 항상 수렴한다"¶
- 맞다. 하지만 지역 최적해(local optimum)에 수렴한다. 전역 최적이 아닐 수 있으므로 여러 번 다른 초기화로 실행해야 한다.
2. "K-Means의 클러스터는 항상 같은 크기이다"¶
- K-Means는 같은 크기를 가정하지는 않지만, 불균형한 크기에서 성능이 저하되는 경향이 있다.
3. "DBSCAN은 모든 상황에서 K-Means보다 낫다"¶
- DBSCAN은 밀도가 균일하지 않은 데이터에서 어려움을 겪는다. 또한 파라미터(\(\epsilon\), MinPts) 튜닝이 필요하다.
4. "클러스터링 결과는 객관적이다"¶
- 클러스터링은 본질적으로 주관적이다. 같은 데이터에 대해 다른 알고리즘/파라미터는 다른 결과를 줄 수 있으며, 어떤 것이 "정답"인지 판단하기 어려울 수 있다.
다른 주제와의 연결¶
- k-NN: 거리 기반 접근, 거리 메트릭 공유
- 차원 축소: 클러스터링 전 전처리, 시각화
- 볼록성: K-Means 목적 함수는 비볼록 (지역 최적해)
- VC 차원: 비지도 학습의 복잡도 이론
자주 묻는 면접 질문¶
- K-Means 수렴이 보장되는가?
-
예, 지역 최적해에는 반드시 수렴. 목적 함수가 매 반복마다 단조 감소하고 유한한 할당 경우의 수
-
K-Means가 초기화에 민감한 이유는?
-
비볼록 최적화 문제이므로 초기점에 따라 다른 지역 최적에 수렴
-
DBSCAN vs K-Means: 각각 언제 선호하는가?
-
DBSCAN: 임의 형태, 노이즈 존재, k 모름. K-Means: 구형 클러스터, 대규모, k를 알거나 추정 가능
-
하드 클러스터링과 소프트 클러스터링의 차이는?
-
하드: 각 포인트가 정확히 하나의 클러스터에 속함 (K-Means). 소프트: 확률적 소속 (GMM)
-
레이블 없이 클러스터링을 평가하는 방법은?
- 내부 지표: 실루엣 점수, Davies-Bouldin, Calinski-Harabasz
코드 예시¶
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.mixture import GaussianMixture
from sklearn.metrics import silhouette_score
# K-Means
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10, random_state=42)
labels = kmeans.fit_predict(X)
print(f"Silhouette: {silhouette_score(X, labels):.3f}")
# DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
labels = dbscan.fit_predict(X)
n_noise = (labels == -1).sum()
print(f"Clusters: {len(set(labels)) - (1 if -1 in labels else 0)}, Noise: {n_noise}")
# 계층적 클러스터링
agg = AgglomerativeClustering(n_clusters=3, linkage='ward')
labels = agg.fit_predict(X)
# GMM
gmm = GaussianMixture(n_components=3, covariance_type='full', random_state=42)
labels = gmm.fit_predict(X)
proba = gmm.predict_proba(X) # 소프트 할당
# 엘보우 방법으로 k 선택
inertias = []
for k in range(1, 11):
km = KMeans(n_clusters=k, random_state=42)
km.fit(X)
inertias.append(km.inertia_)
용어 정리¶
| 영어 | 한국어 |
|---|---|
| Clustering | 클러스터링 (군집화) |
| Centroid | 중심점 (무게중심) |
| Inertia (WCSS) | 관성 (군집 내 제곱합) |
| Silhouette Score | 실루엣 점수 |
| Dendrogram | 덴드로그램 |
| Core Point | 코어 포인트 |
| Noise Point | 노이즈 포인트 |
| Soft Clustering | 소프트 클러스터링 |
| Hard Clustering | 하드 클러스터링 |
| Linkage | 연결 방법 |
참고 자료¶
- MacQueen (1967) - "Some Methods for Classification and Analysis of Multivariate Observations"
- Arthur & Vassilvitskii (2007) - "k-means++: The Advantages of Careful Seeding"
- Ester et al. (1996) - "A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise" (DBSCAN)
- McInnes et al. (2017) - "hdbscan: Hierarchical density based clustering"
- Dempster, Laird, Rubin (1977) - "Maximum Likelihood from Incomplete Data via the EM Algorithm"