검색
← 모듈 로드맵

차원 축소: PCA · t-SNE · UMAP

강의 · 준전문가 · KAITABASE 정리

PCA를 점 5개로 손계산하고 t-SNE · UMAP 그림을 바르게 읽는 법을 익히는 차원 축소 수업

먼저 알아야 할 것

고유값 · 고유벡터특잇값 분해(SVD)공분산KL 발산

다루는 내용

고차원 데이터를 적은 축으로 요약하는 차원 축소를 다룹니다. PCA를 공분산 행렬의 고유 분해와 SVD로 설명하고 점 5개로 설명 분산 비율(0.9 · 0.1)과 복원 오차를 직접 계산합니다. 성분 수 고르기와 표준화의 필요성을 짚고, t-SNE · UMAP의 원리와 군집 크기 · 거리를 믿으면 안 되는 등 시각화 해석 주의점을 정리합니다.

해설

차원 축소: PCA · t-SNE · UMAP

특성이 수십 · 수백 개인 데이터는 눈으로 볼 수도 없고, 거리 계산도 흐려지며, 계산도 무겁습니다. 차원 축소는 정보를 최대한 남기면서 적은 수의 축으로 데이터를 다시 표현합니다. 이 수업은 가장 기본인 주성분 분석(PCA)을 점 5개로 직접 계산하고, 시각화용 비선형 방법인 t-SNE · UMAP을 어떻게 읽고 어디서 오해하기 쉬운지 정리합니다.

항목내용
참고 자료scikit-learn 사용자 안내서 'Decomposing signals in components' · scikit-learn.org/stable/modules/decomposition.html · Distill 'How to Use t-SNE Effectively'(2016)
트랙 · 수준머신러닝 · 중급
이 수업의 범위차원의 저주, PCA(공분산 · 고유벡터 · SVD), 설명 분산 비율, 성분 수 고르기, 복원 오차, 표준화, t-SNE, UMAP, 시각화 해석 주의점
먼저 알면 좋은 것행렬 곱 · 고유값 · SVD, 평균 · 분산 · 공분산

들어가기 전에

한눈에 보기

  • 차원이 높으면 왜 문제가 되는지(거리 · 계산 · 시각화) 압니다.
  • PCA가 "분산이 가장 큰 방향"을 차례로 찾는 방법이며, 그 방향이 공분산 행렬의 고유벡터라는 것을 손계산으로 확인합니다.
  • 설명 분산 비율로 성분 수를 고르고, 버린 성분의 분산이 곧 복원 오차라는 것을 압니다.
  • t-SNE · UMAP은 이웃 관계를 보존하는 시각화 도구이며, 군집 크기 · 군집 사이 거리를 그대로 믿으면 안 되는 이유를 압니다.

1. 왜 차원을 줄이나

직관(해설용 비유): 사람 키와 몸무게, 신발 크기, 팔 길이를 모두 적은 표가 있다고 합시다. 네 숫자는 서로 강하게 얽혀 있어서 사실상 "몸집" 하나로 상당 부분 요약됩니다. 차원 축소는 이처럼 얽혀 있는 여러 특성을 소수의 새 축으로 요약하는 일입니다.

쓰임설명
시각화사람은 2~3차원만 볼 수 있으므로 고차원 데이터를 평면에 그려 봄
전처리잡음 · 중복 특성을 줄여 다음 모델(k-평균, 회귀 등)을 빠르고 안정적으로
압축저장 · 전송량 줄이기, 임베딩 크기 줄이기

차원의 저주(curse of dimensionality): 차원이 높아지면 같은 개수의 점이 공간을 아주 듬성듬성 채우고, 점들 사이 거리가 서로 비슷비슷해져 "가까움"의 의미가 약해집니다. scikit-learn 안내서도 k-평균 설명에서 고차원에서는 유클리드 거리가 부풀려지므로 먼저 PCA를 쓰면 도움이 될 수 있다고 적고 있습니다.

2. 주성분 분석(PCA)

아이디어

직관: 점들이 비스듬한 타원 모양으로 퍼져 있으면, 타원의 긴 축 방향으로 데이터를 보는 것이 가장 많은 정보를 담습니다. PCA(principal component analysis)는 분산이 가장 큰 방향을 첫 번째 축(제1 주성분)으로 잡고, 그와 직교하면서 남은 분산이 가장 큰 방향을 두 번째 축으로 잡는 식으로 새 좌표축을 만듭니다. 원래 아이디어는 Pearson(1901)의 "점들에 가장 가까운 직선 · 평면 찾기"이고, '주성분'이라는 이름은 Hotelling(1933)에서 나왔습니다.

단계

  1. 각 특성에서 평균을 뺍니다(중심화). 단위가 다르면 표준화까지 합니다.
  2. 공분산 행렬 CC를 계산합니다.
  3. CC의 고유값 λ1≥λ2≥…\lambda_1 \ge \lambda_2 \ge \dots과 고유벡터 v1,v2,…v_1, v_2, \dots를 구합니다.
  4. 위에서 kk개 고유벡터로 데이터를 투영합니다: z=Xc [v1⋯vk]z = X_c\, [v_1 \cdots v_k].
C=1n−1Xc⊤Xc,C vj=λjvj,설명 분산 비율j=λj∑lλlC = \frac{1}{n-1} X_c^\top X_c, \qquad C\, v_j = \lambda_j v_j, \qquad \text{설명 분산 비율}_j = \frac{\lambda_j}{\sum_l \lambda_l}
기호뜻
XcX_c평균을 뺀 데이터 행렬(nn행 = 예제, dd열 = 특성)
CCd×dd \times d 공분산 행렬
vjv_jjj번째 주성분 방향(단위 고유벡터)
λj\lambda_j그 방향으로 투영한 데이터의 분산(고유값)

왜 고유벡터인가: 단위 벡터 vv 방향으로 투영한 값의 분산은 v⊤Cvv^\top C v입니다. ∥v∥=1\lVert v \rVert = 1 조건에서 이를 최대화하면 라그랑주 승수로 Cv=λvC v = \lambda v가 나오고, 그때 분산은 λ\lambda입니다. 그래서 가장 큰 고유값의 고유벡터가 제1 주성분입니다.

숫자로 해 보기(해설용, 파이썬 · scikit-learn으로 확인)

점 5개 (1,2),(2,1),(3,4),(4,3),(5,5)(1,2), (2,1), (3,4), (4,3), (5,5)입니다.

  1. 평균 (3,3)(3, 3)을 빼면 (−2,−1),(−1,−2),(0,1),(1,0),(2,2)(-2,-1), (-1,-2), (0,1), (1,0), (2,2).
  2. 공분산 (n−1=4n - 1 = 4로 나눔):
C=(2.52.02.02.5)C = \begin{pmatrix} 2.5 & 2.0 \\ 2.0 & 2.5 \end{pmatrix}
  1. 고유값 · 고유벡터: 대칭인 2×2 행렬 (abba)\begin{pmatrix} a & b \\ b & a \end{pmatrix}의 고유값은 a±ba \pm b이므로 λ1=4.5\lambda_1 = 4.5, λ2=0.5\lambda_2 = 0.5. 고유벡터는 v1=12(1,1)v_1 = \frac{1}{\sqrt2}(1, 1), v2=12(−1,1)v_2 = \frac{1}{\sqrt2}(-1, 1)입니다.
  2. 설명 분산 비율: 4.5/5.0=0.94.5 / 5.0 = 0.9, 0.5/5.0=0.10.5/5.0 = 0.1. 제1 주성분 하나가 분산의 90%를 설명합니다.
  3. 투영: 각 점과 v1v_1의 내적은 −2.121,−2.121,0.707,0.707,2.828-2.121, -2.121, 0.707, 0.707, 2.828입니다. 2차원 점들이 1차원 숫자 하나로 요약됐습니다.

scikit-learn PCA().fit(X)로 돌리면 explained_variance_가 [4.5,0.5][4.5, 0.5], explained_variance_ratio_가 [0.9,0.1][0.9, 0.1]로 손계산과 같습니다(성분 벡터의 부호는 반대로 나올 수 있는데, 방향만 같으면 같은 답입니다).

SVD로 보는 PCA

실제 구현은 공분산 행렬을 만들지 않고 중심화한 데이터에 바로 특잇값 분해(SVD) Xc=USV⊤X_c = U S V^\top를 씁니다. VV의 열이 주성분 방향이고, 고유값은 λj=sj2/(n−1)\lambda_j = s_j^2/(n-1)입니다. 위 예에서 특잇값은 s=(4.243,1.414)s = (4.243, 1.414), 제곱해서 4로 나누면 (4.5,0.5)(4.5, 0.5)로 같습니다. scikit-learn 안내서도 PCA를 "입력을 특성별로 중심화하되 스케일은 맞추지 않은 뒤 SVD를 적용"한다고 설명합니다. 즉 표준화는 사용자가 직접 해야 합니다.

성분 수 고르기와 복원 오차

  • 누적 설명 분산: 예를 들어 누적 95%가 되는 최소 kk를 고릅니다. scikit-learn에서는 PCA(n_components=0.95, svd_solver='full')처럼 0과 1 사이 실수를 주면 그 비율을 넘도록 성분 수를 고릅니다.
  • 복원 오차: kk개 성분으로 투영했다가 되돌리면(x^=zVk⊤+xˉ\hat x = z V_k^\top + \bar x) 버린 성분만큼 정보가 사라집니다. 버린 고유값들의 합에 (n−1)(n-1)을 곱한 것이 전체 제곱 복원 오차입니다. 위 예에서 1개만 남기면 오차는 0.5×4=2.00.5 \times 4 = 2.0으로, 직접 계산한 값과 같습니다.
  • 용도에 맞게: 시각화면 2~3개, 전처리면 검증 성능이 가장 좋은 kk를 교차 검증으로 고릅니다.

왜 표준화가 중요한가: 키(cm, 분산 수백)와 시력(분산 0.1 수준)을 그대로 넣으면 제1 주성분은 거의 키 방향이 됩니다. 분산이 크다는 이유만으로 중요한 축처럼 보이는 것이므로, 단위가 다른 특성은 먼저 표준화합니다.

3. 비선형 시각화: t-SNE와 UMAP

PCA는 선형 투영이라, 휘어진 구조(예: 둘둘 말린 종이 모양)는 펴지 못합니다. 시각화에서는 "가까운 점은 가깝게" 남기는 데 집중한 비선형 방법을 많이 씁니다.

t-SNE

직관: 고차원에서 각 점이 이웃을 고를 확률(가까울수록 큼)을 계산하고, 2차원에서도 비슷한 확률 분포가 되도록 점들을 움직입니다. 두 분포의 차이를 KL 발산으로 재어 줄입니다. 2차원 쪽에서는 꼬리가 두꺼운 t-분포를 써서 떨어진 점들을 더 멀리 밀어내 군집이 또렷하게 보입니다. van der Maaten · Hinton이 2008년 JMLR에 발표했습니다.

설정(scikit-learn 1.9 TSNE 기본값)뜻
perplexity (30)대략 "몇 명의 이웃을 볼지". 문서는 5~50 사이를 고려하라고 권하며, 값에 따라 그림이 크게 달라짐
init ('pca')초기 배치. PCA로 시작하면 전체 구조가 조금 더 안정적
max_iter (1000)최적화 반복 수

UMAP

UMAP(McInnes · Healy · Melville, 2018년 arXiv)은 이웃 그래프를 만들고 저차원에서 비슷한 그래프가 되도록 배치하는 방법입니다. 저자들은 초록에서 t-SNE와 견줄 만한 시각화 품질을 보이며, 전역 구조를 "아마도(arguably)" 더 잘 보존하고 실행 시간이 더 빠르며, 임베딩 차원에 계산상 제한이 없다고 주장합니다. scikit-learn에는 들어 있지 않고 별도 패키지 umap-learn으로 씁니다.

그림을 읽을 때 주의할 점

Wattenberg · Viégas · Johnson의 Distill 글(2016)이 정리한 t-SNE 해석 교훈입니다.

오해실제
하이퍼파라미터는 대충 둬도 된다perplexity · 반복 수에 따라 그림이 크게 바뀜. 여러 값을 시험해야 함
군집 크기가 크면 실제로도 넓게 퍼진 군집t-SNE는 밀도를 고르게 펴므로 크기 비교는 의미 없음
군집 사이가 멀면 실제로도 멀다군집 간 거리는 perplexity에 따라 달라지며 믿기 어려움
덩어리가 보이면 구조가 있다순수 잡음도 낮은 perplexity에서는 덩어리처럼 보일 수 있음

그래서 t-SNE · UMAP 그림은 탐색용으로만 쓰고, "이 데이터에는 군집이 5개 있다" 같은 결론은 군집화 지표나 원 공간의 분석으로 따로 확인해야 합니다. 또 t-SNE는 새 점을 기존 그림에 바로 넣는 변환이 없으므로, 모델 전처리보다는 시각화 용도입니다.

mermaid
flowchart LR
  A[고차원 데이터] --> B[표준화]
  B --> C{목적}
  C -- 전처리 · 압축 --> D[PCA]
  D --> E[누적 설명 분산 · 교차 검증으로 k 고르기]
  E --> F[다음 모델에 투입]
  C -- 시각화 --> G[PCA로 50차원 정도로 먼저 줄이기]
  G --> H[t-SNE 또는 UMAP 2차원]
  H --> I[여러 perplexity · 시드로 그려 비교]
  I --> J[결론은 원 공간 지표로 확인]

위 그림의 "먼저 PCA로 줄이기"는 scikit-learn TSNE 문서도 권하는 방법입니다. 특성이 아주 많으면 PCA(희소 데이터는 TruncatedSVD)로 50차원 정도까지 먼저 줄이면 잡음이 줄고 거리 계산이 빨라진다고 설명합니다. 또 t-SNE의 비용 함수는 볼록하지 않아 초기화가 다르면 결과가 달라질 수 있습니다.

4. 다른 차원 축소 방법 한눈에

방법성격언제
PCA선형, 분산 최대기본 전처리 · 압축
절단 SVD(TruncatedSVD)선형, 중심화 안 함희소 행렬(TF-IDF 문서 행렬 등)
커널 PCA비선형, 커널 트릭휘어진 구조를 특성으로 쓰고 싶을 때
NMF음수 아닌 성분부분의 합으로 해석하고 싶을 때(주제 · 이미지 부분)
t-SNE · UMAP비선형, 이웃 보존시각화
오토인코더신경망으로 압축 · 복원이미지 · 복잡한 데이터(VAE로 이어짐)

연습 문제

1. 공분산 행렬이 (3113)\begin{pmatrix} 3 & 1 \\ 1 & 3 \end{pmatrix}이면 고유값과 제1 주성분의 설명 분산 비율은?

풀이: a±ba \pm b이므로 4와 2. 비율은 4/6≈0.6674/6 \approx 0.667입니다.

2. 공분산이 대각 행렬 diag⁡(9,1)\operatorname{diag}(9, 1)이면 제1 주성분 방향은?

풀이: 이미 축과 나란하므로 (1,0)(1, 0), 첫 번째 특성 방향입니다. 비율은 9/10=0.99/10 = 0.9입니다.

3. 고유값이 (5,3,1,0.5,0.5)(5, 3, 1, 0.5, 0.5)일 때 누적 설명 분산 85% 이상이 되는 최소 성분 수는?

풀이: 합 10. 1개 50%, 2개 80%, 3개 90% → 3개입니다.

4. 중심화한 데이터 행렬의 특잇값이 (6,2)(6, 2)이고 n=5n = 5라면 각 주성분의 분산은?

풀이: s2/(n−1)s^2/(n-1)이므로 36/4=936/4 = 9, 4/4=14/4 = 1입니다.

스스로 점검

  1. PCA의 주성분 방향은 왜 공분산 행렬의 고유벡터인가요?
    • 답: 단위 벡터 방향의 투영 분산 v⊤Cvv^\top C v를 최대화하는 문제의 해가 Cv=λvCv = \lambda v이고, 그때 분산이 고유값 λ\lambda이기 때문입니다.
  2. PCA 전에 표준화를 하지 않으면 어떤 일이 생기나요?
    • 답: 단위 때문에 분산이 큰 특성이 주성분을 지배해, 정보가 많은 방향이 아니라 숫자가 큰 방향을 고르게 됩니다.
  3. t-SNE 그림에서 두 군집이 멀리 떨어져 있으면, 원래 공간에서도 멀다고 말할 수 있나요?
    • 답: 아닙니다. t-SNE의 군집 간 거리와 군집 크기는 perplexity 등에 따라 달라져 그대로 해석하면 안 됩니다.

용어 정리

용어쉬운 뜻
차원 축소(dimensionality reduction)특성 수를 줄여 데이터를 다시 표현하는 일
차원의 저주(curse of dimensionality)차원이 높을수록 데이터가 듬성듬성해지고 거리가 무의미해지는 현상
주성분 분석(PCA)분산이 큰 직교 방향들로 좌표축을 새로 잡는 선형 방법
주성분(principal component)PCA가 찾은 새 축 방향
설명 분산 비율(explained variance ratio)한 주성분이 전체 분산에서 차지하는 비율
중심화 · 표준화(centering · standardization)평균 빼기 · 평균 빼고 표준편차로 나누기
복원 오차(reconstruction error)줄였다가 되돌렸을 때 원래와의 차이
특잇값 분해(SVD)행렬을 USV⊤USV^\top로 쪼개는 분해, PCA 계산에 씀
t-SNE이웃 확률 분포를 맞춰 2~3차원에 그리는 비선형 시각화
perplexityt-SNE가 보는 이웃 수의 대략적 크기
UMAP이웃 그래프를 저차원에 맞춰 배치하는 비선형 차원 축소

더 깊이 보려면

scikit-learn 사용자 안내서의 'Decomposing signals in components' 장은 PCA(점진적 · 무작위 PCA 포함) · 커널 PCA · 절단 SVD · 사전 학습 · 인자 분석 · ICA · NMF · LDA를 다루고, t-SNE 등은 'Manifold learning' 장에 있습니다. t-SNE 그림을 직접 조작해 보며 교훈을 익히려면 Distill 글의 대화형 예제를 권합니다.

다음에 볼 것

라이선스

이 글은 원문 번역이 아니라 KAITABASE가 직접 쓴 해설이며, 숫자 예는 모두 설명용으로 만든 것입니다(numpy · scikit-learn으로 다시 계산해 확인). 참고 자료 scikit-learn 문서는 BSD-3-Clause, Distill 글은 CC BY 4.0입니다.

출처

AI 원리부터 이해하기 · 머신러닝 모듈

머신러닝 모듈 학습

이 글은 머신러닝 모듈의 학습 자료입니다. 전체 17개 자료 중 11번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

본문 자체 작성 · 참고 자료 scikit-learn 사용자 안내서(BSD-3)