[데이터 관리와 분석] PCA

권규보·2023년 11월 23일
0

0. 공분산 행렬의 이해

공분산 행렬을 먼저 이해할 필요가 있다.
공분산이란 무엇인가?

Cov(X,Y)=E[(XE[X])(YE[Y])]Cov(X,Y) = E[(X-E[X])(Y-E[Y])]

두 확률 변수 사이의 공분산은 이렇게 정의 된다.
공분산 값 자체에 대해서도 알 수 있는 사실이 많지만 일단 넘어가자.

그럼 데이터(표본, 관측값 등)에서 공분산을 어떻게 구할까?
여기서 고민을 많이 했는데 사실 공분산의 정의는 두 확률'변수'에 대한 것이다. 데이터로 어떻게 계산할지는 정의로부터 곧바로 알긴 어렵다.

근데 분산은 어떻게 계산하는가?

분산의 정의 : Var(x)=E[(XE[X])2]Var(x) = E[(X-E[X])^2]
데이터로부터의 계산 : 1nΣ(XXˉ)2\frac{1}{n}\Sigma(X-\bar{X})^2

표본을 통해 분산을 추정하는 것과 데이터가 주어져 있을 때 그 데이터 사이의 분산을 말하는 것의 차이점이 무조건 있을 것 같은데 우리는 그냥 저 두 용어를 혼용해서 쓴다.. 평균과 기댓값은 구별해서 쓰는데. 나도 잘 모르겠다.

공분산은 그럼 어떻게 계산할까?
적당히 X와 Y의 편차끼리 곱한 것들을 평균내면 되지 않을까? 그렇다. 그냥 그렇게 계산하면 된다.

1nΣ(XXˉ)(YYˉ)\frac{1}{n}\Sigma(X-\bar{X})(Y-\bar{Y}) ---------------(*)

그런데 꼴이 inner product와 많이 닮아 있다.
한 row에 한 사람의 키랑 몸무게 값이 들어있는 matrix를 생각해보자.

X=[1707015045160551806017080]X = \begin{bmatrix}170&70\\150&45\\160&55\\180&60\\170&80 \end{bmatrix}

XTXX^TX를 해준다면 2x2 matrix가 생길 것인데, 1행 2열(혹은 2행 1열)에 각자의 키와 몸무게가 곱해진 값이 쫙 더해질 것이라고 생각할 수 있다. 1행 1열에는 키의 편차의 제곱의 합이 2행 2열에는 몸무게의 편차의 제곱의 합이 들어갈 것이다.

그렇다면 XTXX^TX를 하기 전에 각열의 평균(166,62)을 빼주고 시작한다면? (*)식의 시그마 부분은 1행 2열(혹은 2행 1열)에 계산되어 나올 것이다.

X=[1707015045160551806017080][1666216662166621666216662]=[48161767142618]X^{'} = \begin{bmatrix}170&70\\150&45\\160&55\\180&60\\170&80 \end{bmatrix} - \begin{bmatrix}166&62\\166&62\\166&62\\166&62\\166&62 \end{bmatrix} = \begin{bmatrix}4&8\\-16&-17\\-6&-7\\14&-2\\6&18 \end{bmatrix}
XTXn=[Cov(H,H)Cov(H,W)Cov(W,H)Cov(W,W)]\frac{{X^{'}}^{T}X^{'}}{n}= \begin{bmatrix} Cov(H,H)&Cov(H,W)\\Cov(W,H)&Cov(W,W)\end{bmatrix}

이는 두 확률벡터의 교차 공분산 행렬과 일치한다.(H는 키, W는 몸무게)

1. Maximizing Varience

PCA의 목적이 무엇인가? 데이터를 잘 표현하는 주성분(Principal Component)을 찾는 것이 목적이다.
주성분이란 그 방향으로 정사영 했을 때 데이터들의 분산이 가장 큰 방향 벡터이다.
데이터를 담은 matrix가 M(n×p)M(n\times p)이라 할 때 그런 벡터를 찾는 최적화 문제를 적어보자.

e=argmaxeVar(Me)s.t.e2=1\vec{e^*} = arg\:max_{\vec{e}}\:Var(M\vec{e})\:\: s.t.\: \lvert\lvert \vec{e} \lvert\lvert ^2 = 1
Var(Me)=1Ni=1N(MeE[Me])2Var(M\vec{e}) = \frac{1}{N}\sum_{i=1}^N(M\vec{e}-E[M\vec{e}])^2

위에 matrixXXXX^{'}로 만든 것처럼 평균을 미리 빼서 E[Me]E[M\vec{e}]를 0으로 만들 수 있다.(이 작업은 공분산 행렬에 전혀 영향을 주지 않는다. Cov식에서 X 대신 평행 이동한 X+b 값을 대입해도 변하지 않는다.)

Var(Me)=1Ni=1N(Me)2=1N(Me)T(Me)=eTMTMNe=eTVeVar(M\vec{e}) = \frac{1}{N}\sum_{i=1}^N(M\vec{e})^2 = \frac{1}{N}(M\vec{e})^T(M\vec{e}) = \vec{e}^T\frac{M^TM}{N}\vec{e} = \vec{e}^TV\vec{e}

다음과 같이 문제를 바꿀 수 있다.

e=argmaxeeTMTMNes.t.e2=1\vec{e^*} = arg\:max_{\vec{e}}\:\vec{e}^T\frac{M^TM}{N}\vec{e}\:\:\: s.t.\: \lvert\lvert \vec{e} \lvert\lvert ^2 = 1

라그랑지언을 취해준다.

e=argmaxeeTMTMNeλ(e21)\vec{e^*} = arg\:max_{\vec{e}}\:\vec{e}^T\frac{M^TM}{N}\vec{e}\: - \lambda(\: \lvert\lvert \vec{e} \lvert\lvert ^2 - 1)

편미분한다.

2MTMNe2λe=0MTMNe=λeVe=λe2\frac{M^TM}{N}\vec{e}-2\lambda\vec{e} = 0\\ \begin{aligned} \frac{M^TM}{N}\vec{e} &= \lambda\vec{e}\\ V\vec{e} &= \lambda\vec{e} \end{aligned}

즉, 우리가 찾는 e\vec{e}는 V의 고유벡터이다. 이때 분산은

Var(Me)=eTVe=λVar(M\vec{e}) = \vec{e}^TV\vec{e} = \lambda

고유값과 같다. 즉 가장 큰 고유값에 대응되는 고유벡터를 고르면 된다.

2. 재밌는 성질

드디어 https://velog.io/@gyuboone/선형대수학-SVD를-위한-기초 를 써먹을 때가 왔다.

V의 고유벡터를 계산할 때
M을 먼저 SVD해서 M=UΣVTM = U\Sigma {V^{'}}^T 꼴로 만든후

V=MTMN=VΣUTUΣVTN=VΣUTUΣNVT=VΣ2NVTV = \frac{M^TM}{N} = \frac{V^{'}\Sigma U^T U \Sigma {V^{'}}^T}{N} = V^{'} \frac{\Sigma U^T U \Sigma}{N} {V^{'}}^T = V^{'} \frac{\Sigma^2 }{N} {V^{'}}^T

V의 고유 벡터는 M을 SVD했을 때의 고유벡터와 같다.(이건 당연하다! VV^{'}를 구하는 과정을 생각해보라)
V의 고유값은 M의 singular value의 제곱이므로 0보다 큰 V의 고유값과 M의 고유값이 같다. (이것도 당연하다.)

any x에 대해

xTVx=xTMTMNx=1NMx20x^{T}Vx= x^T\frac{M^TM}{N}x = \frac{1}{N} {\vert\vert Mx \vert\vert}^2\geq0

이므로 V는 PSD이고 모든 eigen value는 0이상이다.

스펙트럼 정리를 사용하면 공분산 행렬 V(p×p)V(p\times p)은 symmetric 하므로 고유벡터가 p개 존재하며 고유벡터끼리는 수직이다.

고유벡터끼리 수직이라는 것은 고유벡터를 여러개 골라도 모두 수직이라는 것을 의미한다. 즉 각각의 벡터에 정사영해도 분산 값에 영향을 주지 않는다. 모든 고유벡터를 다 골라서 e\vec{e} 대신 고유값의 크기가 큰 순서대로 q개의 고유벡터를 모두 고른 matrix ee를 생각해본다면 Σi=1pλi\Sigma_{i=1}^{p}\lambda_iΣi=1qλi\Sigma_{i=1}^{q}\lambda_i 만큼의 정보를 여전히 표현한다고 생각할 수 있다. (모두 고른다면 전체와 같으므로 정보를 잃지 않고 전부 다시 표현해낼 수 있다.(수직인 좌표축으로 바꾼 것))

Reference

profile
기록장

0개의 댓글