목차
1. t-SNE(t-distributed Stochastic Neighbor Embedding)란
1-1 왜 t-SNE이 필요한가
1-2 t-SNE의 특징
1-3 t-SNE의 장단점
2. t-SNE 동작 과정
3. 주요 활용 사태
4. t-SNE 예제.
1. t-SNE(t-distributed Stochastic Neighbor Embedding)란
t-SNE는 고차원 데이터를 2차원 또는 3차원으로 줄여서 사람이 눈으로 볼 수 있게 만들어주는 차원 축소 기법이다.
특히 단순히 차원을 줄이는 것이 아니라, 데이터 간의 유사한 구조를 최대한 유지하면서 시각화하는 데 목적이 있다.
1-1 왜 t-SNE이 필요한가
고차원 데이터는 사람이 직접 이해하기 어렵다.
특히 이미지, 텍스트 임베딩, 유전자 데이터 같은 경우 차원이 매우 높다.
PCA 같은 방법도 있지만, PCA는 선형 구조만 잘 표현한다는 한계가 있다.
즉, 데이터가 복잡하게 꼬여있는 경우 제대로 표현하지 못한다.
t-SNE는 이런 문제를 해결하기 위해 등장했다.
- 비선형 구조까지 반영 가능
- 클러스터(군집)를 눈으로 확인하기 좋음
- 데이터가 어떻게 묶여 있는지 직관적으로 파악 가능
1-2 t-SNE의 특징
t-SNE는 다음과 같은 특징을 가진다.
- 비선형 차원 축소
단순히 직선 관계가 아니라, 복잡하게 얽힌 데이터 구조도 표현할 수 있다. - 국소 구조 보존
가까운 데이터끼리의 관계를 매우 잘 유지한다.
(=비슷한 데이터들이 자연스럽게 군집 형태로 나타난다.) - 시각화에 특화
데이터를 눈으로 이해하기 위한 도구이다.
좌표값 자체를 해석하는 것이 아닌, 전체적인 패턴을 보는 것이 특징이다.
1-3 t-SNE의 장단점
장점
- 데이터 군집 구조를 직관적으로 확인 가능
- 비선형 관계 표현 가능
- 시각화 성능이 매우 뛰어남
단점
- 계산 비용이 큼 (데이터 많으면 느림)
- 전체 구조(전역 구조)는 잘 표현 못함
- 실행할 때마다 결과가 달라질 수 있음
2. t-SNE의 동작 과정
t-SNE는 고차원에서의 관계를 저 차원에서도 비슷하게 유지하려고 한다.
과정은 크게 다음과 같다.
- 고차원에서의 유사도 계산
각 데이터 포인트 간의 '가까움'을 확률로 표현한다.
두 점이 가까우면 높은 확률, 멀면 낮은 확률로 판단한다.
이때 가우시안 분포를 사용해서 계산한다. - 저 차원에서의 유사도 계산
이제 2차원에서도 같은 방식으로 유사도를 만든다.
단, 가우시안 대신 t-분포를 사용한다.
t-분포는 꼬리가 길어 멀리 떨어진 점들을 더 잘 표현할 수 있다.
결과적으로 점들이 겹쳐 뭉치는 현상을 줄여준다. - 두 분포 차이 줄이기
고차원에서의 유사도(p)와 저 차원에서의 유사도(q)를 비교한다.
이 차이는 KL Divergence로 계산하고, 이를 최소화하도록 좌표를 계속 조정한다.
3. 주요 활용 사례
t-SNE는 실제로 다양한 분야에서 사용된다.
- 이미지 분석: 비슷한 이미지끼리 군집 확인
- 유전자 데이터: 생물학적 패턴 탐색
- 자연어 처리: 단어 임베딩 시각화
예를 들어 Word2Vec 결과를 t-SNE로 보면 비슷한 의미의 단어들이 모여 있는 걸 확인할 수 있다. <-무슨 의미인지 모르겠음
4. t-SNE 예제
예제 1 ) 라이브러리 불러오기
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
| numpy | 수치 계산을 위한 기본 라이브러리 |
| matplotlib.pyplot | 그래프 시각화 도구 |
| fetch_openml | MNIST 데이터 다운로드 |
| TSNE | t-SNE 모델 |
| StandardScaler | 데이터 정규화 |
예제 2) 데이터셋 불러오기
mnist = fetch_openml('mnist_784', version=1)
X = mnist.data
y = mnist.target
| fetch_openml() | OpenML이라는 사이트에서 데이터셋을 가져오는 함수 |
| 'mnist_784' | MNIST 데이터셋 이름 28×28 = 784 픽셀이라서 붙은 이름 |
| version=1 | 데이터셋 버전 지정 |
| mnist | 단순한 배열이 아니라 데이터 + 설명 + 메타정보가 들어있는 객체 |
| mnist.data | 입력 데이터 (feature) |
| mnist.target | 정답(label) |
예제 3) 데이터 전처리
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
| StandardScaler() | 평균 0, 분산 1로 데이터 변환 |
| fit_transform() | 기준 계산 + 변환을 동시에 수행 |
| X_scaled | 정규화된 데이터 |
예제 4) t-SNE 적용
tsne = TSNE(
n_components=2,
random_state=42,
max_iter=1000, # 버전에 따라 n_iter
perplexity=30
)
X_tsne = tsne.fit_transform(X_scaled[:2000])
| n_components=2 | 2차원으로 축소 |
| random_state=42 | 결과 재현을 위한 시드 고정 |
| n_iter=1000 or max_iter | 반복 횟수 (최적화 횟수) |
| perplexity=30 | perplexity=30 → 이웃 개수 느낌 (중요 파라미터) |
| tsne.fit_transform(X_scaled[:2000]) | t-SNE는 데이터가 많으면 매우 느리기 때문에, 데이터 일부만 사용하여 학습 + 변환한다. |
예제 5) 시각화
plt.figure(figsize=(10, 8))
scatter = plt.scatter(
X_tsne[:, 0],
X_tsne[:, 1],
c=y[:2000].astype(int),
cmap='tab10',
s=10
)
plt.colorbar(scatter)
plt.title("t-SNE Result")
plt.xlabel("Dimension 1")
plt.ylabel("Dimension 2")
plt.grid(True)
plt.show()
| figure() | 그래프 크기 설정 |
| scatter() | 점 그래프 생성 |
| X_tsne[:, 0] | x좌표 |
| X_tsne[:, 1] | y좌표 |
| c=y | 색상 기준 (숫자 레이블) |
| cmap='tab10' | 색상 팔레트 |
| s=10 | 점 크기 |
| colorbar() | 색상 설명 표시 |
| show() | 그래프 출력 |
예제 5) 출력 결과
t-SNE 결과를 통해 동일한 숫자 데이터는 하나의 군집으로 형성되며, 서로 다른 숫자는 공간적으로 분리되는 경향을 확인할 수 있다.
다만 일부 숫자는 형태의 유사성으로 인해 군집 간 경계가 겹치는 경우도 존재한다.

'머신러닝&딥러닝' 카테고리의 다른 글
| 머신러닝 & 딥러닝 기초 31편 | 딥러닝 실습 완전 정리 (이진 분류, 다중 분류, MNIST) (0) | 2026.03.20 |
|---|---|
| 머신러닝 & 딥러닝 기초 30편 | 딥러닝 완전 정리 (개념부터 구조, 학습까지) (0) | 2026.03.20 |
| 머신러닝 & 딥러닝 기초 28편 | PCA(Principal Component Analysis, 주성분 분석) (0) | 2026.03.19 |
| 머신러닝 & 딥러닝 기초 27편 | 차원축소(Dimensionality Reduction) (1) | 2026.03.19 |
| 머신러닝 기초 26편 | DBSCAN과 Isolation Forest (밀도 기반 군집화와 이상치 탐지) (1) | 2026.03.19 |