차원 축소: PCA · t-SNE · UMAP
PCA를 점 5개로 손계산하고 t-SNE · UMAP 그림을 바르게 읽는 법을 익히는 차원 축소 수업
먼저 알아야 할 것
다루는 내용
고차원 데이터를 적은 축으로 요약하는 차원 축소를 다룹니다. 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, 평균 · 분산 · 공분산 |
들어가기 전에
- 선형대수 2: 고유값 · 고유벡터 · 특잇값 분해(SVD) — PCA는 공분산 행렬의 고유 분해, 또는 데이터 행렬의 SVD 그 자체입니다.
- 군집화: k-평균 · 가우시안 혼합 · EM 알고리즘 — 군집 결과를 2차원으로 그려 확인할 때 이 수업의 방법을 씁니다.
한눈에 보기
- 차원이 높으면 왜 문제가 되는지(거리 · 계산 · 시각화) 압니다.
- 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 주성분입니다.
숫자로 해 보기(해설용, 파이썬 · scikit-learn으로 확인)
점 5개 입니다.
- 평균 을 빼면 .
- 공분산 (로 나눔):
- 고유값 · 고유벡터: 대칭인 2×2 행렬 의 고유값은 이므로 , . 고유벡터는 , 입니다.
- 설명 분산 비율: , . 제1 주성분 하나가 분산의 90%를 설명합니다.
- 투영: 각 점과 의 내적은 입니다. 2차원 점들이 1차원 숫자 하나로 요약됐습니다.
scikit-learn PCA().fit(X)로 돌리면 explained_variance_가 , explained_variance_ratio_가 로 손계산과 같습니다(성분 벡터의 부호는 반대로 나올 수 있는데, 방향만 같으면 같은 답입니다).
SVD로 보는 PCA
실제 구현은 공분산 행렬을 만들지 않고 중심화한 데이터에 바로 특잇값 분해(SVD) 를 씁니다. 의 열이 주성분 방향이고, 고유값은 입니다. 위 예에서 특잇값은 , 제곱해서 4로 나누면 로 같습니다. scikit-learn 안내서도 PCA를 "입력을 특성별로 중심화하되 스케일은 맞추지 않은 뒤 SVD를 적용"한다고 설명합니다. 즉 표준화는 사용자가 직접 해야 합니다.
성분 수 고르기와 복원 오차
- 누적 설명 분산: 예를 들어 누적 95%가 되는 최소 를 고릅니다. scikit-learn에서는
PCA(n_components=0.95, svd_solver='full')처럼 0과 1 사이 실수를 주면 그 비율을 넘도록 성분 수를 고릅니다. - 복원 오차: 개 성분으로 투영했다가 되돌리면() 버린 성분만큼 정보가 사라집니다. 버린 고유값들의 합에 을 곱한 것이 전체 제곱 복원 오차입니다. 위 예에서 1개만 남기면 오차는 으로, 직접 계산한 값과 같습니다.
- 용도에 맞게: 시각화면 2~3개, 전처리면 검증 성능이 가장 좋은 를 교차 검증으로 고릅니다.
왜 표준화가 중요한가: 키(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는 새 점을 기존 그림에 바로 넣는 변환이 없으므로, 모델 전처리보다는 시각화 용도입니다.
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. 공분산 행렬이 이면 고유값과 제1 주성분의 설명 분산 비율은?
풀이: 이므로 4와 2. 비율은 입니다.
2. 공분산이 대각 행렬 이면 제1 주성분 방향은?
풀이: 이미 축과 나란하므로 , 첫 번째 특성 방향입니다. 비율은 입니다.
3. 고유값이 일 때 누적 설명 분산 85% 이상이 되는 최소 성분 수는?
풀이: 합 10. 1개 50%, 2개 80%, 3개 90% → 3개입니다.
4. 중심화한 데이터 행렬의 특잇값이 이고 라면 각 주성분의 분산은?
풀이: 이므로 , 입니다.
스스로 점검
- PCA의 주성분 방향은 왜 공분산 행렬의 고유벡터인가요?
- 답: 단위 벡터 방향의 투영 분산 를 최대화하는 문제의 해가 이고, 그때 분산이 고유값 이기 때문입니다.
- PCA 전에 표준화를 하지 않으면 어떤 일이 생기나요?
- 답: 단위 때문에 분산이 큰 특성이 주성분을 지배해, 정보가 많은 방향이 아니라 숫자가 큰 방향을 고르게 됩니다.
- t-SNE 그림에서 두 군집이 멀리 떨어져 있으면, 원래 공간에서도 멀다고 말할 수 있나요?
- 답: 아닙니다. t-SNE의 군집 간 거리와 군집 크기는 perplexity 등에 따라 달라져 그대로 해석하면 안 됩니다.
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 차원 축소(dimensionality reduction) | 특성 수를 줄여 데이터를 다시 표현하는 일 |
| 차원의 저주(curse of dimensionality) | 차원이 높을수록 데이터가 듬성듬성해지고 거리가 무의미해지는 현상 |
| 주성분 분석(PCA) | 분산이 큰 직교 방향들로 좌표축을 새로 잡는 선형 방법 |
| 주성분(principal component) | PCA가 찾은 새 축 방향 |
| 설명 분산 비율(explained variance ratio) | 한 주성분이 전체 분산에서 차지하는 비율 |
| 중심화 · 표준화(centering · standardization) | 평균 빼기 · 평균 빼고 표준편차로 나누기 |
| 복원 오차(reconstruction error) | 줄였다가 되돌렸을 때 원래와의 차이 |
| 특잇값 분해(SVD) | 행렬을 로 쪼개는 분해, PCA 계산에 씀 |
| t-SNE | 이웃 확률 분포를 맞춰 2~3차원에 그리는 비선형 시각화 |
| perplexity | t-SNE가 보는 이웃 수의 대략적 크기 |
| UMAP | 이웃 그래프를 저차원에 맞춰 배치하는 비선형 차원 축소 |
더 깊이 보려면
scikit-learn 사용자 안내서의 'Decomposing signals in components' 장은 PCA(점진적 · 무작위 PCA 포함) · 커널 PCA · 절단 SVD · 사전 학습 · 인자 분석 · ICA · NMF · LDA를 다루고, t-SNE 등은 'Manifold learning' 장에 있습니다. t-SNE 그림을 직접 조작해 보며 교훈을 익히려면 Distill 글의 대화형 예제를 권합니다.
다음에 볼 것
- 이상 탐지: 통계 기준 · 아이솔레이션 포레스트 · LOF — PCA 복원 오차가 큰 점을 이상으로 보는 방법과, 밀도 · 고립으로 이상을 찾는 방법을 봅니다.
- 추천 시스템: 협업 필터링 · 행렬 분해 · 콘텐츠 기반 — 저차원 근사(행렬 분해)를 사용자-항목 평점 행렬에 씁니다.
라이선스
이 글은 원문 번역이 아니라 KAITABASE가 직접 쓴 해설이며, 숫자 예는 모두 설명용으로 만든 것입니다(numpy · scikit-learn으로 다시 계산해 확인). 참고 자료 scikit-learn 문서는 BSD-3-Clause, Distill 글은 CC BY 4.0입니다.
출처
- 참고: scikit-learn.org/stable/modules/decomposi… (PCA는 중심화하되 스케일하지 않고 SVD 적용, 화이트닝)
- 참고: distill.pub/2016/misread-tsne (Wattenberg · Viégas · Johnson, 2016 — t-SNE 해석 교훈, 원 논문의 perplexity 5~50 권고 인용)
- t-SNE 원 논문: van der Maaten · Hinton, "Visualizing Data using t-SNE", JMLR 9(86): 2579–2605, 2008 — jmlr.org/papers/v9/vandermaaten08a.html
- UMAP 원 논문: McInnes · Healy · Melville, 2018 — arxiv.org/abs/1802.03426
- 기본값 확인: scikit-learn 1.9.0
PCA·TSNE생성자 서명과 문서 문자열(n_components실수 의미, perplexity 5~50 권고)
AI 원리부터 이해하기 · 머신러닝 모듈
머신러닝 모듈 학습
이 글은 머신러닝 모듈의 학습 자료입니다. 전체 17개 자료 중 11번째입니다.
출처·원문
원문 보기요약만