차원 축소

복잡한 데이터의 패턴을 파악하고 시각화하는 차원축소를 알아봅니다


수강중

13. 비선형 차원 축소 실습

데이터 다운 링크

  • 목적: 말려 있는 데이터를 펼쳐 2차원에 보기 좋게 보여주기

디렉토리 설정 후 데이터 불러오기

roll = read.csv('swissroll.csv')

패키지 설치

install.packages(c('rgl', 'lle', 'tsne', 'vegan'))

3차원 그래프 그리기

library(rgl)
plot3d(roll)

시각화를 위해 점들에 색깔 정하기

cent.dist = sqrt(rowSums(roll[,c(1,3)]^2))
min.dist = min(cent.dist)
max.dist = max(cent.dist)
color = rainbow(12)[round(1 + 11*(cent.dist - min.dist)/(max.dist - min.dist))]
plot3d(roll, col = color)
  • 중심으로부터 거리에 따라 색을 다르게 입힘

PCA

p = prcomp(roll)
plot(p$x, col = color)
  • 옆에서 자른 것처럼 그림이 그려짐
  • 따라서 비선형 차원 축소를 해야 함

MDS

d = dist(roll)
mds = cmdscale(d)
plot(mds, col = color)
  • PCA와 비슷하게 나옴

IsoMap

library(vegan)
d = dist(roll)
iso = isomap(d, ndim = 2, k = 30)
plot(iso$points, col = color)
  • ndim = 2: 2차원으로 줄일 예정
  • k = 30: 이웃할 점들의 개수 30개
  • 가까이에 있는 점들을 MDS해서 2차원에 그림
  • 3차원 이상이어도 가능함
  • 그래프의 세로 및 가로 축의 숫자는 크게 신경 쓰지 않아도 됨

LLE

library(lle)
lin = lle(roll, 2, 30)
plot(lin$Y, col = color)
  • LLE도 마찬가지로 함수에 줄일 차원 수와 이웃할 점들의 개수를 같이 적어주면 됨
  • 덜 펼쳐지기는 했지만 원래 데이터를 펼쳐서 보여줌

t-SNE

library(tsne)
ts = tsne(roll, initial_dims = 3)
plot(ts, col = color)
  • initial_dims = 3: 초기의 차원을 몇 개로 할 것인지
  • 계속 반복해서 돌면서 조금씩 결과를 좋게 바꿔나가는 식으로 계산
  • 기본 옵션이 계산을 1000번 함
  • 100번마다 결과를 알려줌
  • 결과를 알려줄 때마다 에러를 보여주는데 그 에러가 점점 줄음
  • 부분적인 구조는 보존하지만 전체적인 구조는 보존하지 않아 모양이 특이함
  • 중간에 끊어진 부분들이 있음
  • 연속적으로 이어진 경우에는 LLE나 IsoMap이 더 좋음

정리

차원 축소를 할 때 시각화를 해보지 않으면 잘 알 수 없기 때문에 아는 방법들을 한 번씩 해보고 제일 좋은 결과를 도출하는 방법을 선택