0. 공분산 행렬의 이해
공분산 행렬을 먼저 이해할 필요가 있다.
공분산이란 무엇인가?
C o v ( X , Y ) = E [ ( X − E [ X ] ) ( Y − E [ Y ] ) ] Cov(X,Y) = E[(X-E[X])(Y-E[Y])] C o v ( X , Y ) = E [ ( X − E [ X ] ) ( Y − E [ Y ] ) ]
두 확률 변수 사이의 공분산은 이렇게 정의 된다.
공분산 값 자체에 대해서도 알 수 있는 사실이 많지만 일단 넘어가자.
그럼 데이터(표본, 관측값 등)에서 공분산을 어떻게 구할까?
여기서 고민을 많이 했는데 사실 공분산의 정의는 두 확률'변수'에 대한 것이다. 데이터로 어떻게 계산할지는 정의로부터 곧바로 알긴 어렵다.
근데 분산은 어떻게 계산하는가?
분산의 정의 : V a r ( x ) = E [ ( X − E [ X ] ) 2 ] Var(x) = E[(X-E[X])^2] V a r ( x ) = E [ ( X − E [ X ] ) 2 ]
데이터로부터의 계산 : 1 n Σ ( X − X ˉ ) 2 \frac{1}{n}\Sigma(X-\bar{X})^2 n 1 Σ ( X − X ˉ ) 2
표본을 통해 분산을 추정하는 것과 데이터가 주어져 있을 때 그 데이터 사이의 분산을 말하는 것의 차이점이 무조건 있을 것 같은데 우리는 그냥 저 두 용어를 혼용해서 쓴다.. 평균과 기댓값은 구별해서 쓰는데. 나도 잘 모르겠다.
공분산은 그럼 어떻게 계산할까?
적당히 X와 Y의 편차끼리 곱한 것들을 평균내면 되지 않을까? 그렇다. 그냥 그렇게 계산하면 된다.
1 n Σ ( X − X ˉ ) ( Y − Y ˉ ) \frac{1}{n}\Sigma(X-\bar{X})(Y-\bar{Y}) n 1 Σ ( X − X ˉ ) ( Y − Y ˉ ) ---------------(*)
그런데 꼴이 inner product와 많이 닮아 있다.
한 row에 한 사람의 키랑 몸무게 값이 들어있는 matrix를 생각해보자.
X = [ 170 70 150 45 160 55 180 60 170 80 ] X = \begin{bmatrix}170&70\\150&45\\160&55\\180&60\\170&80 \end{bmatrix} X = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 1 7 0 1 5 0 1 6 0 1 8 0 1 7 0 7 0 4 5 5 5 6 0 8 0 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
X T X X^TX X T X 를 해준다면 2x2 matrix가 생길 것인데, 1행 2열(혹은 2행 1열)에 각자의 키와 몸무게가 곱해진 값이 쫙 더해질 것이라고 생각할 수 있다. 1행 1열에는 키의 편차의 제곱의 합이 2행 2열에는 몸무게의 편차의 제곱의 합이 들어갈 것이다.
그렇다면 X T X X^TX X T X 를 하기 전에 각열의 평균(166,62)을 빼주고 시작한다면? (*)식의 시그마 부분은 1행 2열(혹은 2행 1열)에 계산되어 나올 것이다.
X ′ = [ 170 70 150 45 160 55 180 60 170 80 ] − [ 166 62 166 62 166 62 166 62 166 62 ] = [ 4 8 − 16 − 17 − 6 − 7 14 − 2 6 18 ] 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} X ′ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 1 7 0 1 5 0 1 6 0 1 8 0 1 7 0 7 0 4 5 5 5 6 0 8 0 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ − ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 6 2 6 2 6 2 6 2 6 2 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 4 − 1 6 − 6 1 4 6 8 − 1 7 − 7 − 2 1 8 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
X ′ T X ′ n = [ C o v ( H , H ) C o v ( H , W ) C o v ( W , H ) C o v ( W , W ) ] \frac{{X^{'}}^{T}X^{'}}{n}= \begin{bmatrix} Cov(H,H)&Cov(H,W)\\Cov(W,H)&Cov(W,W)\end{bmatrix} n X ′ T X ′ = [ C o v ( H , H ) C o v ( W , H ) C o v ( H , W ) C o v ( W , W ) ]
이는 두 확률벡터의 교차 공분산 행렬과 일치한다.(H는 키, W는 몸무게)
1. Maximizing Varience
PCA의 목적이 무엇인가? 데이터를 잘 표현하는 주성분(Principal Component)을 찾는 것이 목적이다.
주성분이란 그 방향으로 정사영 했을 때 데이터들의 분산이 가장 큰 방향 벡터이다.
데이터를 담은 matrix가 M ( n × p ) M(n\times p) M ( n × p ) 이라 할 때 그런 벡터를 찾는 최적화 문제를 적어보자.
e ∗ ⃗ = a r g m a x e ⃗ V a r ( M e ⃗ ) s . t . ∣ ∣ e ⃗ ∣ ∣ 2 = 1 \vec{e^*} = arg\:max_{\vec{e}}\:Var(M\vec{e})\:\: s.t.\: \lvert\lvert \vec{e} \lvert\lvert ^2 = 1 e ∗ = a r g m a x e V a r ( M e ) s . t . ∣ ∣ e ∣ ∣ 2 = 1
V a r ( M e ⃗ ) = 1 N ∑ i = 1 N ( M e ⃗ − E [ M e ⃗ ] ) 2 Var(M\vec{e}) = \frac{1}{N}\sum_{i=1}^N(M\vec{e}-E[M\vec{e}])^2 V a r ( M e ) = N 1 i = 1 ∑ N ( M e − E [ M e ] ) 2
위에 matrixX X X 를 X ′ X^{'} X ′ 로 만든 것처럼 평균을 미리 빼서 E [ M e ⃗ ] E[M\vec{e}] E [ M e ] 를 0으로 만들 수 있다.(이 작업은 공분산 행렬에 전혀 영향을 주지 않는다. Cov식에서 X 대신 평행 이동한 X+b 값을 대입해도 변하지 않는다.)
V a r ( M e ⃗ ) = 1 N ∑ i = 1 N ( M e ⃗ ) 2 = 1 N ( M e ⃗ ) T ( M e ⃗ ) = e ⃗ T M T M N e ⃗ = e ⃗ T V e ⃗ Var(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} V a r ( M e ) = N 1 i = 1 ∑ N ( M e ) 2 = N 1 ( M e ) T ( M e ) = e T N M T M e = e T V e
다음과 같이 문제를 바꿀 수 있다.
e ∗ ⃗ = a r g m a x e ⃗ e ⃗ T M T M N e ⃗ s . t . ∣ ∣ e ⃗ ∣ ∣ 2 = 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 ∗ = a r g m a x e e T N M T M e s . t . ∣ ∣ e ∣ ∣ 2 = 1
라그랑지언을 취해준다.
e ∗ ⃗ = a r g m a x e ⃗ e ⃗ T M T M N e ⃗ − λ ( ∣ ∣ e ⃗ ∣ ∣ 2 − 1 ) \vec{e^*} = arg\:max_{\vec{e}}\:\vec{e}^T\frac{M^TM}{N}\vec{e}\: - \lambda(\: \lvert\lvert \vec{e} \lvert\lvert ^2 - 1) e ∗ = a r g m a x e e T N M T M e − λ ( ∣ ∣ e ∣ ∣ 2 − 1 )
편미분한다.
2 M T M N e ⃗ − 2 λ e ⃗ = 0 M T M N e ⃗ = λ e ⃗ V e ⃗ = λ e ⃗ 2\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} 2 N M T M e − 2 λ e = 0 N M T M e V e = λ e = λ e
즉, 우리가 찾는 e ⃗ \vec{e} e 는 V의 고유벡터이다. 이때 분산은
V a r ( M e ⃗ ) = e ⃗ T V e ⃗ = λ Var(M\vec{e}) = \vec{e}^TV\vec{e} = \lambda V a r ( M e ) = e T V e = λ
고유값과 같다. 즉 가장 큰 고유값에 대응되는 고유벡터를 고르면 된다.
2. 재밌는 성질
드디어 https://velog.io/@gyuboone/선형대수학-SVD를-위한-기초 를 써먹을 때가 왔다.
V의 고유벡터를 계산할 때
M을 먼저 SVD해서 M = U Σ V ′ T M = U\Sigma {V^{'}}^T M = U Σ V ′ T 꼴로 만든후
V = M T M N = V ′ Σ U T U Σ V ′ T N = V ′ Σ U T U Σ N V ′ T = V ′ Σ 2 N V ′ T V = \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 = N M T M = N V ′ Σ U T U Σ V ′ T = V ′ N Σ U T U Σ V ′ T = V ′ N Σ 2 V ′ T
V의 고유 벡터는 M을 SVD했을 때의 고유벡터와 같다.(이건 당연하다! V ′ V^{'} V ′ 를 구하는 과정을 생각해보라)
V의 고유값은 M의 singular value의 제곱이므로 0보다 큰 V의 고유값과 M의 고유값이 같다. (이것도 당연하다.)
any x에 대해
x T V x = x T M T M N x = 1 N ∣ ∣ M x ∣ ∣ 2 ≥ 0 x^{T}Vx= x^T\frac{M^TM}{N}x = \frac{1}{N} {\vert\vert Mx \vert\vert}^2\geq0 x T V x = x T N M T M x = N 1 ∣ ∣ M x ∣ ∣ 2 ≥ 0
이므로 V는 PSD이고 모든 eigen value는 0이상이다.
스펙트럼 정리를 사용하면 공분산 행렬 V ( p × p ) V(p\times p) V ( p × p ) 은 symmetric 하므로 고유벡터가 p개 존재하며 고유벡터끼리는 수직이다.
고유벡터끼리 수직이라는 것은 고유벡터를 여러개 골라도 모두 수직이라는 것을 의미한다. 즉 각각의 벡터에 정사영해도 분산 값에 영향을 주지 않는다. 모든 고유벡터를 다 골라서 e ⃗ \vec{e} e 대신 고유값의 크기가 큰 순서대로 q개의 고유벡터를 모두 고른 matrix e e e 를 생각해본다면 Σ i = 1 p λ i \Sigma_{i=1}^{p}\lambda_i Σ i = 1 p λ i 중 Σ i = 1 q λ i \Sigma_{i=1}^{q}\lambda_i Σ i = 1 q λ i 만큼의 정보를 여전히 표현한다고 생각할 수 있다. (모두 고른다면 전체와 같으므로 정보를 잃지 않고 전부 다시 표현해낼 수 있다.(수직인 좌표축으로 바꾼 것))
Reference