← 주차 목록

Week 6. 비지도학습 — 군집화와 차원 축소

라벨 없이 데이터의 숨은 구조를 찾습니다. K-평균, DBSCAN, 그리고 PCA로 세상을 단순하게 보는 법.

이번 주에 배우는 것

  1. 비지도학습이란 무엇인가
  2. K-평균 군집화 알고리즘
  3. DBSCAN — 밀도 기반 군집화
  4. PCA — 주성분 분석
  5. 차원 축소의 의미

1. 라벨 없는 세상 — 비지도학습의 존재 이유

현실에서 라벨이 달린 데이터는 비싸고 드뭅니다. 의료 영상에 종양 위치를 표시하고, 이미지에 경계 상자를 치고, 텍스트에 감정을 박는 일은 모두 사람 손이 필요합니다. 대규모 라벨링 프로젝트(ImageNet은 수년간 수만 명이 참여)는 수백만 달러 수준의 비용이 들고, 의료·법률처럼 전문가가 필요한 분야는 더 비쌉니다.

반면 라벨이 없는 데이터는 거의 무한합니다 — 인터넷 그 자체, 수십억 장의 웹 이미지, 수조 개의 텍스트 토큰, 매일 쌓이는 센서 로그. 이 엄청난 양의 자원을 라벨 없이 학습에 쓸 수 있다면 얼마나 좋을까요? 그 질문에 답하는 것이 바로 비지도학습(unsupervised learning)입니다.

비지도학습의 목표는 세 가지 정도로 요약할 수 있습니다:

최근에는 비지도학습의 힘이 자기지도학습(self-supervised learning)으로 크게 확장되어 BERT, GPT, CLIP 같은 대형 모델들이 모두 라벨 없는 데이터에서 사전 훈련됩니다. W13 Transformer/LLM의 기반이 되는 핵심 개념입니다.

2. K-평균(K-means) — 가장 사랑받는 군집화

K-평균은 1957년 Stuart Lloyd가 펄스 코드 변조를 위해 제안한 알고리즘인데, 너무 단순하고 효과적이라 오늘날까지도 가장 먼저 시도하는 군집화 방법입니다. 두 단계만 반복합니다:

  1. 할당(Assignment): 각 데이터 점을 가장 가까운 중심에 배정.
  2. 갱신(Update): 각 클러스터 중심을 그 클러스터에 속한 점들의 평균으로 이동.

이 두 단계를 변화가 거의 없을 때까지 반복하면 수렴합니다. 놀랍도록 단순하지만, 이 반복이 사실은 다음 비용함수를 좌표별 하강(coordinate descent)으로 최소화하고 있다는 것이 수학적 배경입니다:

$$ J = \sum_{k=1}^{K} \sum_{\mathbf{x} \in C_k} \|\mathbf{x} - \boldsymbol\mu_k\|^2 $$

이 $J$는 "각 점에서 자기 클러스터 중심까지 거리의 제곱 합" = 클러스터 내 분산의 총합. 할당 단계는 $\boldsymbol\mu$를 고정하고 $C$에 대해 최소화, 갱신 단계는 $C$를 고정하고 $\boldsymbol\mu$에 대해 최소화. 두 번 모두 $J$를 감소시키므로 알고리즘은 수렴이 보장됩니다(지역 최솟값으로).

2.1 초기화의 함정과 K-means++

K-평균은 초기 중심을 무작위로 고르는데, 이 선택에 따라 최종 결과가 크게 달라집니다. 나쁜 초기화면 지역 최솟값에 빠져 완전히 이상한 군집이 나오기도 합니다. 해법 두 가지:

2.2 $K$는 어떻게 고르는가 — 엘보우와 실루엣

K-평균의 가장 큰 난점은 사람이 $K$를 미리 정해야 한다는 것입니다. 데이터에 몇 개 군집이 있는지 모를 때 어떻게 할까요? 두 가지 휴리스틱:

2.3 K-평균의 한계

단점도 분명합니다:

이러한 한계를 극복하는 대안이 다음 섹션의 DBSCAN입니다.

🎮 인터랙티브: K-평균 단계별 실행

"한 단계"를 누르면 할당과 갱신이 한 번씩 실행됩니다. "자동"은 수렴까지 돌립니다. 중심은 별표로 표시됩니다.

K는 어떻게 정하나? 엘보우 방법(클러스터 수에 따른 비용 곡선의 꺾이는 지점)이나 실루엣 점수 같은 휴리스틱을 씁니다. 정답은 대개 도메인 지식에서 옵니다.

3. DBSCAN — 밀도가 곧 클러스터

K-평균은 클러스터가 둥글고 비슷한 크기임을 암묵적으로 가정합니다. 그래서 길쭉하거나 반달, 도넛 모양 클러스터에선 실패합니다. DBSCAN(Density-Based Spatial Clustering of Applications with Noise, Ester et al. 1996)은 전혀 다른 관점을 취합니다: "클러스터는 밀도가 높은 점들이 서로 연결된 영역이고, 주변에 점이 거의 없는 점은 잡음(noise)"입니다.

DBSCAN이 사용하는 두 하이퍼파라미터:

각 점은 이 정의에 따라 세 종류로 분류됩니다:

알고리즘은 단순합니다: 임의의 핵심점에서 시작해 $\varepsilon$-이웃에 있는 모든 점을 같은 클러스터로 확장, 그중 핵심점이 있으면 또 그 이웃으로 확장... 이것을 더 확장할 수 없을 때까지 반복. 다음 미방문 핵심점에서 새 클러스터 시작.

3.1 DBSCAN의 장단점

장점이 많습니다:

단점:

실전 팁 — minPts 기본값은 $2d$ ($d$는 특징 차원). 2D면 4 정도가 무난. $\varepsilon$은 각 점의 $k$번째 최근접 이웃까지 거리를 정렬해 "팔꿈치"가 보이는 지점으로 설정. scikit-learn의 NearestNeighbors로 쉽게 계산.

4. PCA — 주성분 분석으로 차원 줄이기

100차원 데이터를 어떻게 시각화할까요? 모니터는 2D입니다. 주성분 분석(Principal Component Analysis, PCA)은 칼 피어슨이 1901년에 제안한 고전적 기법으로, "분산이 가장 큰 방향"을 찾아 그 방향으로 데이터를 투영해 차원을 줄입니다. 정보를 가장 많이 보존하면서 차원을 낮추는 최적의 선형 방법입니다.

왜 분산이 큰 방향이 "가장 중요"한가? 데이터가 얼마나 퍼져 있는지가 곧 "이 방향이 담고 있는 정보량"이기 때문입니다. 어떤 방향으로 모든 점이 거의 같은 값이라면(분산 0) 그 방향은 무시해도 됩니다. 반대로 점들이 넓게 퍼진 방향에는 많은 변별력이 들어 있습니다.

4.1 공분산 행렬과 고유분해

수학적으로 PCA는 데이터 행렬 $\mathbf X$ (중심 정렬된 $N \times d$)에서 공분산 행렬을 계산하는 것부터 시작합니다:

$$ \mathbf\Sigma = \frac{1}{N-1}\mathbf X^\top \mathbf X $$

$\mathbf\Sigma$는 $d \times d$ 대칭 양정치 행렬로, 각 $(i, j)$ 원소가 특징 $i$와 $j$의 공분산입니다. 대각 원소는 각 특징의 분산.

이 행렬을 고유분해(eigendecomposition)하면:

$$ \mathbf\Sigma \mathbf v_i = \lambda_i \mathbf v_i, \quad i = 1, \dots, d $$

고유벡터 $\mathbf v_i$가 곧 주성분(principal component)이고, 대응하는 고윳값 $\lambda_i$가 그 방향의 분산입니다. 고윳값을 큰 순서로 정렬하면 $\lambda_1 \ge \lambda_2 \ge \dots \ge \lambda_d$, 첫 번째 고유벡터 $\mathbf v_1$이 "분산이 가장 큰 방향" = 첫 번째 주성분이 됩니다.

데이터를 $k$차원으로 줄이려면 상위 $k$개 고유벡터로 만든 $d \times k$ 행렬 $\mathbf V_k$를 이용해:

$$ \mathbf Z = \mathbf X \mathbf V_k $$

각 샘플이 $k$차원 벡터가 되고, 원래의 분산 중 $\sum_{i=1}^k \lambda_i / \sum_{i=1}^d \lambda_i$만큼 보존됩니다. 이 비율을 설명 분산 비율(explained variance ratio)이라 부릅니다. 실전에서 "95%의 분산을 유지하는 최소 $k$"를 고르는 방식이 자주 쓰입니다.

4.2 PCA의 기하학적 의미

PCA를 기하학적으로 보면 "데이터를 가장 잘 근사하는 저차원 평면(또는 초평면)을 찾는 것"입니다. 2D에서 PCA 1차원 투영은 "점들을 가장 가까이 지나는 직선"과 같고, 이는 사실 최소제곱법과도 관련이 있지만 수평/수직 잔차가 아니라 직각 잔차를 최소화합니다 (total least squares). 그래서 PCA는 축의 선택에 독립적입니다.

정규화(standardization)이 거의 항상 필요 — PCA는 분산을 기준으로 하기 때문에, 단위가 다른 특징(키 cm, 체중 kg)을 그냥 쓰면 큰 숫자 특징이 지배합니다. 반드시 W2 §표준화처럼 각 특징을 $z$-score로 변환한 뒤 PCA를 적용하세요.

4.3 PCA의 응용

딥러닝 시대에는 PCA가 오토인코더(autoencoder)로 일반화됩니다. 오토인코더는 "비선형 PCA"로 볼 수 있고, 실제로 선형 활성화를 쓴 1층 오토인코더의 잠재 공간은 PCA와 수학적으로 같은 방향을 학습합니다.

🎮 인터랙티브: PCA 1차원 투영

2D 타원 데이터를 PCA의 첫 번째 주성분 방향으로 투영합니다. 회전된 빨간 직선이 첫 번째 주성분 축, 그 위 점들이 투영 결과입니다.

5. 코드 예제

from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA

km = KMeans(n_clusters=3, n_init=10).fit(X)
print(km.labels_)

db = DBSCAN(eps=0.5, min_samples=5).fit(X)
print(db.labels_)   # -1은 잡음

pca = PCA(n_components=2).fit(X_high)
X_low = pca.transform(X_high)
print(pca.explained_variance_ratio_)

📖 더 깊이 공부하기