시뮬레이션으로 PCA의 특성 알아보기 :: 차원 축소 - mindscale
Skip to content

시뮬레이션으로 PCA의 특성 알아보기

시뮬레이션1

공통 부분 만들기

common = rnorm(100)
  • 100개의 난수 생성

noise 만들기

noise1 = rnorm(100)
noise2 = rnorm(100)

common과 noise의 패턴 확인하기

plot(common, noise1)
plot(common, noise2)
  • 별다른 패턴이 존재하지 않음

noise간의 패턴 확인하기

plot(noise1, noise2)
  • 별다른 패턴이 존재하지 않음

x와 y 만들기

x = common + noise1
y = common + noise2

x와 y의 그래프 그리기

plot(x, y)
  • 많이 퍼져 있긴 하지만 x가 증가할수록 y가 증가하는 패턴을 보임
  • 주성분 분석을 하면 우상향 축이 가장 많은 분산을 설명할 것이고 우하향 축이 그 다음으로 많은 분산을 설명할 것임
  • 우상향 축은 common을 많이 포함하고 있음

데이터 합치기

m = cbind(x, y)

주성분분석

p = prcomp(m)
summary(p)
Importance of components:
                          PC1    PC2
Standard deviation     1.7914 0.9493
Proportion of Variance 0.7807 0.2193
Cumulative Proportion  0.7807 1.0000
  • 첫 번째 차원이 71%를 차지하고 common에 해당함
  • 두 번째 차원이 29%를 차지함

그래프 그리기

biplot(p)
  • x와 y가 약간 벌어져 있지만 비슷한 방향(PC1의 - 방향)을 가리킴

PC1의 값 확인하기

p$x[,1]
  [1] -0.98795277  0.64335003  1.79455844 -3.08241993  0.33687463  1.45945812
  [7] -0.03360677  0.22413590 -0.44536893 -2.01221627 -0.42939889 -2.06908565
 [13] -0.71763627 -0.38779143  1.15619474  0.80791016 -1.61639416 -1.52345988
 [19] -0.85129985  3.93143491  0.78038418 -0.68307818  2.52389724  2.09659495
 [25]  0.57851410 -2.38327648  2.54868494 -1.93400420 -0.87344195 -0.95000285
 [31]  2.11439498 -0.61141088 -2.40733316 -0.07701473 -3.14243213 -2.59687419
 [37] -5.54003670 -3.35452793  0.32813805 -0.58451049  1.94138764 -0.16045600
 [43] -1.47129678  0.11978255 -0.45039470 -0.82879317  0.64841647 -1.20599416
 [49] -0.11630308 -0.18610813 -2.42125387  0.08737658 -0.01980997 -1.48757516
 [55] -0.87774181  1.56158830  3.30808958 -2.62339687  1.93196082 -1.53650729
 [61]  1.12001123  3.25462527 -0.14209389 -2.25716986  0.59778361  2.55206557
 [67] -0.52986506  1.11640406  2.01468372  2.06092748  1.06083214  0.77716220
 [73] -0.18705590  0.40950268  5.46288187 -1.18552092 -2.08750620  1.88734045
 [79]  0.60656955 -0.16062552 -2.79888693  0.10936862 -1.68120219  0.70831084
 [85]  1.33798209  2.67982564  1.06718298 -1.01821006 -0.81207231 -1.65322951
 [91]  0.33879661 -1.41549015  0.67728237  1.39304290  2.07974775  2.23183102
 [97] -1.93305777  0.38782348  1.82479118  1.86228934

common과 PC1 그래프 그리기

plot(common, p$x[,1])
  • 오차가 있긴 하지만 뚜렷한 직선 경향성을 볼 수 있음
  • 그 이유는 공통 요소(common)을 많이 반영하고 있기 때문
  • 데이터의 공통 요소와 첫 번째 축(차원)은 밀접한 관련이 있음

시뮬레이션 2

위와 비슷하지만 noise의 비중을 줄임

x = common + 0.5 * noise1
y = common + 0.5 * noise2

x와 y의 그래프 그리기

plot(x, y)
  • 직선 경향이 전보다 훨씬 뚜렷해짐

데이터 합치기

m = cbind(x, y)

주성분분석

p = prcomp(m)
summary(p)
Importance of components:
                          PC1     PC2
Standard deviation     1.5304 0.47418
Proportion of Variance 0.9124 0.08759
Cumulative Proportion  0.9124 1.00000
  • noise가 줄어 common이 차지하는 비율이 증가해 첫 번째 차원이 설명하는 비율이 증가함

그래프 그리기

biplot(p)
  • x와 y의 방향성이 PC1 방향으로 좁아짐

common과 PC1 그래프 그리기

plot(common, p$x[,1])
  • common이 증가하면 PC1이 감소하고 common이 감소하면 PC1이 증가함
  • 컴퓨터가 찾는 것이기 때문에 방향성은 틀릴 수 있음

보기 쉽게 common과 PC1 그래프 그리기

plot(common, -p$x[,1])
  • 노이즈가 섞여 있는 데이터로 주성분분석을 하면 공통 요소를 찾아줌

시뮬레이션3

위와 비슷하지만 noise의 비중을 늘림

x = common + 2 * noise1
y = common + 2 * noise2

x와 y의 그래프 그리기

plot(x, y)
  • 증가하는 패턴을 찾기가 어려움

데이터 합치기

m = cbind(x, y)

주성분분석

p = prcomp(m)
summary(p)
Importance of components:
                          PC1    PC2
Standard deviation     2.5637 1.8986
Proportion of Variance 0.6458 0.3542
Cumulative Proportion  0.6458 1.0000
  • 첫 번째 차원과 두 번째 차원의 설명 비율이 거의 비슷함

그래프 그리기

biplot(p)
  • x가 y가 거의 관련이 없어 직각을 이루고 있음

common과 PC1 그래프 그리기

plot(common, -p$x[,1])
  • 공통 요소를 완벽하게 뽑아내진 못하지만 경향성이 보이긴 함
  • PC1이 common을 반영하고 있기 때문

정리

  • 두 데이터 간 공통 요소가 크면 클수록 분산이 첫 번째 차원에서 많이 설명함
  • 따라서 PC1이 공통 요소와 밀접한 관계를 가짐