주성분 분석

백승하·2024년 4월 22일

다변량해석

목록 보기
3/6

주성분분석

주성분 분석(PCA)은 고차원의 데이터를 저차원의 데이터로 환원시키는 기법이다.

주성분의 대수적 유도

  1. mm개의 서로 다른 PP개의 확률변수들의 선형결합을 각각 P1,P2,...,PmP_1,P_2,...,P_m이라 하자
    Ps=usYiP_s=u'_sY_i

  2. var(P1)var(P2)...var(Pm)var(P_1)\geq var(P_2)\geq ...\geq var(P_m)

  3. P1,P2,...,PmP_1,P_2,...,P_m는 서로 독립 <=> 고유벡터 u1,u2,...,uku_1,u_2,...,u_k는 서로 직교

  4. uk=1|u_k|=1 (내적이 1)

  5. 2~4를 만족하는 u1,u2,...,uku_1,u_2,...,u_k 구하는 문제는 다음과 같이 정의되는 LkL_k를 최소화하는 u1,u2,...,uku_1,u_2,...,u_k를 구하는 문제로 볼 수 있다.

    L1=Var(P1)λ1(u1u11)=u1Ru1λ1(u1u11)u1L1=2Ru12λ1u1=0L1=u1Ru1λ1(u1u11)=λ1\\ L_1=Var(P_1)-\lambda_1(u'_1u_1-1)=u'_1Ru_1-\lambda_1(u'_1u_1-1)\\ \frac{\partial}{\partial u_1}L_1=2Ru_1-2\lambda_1u_1=0\\ L_1=u_1'Ru_1-\lambda_1(u_1'u_1-1)=\lambda_1

    L1L_1의 최대값은 R의 고유값 중 최고값에 해당되고 u1u_1은 이때의 고유벡터

    Lj=VAR(Pj)λj(ujuj1)k=1j1δkjujuk=ujRujλj(ujuj1)k=1j1δkjujukujL1=2Ruj2λjujkδkjuk=0Rujλjuj12kδkjuk=0ujRujλjujuj12kδkjujuk=0ujRuj12δjj=ujλjuj12δjj=12δjj=0δjj=0Rujλjuj=0Lj=VAR(Pj)λ(ujuj1)L_j=VAR(P_j)-\lambda_j(u_j'u_j-1)\displaystyle\sum_{k=1}^{j-1}\delta_{kj}u_j'u_k\\ =u_j'Ru_j-\lambda_j(u_j'u_j-1)\displaystyle\sum_{k=1}^{j-1}\delta_{kj}u_j'u_k\\ \frac{\partial}{\partial u_j}L_1=2Ru_j-2\lambda_ju_j-\displaystyle\sum_{k}\delta_{kj}u_k=0\\ Ru_j-\lambda_ju_j-\frac{1}{2}\displaystyle\sum_{k}\delta_{kj}u_k=0\\ u_{j*}Ru_j-\lambda_ju'_{j*}u_j-\frac{1}{2}\displaystyle\sum_{k}\delta_{kj}u_{j*}u_k=0\\ u_{j*}Ru_j-\frac{1}{2}\delta_{j*j}=u_{j*}\lambda_{j*}u_j-\frac{1}{2}\delta_{j*j}=-\frac{1}{2}\delta_{j*j}=0\\ \delta_{j*j}=0\\ Ru_j-\lambda_ju_j=0\\ L_j=VAR(P_j)-\lambda(u'_ju_j-1)
  6. u1,u2,...,uku_1,u_2,...,u_k는 R의 고유값 λ1λ2λm\lambda_1 \geq \lambda_2 \geq \dots \geq \lambda_m에 대응되는 고유벡터

주성분의 설명력

  1. cov(Y)=Rcov(Y)=R
  2. cov(P)=cov(UY)=Ucov(Y)U=Λcov(P)=cov(U'Y)=U'cov(Y)U=\Lambda
  3. tr(cov(P))=tr(URU)=tr(RUU)=tr(R)=tr(cov(Y))=k=1pλktr(cov(P))=tr(U'RU)=tr(RUU')=tr(R)=tr(cov(Y))=\displaystyle\sum_{k=1}^{p}\lambda_k
  4. PjP_j의 설명비율 : λjk=1pλk\frac{\lambda_j}{\displaystyle\sum_{k=1}^{p}\lambda_k}
  5. mm개의 주성분 설명력: 상위 mm개의 설명비율 합 tm=k=1mλkk=1pλk×100t_m=\frac{\displaystyle\sum_{k=1}^{m}\lambda_k}{\displaystyle\sum_{k=1}^{p}\lambda_k} \times100
  6. mm을 선택하는 방법
    1 ) 누적 설명력이 70%를 초과하는 성분들 중 최소 갯수
    2 ) scrr graph: 고유값 크기 순으로 나열 (x,λx)(x,\lambda_x)를 꺾은 선으로 그래프 그린 후 elbow까지의 성분을 주성분으로 함
    3 ) Kaiser Rule : 고유값이 1 이상인 성분을 주성분으로 함, 과다선정의 문제 있음

\\

주성분 관한 R코드를 작성한다


##### 주성분분석 #####

#eigen 사용해 표본상관행렬의 고유값과 고유벡터 구함
eeR=eigen(cov(d2))
l1=eeR$values   #고유값
eeR$vectors   #고유벡터

l1/sum(l1)*100  #주성분점수

U=eeR$vectors  
L=diag(eeR$values)
U%*%L%*%t(U)
cov(d2)

round(U%*%t(U),2)

###
Y=d2
Y11=matrix(Y[1,],ncol=1)
p11=t(U[,1])%*%Y11
p11b=p11=t(U[,1])%*%Y[1,]

p11;p11b

p1=Y%*%U[,1]
p1[1:3]
mean(p1)
sd(p1)

par(mfrow=c(1,2))
hist(p1)
qqplot(qnorm(ppoints(length(p1)),sd=sqrt(L[1,1])),p1)
qqline(p1,distribution = function(p) qnorm(p, sd=sqrt(L[1,1])))

###
p1=Y%*%U[,1]
p2=Y%*%U[,2]

require(KernSmooth)

z<- bkde2D(cbind(p1,p2),1)
persp(z$fhat,theta=0,phi=90)
Z<- bkde2D(Y[,1:2],1)
persp(Z$fhat,theta=0,phi=45)


plot(p1,p2)
 ##
#기타 그래프들
##

###주성분분석 실시
library(HSAUR)
data(heptathlon)
hep.data.tmp <- heptathlon
hep.data.tmp$hurdles <- max(hep.data.tmp$hurdles)-hep.data.tmp$hurdle
hep.data.tmp$run200m <- max(hep.data.tmp$run200m)-hep.data.tmp$run200m
hep.data.tmp$run800m <- max(hep.data.tmp$run800m)-hep.data.tmp$run800m
hep.data <- hep.data.tmp[,-8]
hep.data.tmp[,-8]

##
hep.data.pca <- prcomp(hep.data, scale. =T)
hep.data.pca
#standard deviations: 는 표준편차를 의미하는것으로 
   #각 변수가 얼마나 많은 부분을 차지하고 있는지를 알려준다.??
#scale. = T는 수치간 표준화를 지정하는 것으로 
  #각 변수당 단위가 다르기 때문에 표준화가 필요하다.??
#참고로 prcomp 가 아닌 stat 패키지의 princomp도 주성분 분석을 할 수 있는데 
               #여기서는 cor=T를 주면 된다

summary(hep.data.pca)
#summary를 하면 주성분 분석에 대한 결과 요약 설명이 나온다.
#Standard deviation : 표준편차
#Propertion of Variance : 분산비율, 각 주성분의 차지하는 비율을 말하며 
                       #클 수록 영향도가 그만큼 높다는 의미임
#Cumulative Proportion : 분산의 누적 합계이며 주성분 갯수 구함(0.7)


screeplot(hep.data.pca, type="lines", pch=1, main="scree plot")
#그림 통해서 주성분 갯수 고름름

hep.data.pca$rotation[,1:2]

hep.data.pca$x[,1:2] #순위별로 주성분 변수의 값을 알 수 있음

biplot(hep.data.pca, main="Biplot")
# 각 개체에 대한 첫 번째, 두 번째 주성분 점수 및 행렬도(biplot)
# 각 개체의 관찰값은 주성분점수로 하고, 
  #각 변수와 주성분과의 관계를 나타내는 주성분 계수를 동시에 나타내어 
  #이들의 관계를 살피려는 다변량 그래프 분석 기법이다.

0개의 댓글