PCA(Principal Component Analysis)

박재한·2022년 1월 20일
1

Machine Learning

목록 보기
3/6

참조1
참조2

1. 차원 축소의 목적

외출 활동이 좋은지 좋지 않은지 분류하는 머신러닝 모델을 만들고자 한다. 이를 위해 우리는 날씨 데이터를 확보했다.
지금 현재의 풍속, 온도, 습도, 미세먼지, 강수량,... 정말 많은 요인들이 영향을 미칠 것이다.
통계학에서는 이를 독립 변수라 하고, 데이터 분석/ 머신러닝에서는 이를 피쳐(Feature) 라 한다.
가령 101개의 야외활동과 관련된 항목들과 그 수치가 나열된 데이터 테이블이 있다고 한다면,
Imgur
하지만 위의 주어진 데이터를 그대로 학습 모델에 입력한다면, 총 101차원의 벡터일 것이다.
여기서 발생하는 문제가 "다중 공산성 문제"이다.
가령 몇몇 피쳐들끼리는 강한 상관관계를 보이는 경우가 있을 것이다. (ex. 강수량과 기압)
이처럼 서로 의존성이 높은 피쳐들을 함께 학습 시키면, 모델의 과적합이 발생하여 학습 성능이 저하될 수 있다.

따라서 모델에 해당 데이터 테이블을 때려넣기 전에 우리는 어떤 피쳐(Feature) 가 모델의 성능의 영향에 큰 영향을 줄지 파악하고, 피쳐(Feature)를 선택/가공 하는 과정을 거친다. 여기에는 총 3가지 접근 법이 있는데,

  1. 피쳐 선택(Feature Selection) : 불필요한 피쳐는 버린다. 가령 야외활동 여부를 파악하는데 교통량은 크게 영향을 미치지 않는다고 가정한다면, 해당 피쳐는 버리는거다. 보통 각각의 피쳐가 모델이 야외 활동 여부를 파악하는데 영향을 미치는지 미치지 않는지 알고 싶다면 상관계수 값을 통해 판단한다.

  2. 피쳐 추출 (Feature Extraction) : 피쳐들을 선택하는 것이 아니라, 더 작은 차원으로 피쳐들을 맵핑하는 것이다. 현재 101차원의 데이터 테이블을 50차원으로 압축하는 과정을 거치는 것인데, 여기에 속한 기법이 오늘 살펴볼 차원 축소 기법들 PCA, LDA, SVD, NMF가 있다.

  1. 피쳐 생성 (Feature Engineering) : 이는 데이터 테이블에서 피쳐가 부족한 상황일 때 적용하는 기법으로, 해당 데이터와 만들고자하는 머신러닝 모델의 기능 활용 목적에 따라 새로운 피쳐들을 생성해 내는 것이다. 가령 우리가 야외활동 판별 여부를 알려주는 머신러닝 모델을 만들고자 하는데 해당 모델은 세렝게티 지역에 특화된 모델이라고 하자. 그렇다면, 해당 칼럼 중에 야외 동물 출현 횟수 같은 피쳐도 생성해줘야 하는 것이다.

2. 주성분 분석(PCA : Principal Component Analysis)

2.1 기본 개념

데이터의 피쳐를 압축하자, 데이터 테이블 매트릭스의 차원을 낮추자.
단순히 피쳐들을 빼는게 아니라, 여러개의 피쳐들이 갖는 정보를 하나로 압축하는 것이다. 즉 유사한 feature들은 하나의 feature로 합쳐버리는 것이다.(feature를 빼버리면 관련 data들도 모두 다 없어져 버리지만 feature를 압축하여 합쳐버리면 feature의 개수는 줄어들지만 데이터는 줄어들지 않고 그대로 보존된다.)
위의 데이터 테이블을 다시 가져오면,
Imgur
여기 피쳐들 중 (습도 , 강수량) 혹은 (풍속, 태풍여부) 이 둘은 각각 밀접한 연관성이 있다.
습도 강수량 \rightarrow 양의 상관관계 (습도 올라가면 강수량 높음)
풍속 태풍여부 \rightarrow 양의 상관관계 (풍속 빠르면, 태풍임)
이처럼 연관성이 높은 피쳐들을 하나로 합쳐주는 작업이 주성분 분석이 된다.

해당 데이터 피쳐들은 쉽고 직관적이기 때문에 어떤 것끼리 합치면 좋을지 감(?) 이 오는데, 당최 알 수 없는 수치들의 나열인 데이터 테이블을 받았다고 했을 때 (뭐 인공위성의 궤도, 신호1, 신호2, 등등) 우리는 어떻게 여러 개의 피쳐를 하나의 피쳐로 줄일 수 있을까?

이때 하는 것이 바로 주성분 분석 (Principal component Analysis) 이다.

2.2 그림으로 살펴보기

가령 우리에게는 아래와 같은 2차원 공간에 데이터들이 있다.
우리의 목표는 이 2차원 공간의 데이터를 1차원 공간의 데이터로 만들어 주는 것이다.
\Rightarrow 차원 축소의 기본적인 컨셉. 여기에서 우리가 할수 있는 방법은 2가지 인데,
Imgur
방법1 에서는 차원 x1, x2 에 냅다 데이터를 내려버렸다. 이렇게 할 경우 문제점은 내린 후에 값이 겹치는 데이터들이 많고, 아예 한 차원의 정보는 유실되게 된다.
반면 방법2 에서는 새로운 차원 (화살표) 에 데이터들을 내려줬다. 이렇게 한 결과 데이터들은 방법1에서의 문제를 어느정도 해결하게 된다.
여기서 중요한 것은 데이터들이 겹치지 않게 끔하는 화살표를 찾는 것!!!!
Imgur
좌측에 사진처럼 2차원 상에서 무수히 다양한 화살표를 그릴 수 있다.
하지만 우리는 그 중 파란색 화살표 처럼 데이터를 해당 화살표에 1차원 으로 내렸을 때 겹치지 않게 하는 화살표를 찾아야 한다. (longest distance)
\Rightarrow 정리하자면,

  1. 수많은 화살표 들 중, 데이터 들을 화살표에 내렸을 때, 데이터가 최대한 안 겹치게, 멀리 퍼지게 하는 길이가 긴 화살표 찾기
  2. 거기에 데이터들을 투영
  3. (2차원 이상의 경우 2차원으로 만들고자 한다면)
    만약 또 하나의 화살표 만들 때 축 끼리는 직각이 되어야 함, 최대한 데이터가 겹치지 않도록

이를 선형대수학의 관점에서 해석하자면,

  1. 공분산 행렬에서 고유 벡터/고유값을 구하고
  2. 가장 분산이 큰 방향을 가진 고유벡터(e1) 에 입력데이터를 선형변환
  3. 고유벡터(e1) 과 직교하며, e1 다음으로 분산이 큰 e2 고유벡터에 또 선형변환.

1에서 행렬 A의 공분산 행렬의 고유벡터가 데이터가 최대한 안 겹치게, 멀리 퍼지게 하는 길이가 긴 축의 벡터가 된다.(나중에 증명)
2에서 고유값이 가장 큰 것에 매핑되는 고유 벡터(e1)가 1의 고유 벡터 중 데이터의 분산이 가장 큰(데이터가 최대한 안 겹치게, 멀리 퍼지게 하는 길이가 긴) 축의 벡터가 된다.
3에서 2의 벡터와 직교하며 다음으로 고유값이 큰(다음으로 분산이 큰) 벡터(e2)를 찾는다.

2.3 선형대수학 관점에서 설명

  • 공분산 : 한 변수간의 변동을 분산, 두 변수 간의 변동은 공분산
  • 고유 벡터: (화살표) 행렬X에 다른 행렬A를 곱했을때, 행렬X의 벡터들 중 벡터의 크기는 변하지만, 방향은 변하지 않는 벡터
  • 고유값 : 해당 고유 벡터의 크기 (화살표의 길이)
  • 선형변환 행렬X 에 다른 행렬A 를 곱해줌으로써 공간 A에 행렬X 를 맵핑(mapping, 투영/사상이라고도함) 시켜주는 개념.

2.3.1 공분산 행렬은 대칭행렬이다.

Imgur
한 변수 간의 변동을 분산, 두 변수 간의 변동은 공분산 이라고 한다.
우리는 변수 x1,x2,x3 에 대해 각각의 분산, 공분산을 행렬로 표현할 수 있고 이를 공분산 행렬이라 한다.
공분산 행렬은 대각 성분에는 자기 자신 (x1,x1) 의 분산이며 나머지 성분은 서로 다른 두 변수간의 변동 즉 공분산 값이다.(예를 들어 1행1열은 x1의 분산이고 1행2열 or 2열1행은 x1,x2의 분산(공분산)이다.)
여기서 중요한 것은 행렬의 1,2 성분 ( (x1,x2 간의 공분산) 과 행렬의 2,1 성분 (x2,x1간의 공분산)은 같을 수 밖에 없음. 따라서 해당 행렬은 n,k 성분과 k,n 성분이 같은 대칭행렬이다!

2.3.2 대칭 행렬에서는 고유벡터를 직교 행렬로, 고유값을 정방행렬로 대각화 할 수 있다

증명은 여기 참조!
Imgur
공분산 행렬은 대칭행렬이기 때문에 고유값 분해를 했을 때,
고유백터의 직교 행렬(VV) 고유값의 정방행렬 Λ\Lambda 고유 벡터의 직교 행렬의 전지행렬 (VTV^T) 로 표현된다.
이때 v1\mathbf{v_1} 은 가장 분산이 큰 방향을 가진 고유벡터이며, v2\mathbf{v_2}v1\mathbf{v_1} 에 직교하면서, 다음으로 가장 분산이 큰 방향을 가진 고유벡터가 된다.
\Rightarrow 즉 여기서의 고유벡터들이 아까 우리가 그토록 찾던 가장 분산이 큰 화살표 들인 것이다.
그리고 이렇게 공분산 행렬을 통해서 고유 벡터를 찾는 것을 주성분 분석(PCA : Principal Component Analysis)라고 한다.

3. 주성분(Principal Component) 구하기

3.1 PCA 단계 개요

  1. 학습 데이터셋에서 분산이 최대인 축(axis)을 찾는다.
  2. 이렇게 찾은 첫번째 축과 직교(orthogonal)하면서 분산이 최대인 두 번째 축을 찾는다.
  3. 첫 번째 축과 두 번째 축에 직교하고 분산을 최대한 보존하는 세 번째 축을 찾는다.
  4. 1~3과 같은 방법으로 데이터셋의 차원(특성 수)만큼의 축을 찾는다.
    Imgur

이렇게 ii번째 축을 정의하는 단위 벡터(unit vector)를 ii번째 주성분(PC, Principal Component)이라고 한다.
예를 들어, 위의 그림에서는 2차원 데이터셋이므로 PCA는 분산을 최대로 보존하는 단위벡터 c1c_1이 구성하는 축과 이 축에 직교하는 c2c_2가 구성하는 축을 찾게 된다.

< 데이터의 분산이 최대가 되는 c1c_1축과 c1c_1축에 직교하는 c2c_2축>
Imgur
c1c_1축으로 투영한 데이터가 분산이 최대로 보존된다.

3.2 PCA를 수학적으로 구하는 과정

3.2.1 공분산(Covariance)

먼저, 주성분(PC)를 구하기 위해서는 공분산에 대해 알아야 한다. 공분산(covariance)은 2개의 특성(또는 변수)간의 상관정도를 나타낸 값이다.
예를 들어, 아래의 그림과 같이 X,Y\mathbf{X, Y} 두 개의 특성(2개의 변수)에 대해 공분산을 구하면 다음과 같다.
Imgur

  • X,Y\mathbf{X, Y}에 대한 기대값
    E(X)=μ,  E(Y)=vE(\mathbf{X})=\mu,\;E(\mathbf{Y})=v
  • X,Y\mathbf{X, Y}에 대한 공분산(cov(X,Y)cov(\mathbf{X, Y}))
    cov(X,Y)=E[(Xμ)(Yv)]=E[XYvXμY+μv]=E[XY]vE(X)μE(Y)+E(μv)=E[XY]vμμv+μv=E[XY]μv\begin{aligned} cov(\mathbf{X,Y})=&E[(\mathbf{X}-\mu)(\mathbf{Y}-v)] \\ =&E[\mathbf{XY}-v\mathbf{X}-\mu \mathbf{Y}+\mu v] \\ =&E[\mathbf{XY}]-vE(\mathbf{X})-\mu E(\mathbf{Y})+E(\mu v) \\ =&E[\mathbf{XY}]-v\mu-\mu v+\mu v \\ =&E[\mathbf{XY}]-\mu v \end{aligned}
  • 공분산식을 벡터로 나타내면 다음과 같다.
    E(XY)μv=1m1i=1mXiYiμv=1m1<X,Y>μv=1m1XTYμv\begin{aligned} E(\mathbf{XY})-\mu v=&\cfrac{1}{m-1}\sum_{i=1}^{m}X_iY_i-\mu v \\ =&\cfrac{1}{m-1}<\mathbf{X,Y}>-\mu v \\ =&\cfrac{1}{m-1}\mathbf{X^TY}-\mu v \end{aligned}
    <X, Y>는 X, Y의 내적

3개 이상의 변수(feature)일 경우의 공분산
다음은 n개의 특성(feature)과 m개의 관측치로 구성된 데이터에 대한 공분산 cov(X)cov(\mathbf{X})를 구해보자. 아래의 데이터 행렬에서 각 열벡터의 평균은 E[Xiμi]=E[Xi]μi=μiμi=0E[X_i-\mu_i]=E[X_i]-\mu_i=\mu_i-\mu_i=0이다.(각 열벡터의 데이터의 평균이 0이 되게끔 데이터를 표준화하였다.)
XiμiX_i-\mu_i를 편차라 한다.
Imgur
cov(X)=1m1XTXcov(X)=\cfrac{1}{m-1}\mathbf{X^TX}

3.2.2 PCA 계산

PCA의 목적은 원 데이터(original data)의 분산을 최대한 보존하는 축을 찾아 투영(projection)하는 것이다. 예를들어, 평균을 0으로 조정한(편차를 구한) 데이터셋 X\mathbf{X}를 단위벡터 e\overrightarrow{e}인 임의의 축 PP에 투영한다고 했을 때, XX의 투영된 결과는 Xe\mathbf{X}\overrightarrow{e}로 표현할 수 있다. 이때의 분산은 다음과 같이 나타낼 수 있다.
Var(Xe)=1m1i=1m[XeE(Xe)]2=1m1i=1m[XeE(X)E(e)]2=1m1i=1m(Xe)2(  E(X)=0)=1m1(Xe)T(Xe)=1m1eTXTXe=eT(XTXm1)e=eTCe(  let  XTXm1=C)(1)\begin{aligned} Var(\mathbf{X}\overrightarrow{e})=&\cfrac{1}{m-1}\sum_{i=1}^{m}[X\overrightarrow{e}-E(X\overrightarrow{e})]^2 \\ =&\cfrac{1}{m-1}\sum_{i=1}^{m}[X\overrightarrow{e}-E(X)E(\overrightarrow{e})]^2 \\ =&\cfrac{1}{m-1}\sum_{i=1}^{m}(X\overrightarrow{e})^2\quad(\because\;E(X)=0) \\ =&\cfrac{1}{m-1}(\mathbf{X}\overrightarrow{e})^T(\mathbf{X}\overrightarrow{e}) \\ =&\cfrac{1}{m-1}\overrightarrow{e}^T\mathbf{X}^T\mathbf{X}\overrightarrow{e} \\ =&\overrightarrow{e}^T\left (\cfrac{\mathbf{X^TX}}{m-1} \right )\overrightarrow{e} \\ =&\overrightarrow{e}^T\mathbf{C}\overrightarrow{e}\quad(\because\;let\;\cfrac{\mathbf{X^TX}}{m-1}=\mathbf{C})\quad\cdots(1) \end{aligned}
수식에서 알 수 있듯이 C\mathbf{C}X\mathbf{X}의 공분산 행렬이다.

여기서 PCA는 Var(Xe)=eTCeVar(\mathbf{X}\overrightarrow{e})=\overrightarrow{e}^T\mathbf{C}\overrightarrow{e}를 목적함수로 하는 최대화 문제이며 이 때 제약조건은 e2=1\left\|\overrightarrow{e} \right\|^2=1이다.( 단위벡터(unit vector)라는 조건때문임)

maximize  eTCesubject  to  e2=1maximize\; \overrightarrow{e}^T \mathbf{C}\overrightarrow{e} \\ subject\;to\;\left\|\overrightarrow{e} \right\|^2=1

이 두 조건을 모두 만족시키는 C\mathbf{C}를 구하려면 라그란제 승수법(Lagrange multiplier method)을 이용한다.
위의 두식을 라그랑지안 함수(Lagrangian Function)로 나타내면 다음과 같다.

L(e,  λ)=eTCeλ(eTe1)L(\overrightarrow{e},\; \lambda)=\overrightarrow{e}^T \mathbf{C}\overrightarrow{e}-\lambda(\overrightarrow{e}^T\overrightarrow{e}-1)

라그랑지안 함수를 e,λ\overrightarrow{e},\lambda에 대해 편미분해서 0이 될 때 극값(극대값) 및 최대값을 가지므로 편미분값이 0이 되는 변수의 해를 구한다.
e\overrightarrow{e}로 편미분

Le=eT(C+CT)eT(λ+λT)=2eTC2λeT=0(  C    대칭행렬,  λ    대각행렬)eTC=λeTC=λ(양변에  e  곱한다)Ce=λe(양변에  e  곱한다)(2)C=eλeT  (양변에  eT  곱한다)\begin{aligned} \cfrac{\partial L}{\partial \overrightarrow{e}}=&\overrightarrow{e}^T(\mathbf{C}+\mathbf{C^T})-\overrightarrow{e}^T(\lambda+\lambda^T) \\ =&2\overrightarrow{e}^T\mathbf{C}-2\lambda\overrightarrow{e}^T=0 (\because\;\mathbf{C}\;는\;대칭행렬,\;\lambda\;는\;대각행렬)\\ \overrightarrow{e}^T\mathbf{C}=&\lambda\overrightarrow{e}^T \quad \\ \mathbf{C}=&\lambda \quad(양변에\;\overrightarrow{e}를\;곱한다) \\ \mathbf{C}\overrightarrow{e}=&\lambda \overrightarrow{e} \quad(양변에\;\overrightarrow{e}를\;곱한다) \quad\cdots(2) \\ \mathbf{C}=&\overrightarrow{e}\lambda \overrightarrow{e}^T \;(양변에\;\overrightarrow{e}^T를\;곱한다) \end{aligned}

λ\lambda로 편미분

Lλ=0(eTe1)=0eTe=1(3)\begin{aligned} \cfrac{\partial L}{\partial \lambda}=&0-\left (\overrightarrow{e}^T\overrightarrow{e}-1 \right )=0 \\ \overrightarrow{e}^T\overrightarrow{e}=&1\qquad\cdots(3) \end{aligned}

즉, Ce=λe\mathbf{C}\overrightarrow{e}=\lambda \overrightarrow{e}를 만족하는 e\overrightarrow{e}가 바로 분산 Var(Xe)Var(\mathbf{X}\overrightarrow{e})를 최대화한다.
위의 식에서 e\overrightarrow{e}는 공분산 C\mathbf{C}고유벡터(eigenvector)이며, λ\lambdaC\mathbf{C}의 고유값이자 고유벡터로 투영했을 때의 분산(variance)이다.
이때, 고유벡터의 열벡터를 주성분(PC, Principal Component)이라고 한다. 따라서 고유벡터(e\overrightarrow{e})에 투영하는 것이 분산이 최대가 된다.
식(3)에서 고유벡터는 서로 직교(orthogonal)한다는 것을 알 수 있으며, 이거 아니라도 행렬 C\mathbf{C}가 대칭 행렬이라 대칭 행렬의 고유벡터는 서로 직교한다고 했으므로 고유벡터는 서로 직교(orthogonal)한다.

그리고, 식(2)에서 양변의 좌편에 각각 eT\overrightarrow{e}^T을 곱해주면,
eTCe=eTλe=λeTe=λ=Var(Xe)  (  (1)  에서)\begin{aligned} \overrightarrow{e}^T\mathbf{C}\overrightarrow{e}=&\overrightarrow{e}^T\lambda\overrightarrow{e} \\ =&\lambda\overrightarrow{e}^T\overrightarrow{e} \\ =&\lambda \\ =&Var(\mathbf{X}\overrightarrow{e}) \;(\;(1)\;에서) \end{aligned}
Xe\mathbf{X}\overrightarrow{e}의 분산이 최대가 될 때 그 분산이 바로 λ\lambda, 행렬 C\mathbf{C}의 고유값이다. 그리고 이 고유값에 대응되는 고유벡터가 e\overrightarrow{e}이다.

4. 개인적인 정리(Personal Record)

PCA는 SVD의 한 종류이다.
PCA는 정방행렬에서만 고유값 분해가 가능하나(공분산 행렬이라 당연하다), SVD는 정방행렬이 아니라도 특이값 분해가 가능하다.
차원축소, 고유값, 고유벡터의 성질등은 둘 다 거의 같다.

profile
바쁘게 부지런하게 논리적으로 살자!!!

0개의 댓글