비선형 차원 축소 실습 :: 차원 축소 - mindscale
Skip to content

비선형 차원 축소 실습

데이터 다운 링크

  • 목적: 말려 있는 데이터를 펼쳐 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이 더 좋음

정리

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