비선형 차원 축소 실습
- 목적: 말려 있는 데이터를 펼쳐 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)
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)
t-SNE
library(tsne)
ts = tsne(roll, initial_dims = 3)
plot(ts, col = color)
initial_dims = 3
: 초기의 차원을 몇 개로 할 것인지
- 계속 반복해서 돌면서 조금씩 결과를 좋게 바꿔나가는 식으로 계산
- 기본 옵션이 계산을 1000번 함
- 100번마다 결과를 알려줌
- 결과를 알려줄 때마다 에러를 보여주는데 그 에러가 점점 줄음
- 부분적인 구조는 보존하지만 전체적인 구조는 보존하지 않아 모양이 특이함
- 중간에 끊어진 부분들이 있음
- 연속적으로 이어진 경우에는 LLE나 IsoMap이 더 좋음정리
차원 축소를 할 때 시각화를 해보지 않으면 잘 알 수 없기 때문에 아는 방법들을 한 번씩 해보고 제일 좋은 결과를 도출하는 방법을 선택