머신러닝&딥러닝

머신러닝 & 딥러닝 기초 29편 | t-SNE(t-distributed Stochastic Neighbor Embedding)

SecLogs YJ 2026. 3. 19. 22:00
목차

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. 비선형 차원 축소
    단순히 직선 관계가 아니라, 복잡하게 얽힌 데이터 구조도 표현할 수 있다.
  2. 국소 구조 보존
    가까운 데이터끼리의 관계를 매우 잘 유지한다.
    (=비슷한 데이터들이 자연스럽게 군집 형태로 나타난다.)
  3. 시각화에 특화
    데이터를 눈으로 이해하기 위한 도구이다.
    좌표값 자체를 해석하는 것이 아닌, 전체적인 패턴을 보는 것이 특징이다.

 

1-3 t-SNE의 장단점

 

장점

  • 데이터 군집 구조를 직관적으로 확인 가능
  • 비선형 관계 표현 가능
  • 시각화 성능이 매우 뛰어남

단점

  • 계산 비용이 큼 (데이터 많으면 느림)
  • 전체 구조(전역 구조)는 잘 표현 못함
  • 실행할 때마다 결과가 달라질 수 있음

 

2. t-SNE의 동작 과정

t-SNE는 고차원에서의 관계를 저 차원에서도 비슷하게 유지하려고 한다.

과정은 크게 다음과 같다.

  1. 고차원에서의 유사도 계산
    각 데이터 포인트 간의 '가까움'을 확률로 표현한다.
    두 점이 가까우면 높은 확률, 멀면 낮은 확률로 판단한다.
    이때 가우시안 분포를 사용해서 계산한다.
  2. 저 차원에서의 유사도 계산
    이제 2차원에서도 같은 방식으로 유사도를 만든다.
    단, 가우시안 대신 t-분포를 사용한다.
    t-분포는 꼬리가 길어 멀리 떨어진 점들을 더 잘 표현할 수 있다.
    결과적으로 점들이 겹쳐 뭉치는 현상을 줄여준다.
  3. 두 분포 차이 줄이기
    고차원에서의 유사도(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 결과를 통해 동일한 숫자 데이터는 하나의 군집으로 형성되며, 서로 다른 숫자는 공간적으로 분리되는 경향을 확인할 수 있다.

다만 일부 숫자는 형태의 유사성으로 인해 군집 간 경계가 겹치는 경우도 존재한다.

 

t-SNE 시각화 결과


 👉 머신러닝 & 딥러닝 기초 30편 | 딥러닝 완전 정리 (개념부터 구조, 학습까지)