PCA를 이해하기 위한 기본적 선형대수

차원의 저주

  • 먼저 PCA를 하는 이유에 대해 설명해 볼 것이다. 전에 언급했던 변수(또는 피처)들이 많아질수록 변수들이 있는 공간의 차원수 또한 점차적으로 늘어나게 된다. 차원의 저주차원이 늘어남에 따라서 같은 영역의 자료를 갖고 있음에도 전체 영역 대비 모델을 통해 변수로 설명할 수 있는 데이터의 패턴은 줄어들게 되는 것을 의미한다.

차원의 저주 - 01

  • 다른 관점에서 한번 살펴보면, 관측치의 수가 한정되어 있다고 할 경우에 먼저, 1차원 상의 공간(변수가 1개인 경우)에서는 10개의 데이터만 있어도 해당 차원의 절반을 설명할 수 있기에 공간을 설명함에 있어서 부족함이 없다고 판단할 수 있다. 허나 2차원상의 공간으로 살펴보았을 경우 1차원의 경우보다 관측치 간의 간격이 멀게 있어 사이에 빈 공간이 많이 나타남을 알 수 있다. 이렇게 빈 공간이 나타남은 사실상 우리가 모델을 통해 예측은 가능하지만 모형에 따라 변동이 심해지는 어디까지나 예측하는 값을 의미한다. 3차원 상에서는 2차원 공간상에서 보다 훨씬 더 관측치가 떨어져있음을 확인할 수 있다. 그러므로 모델의 변동성 즉, 모델의 분산이 더 커지게 되는 것이다. 간단히 말하자면, 점과 점 사이의 공간이 차원이 늘어날수록 멀어지는데, 빈 공간에 위치한 예측값을 채워넣기 위해서는 임의로 채워넣기 때문에 모델이 어려워진다는 것이다.

차원의 저주 - 02

  • 예를 들어, 아래와 같이 KNN 알고리즘(가장 가까이 있는 변수가 예측값으로 결과를 갖는 알고리즘)을 통한 비지도학습을 진행한다고 가정해보자. x1 변수의 공간만을 생각하여 1차원적으로 생각하면, 아래 그림에서 검정색 점과 가장 가까운 점은 노란색 테두리안에 있는 2개의 점들 중 하나일 것이다. 허나 x2 변수의 공간도 같이 고려하여 2차원적으로 살펴보면, 파란색 원 안에 놓여있는 1개의 점이 가장 가까운 점이 될 것이다. 여기서 주목해야 할 점은 동일한 데이터를 통해서 2차원으로 살펴보면 최단거리의 길이가 늘어났다는 점이다. KNN 알고리즘의 결과로 1차원으로 살펴본 것 보다 2차원으로 살펴보는 것이 최단거리의 길이가 더 길기 때문에 값이 좀 더 이질적이라고 볼 수 있으며, 결과적으로 과연 2차원적으로 예측한 값을 KNN알고리즘의 결과값으로 사용해도 문제가 없을지에 의문점이 생기게 된다. x2가 Y와 관련된 변수라면 크게 문제가 없겠지만, x2가 전혀 관련없는 변수라면 굉장히 모델이 낭비가되며, 좋지 않은 모델이 될 것이기 때문이다.
  • 위에서 언급했던 것처럼 차원이 증가하게 되면 좋지 않은 측면이 있고, 이것을 차원의 저주라고 부르며 차원을 될 수 있는 한 축소하는 것이 필요하다.

차원축소의 필요성

  • 기본적으로 차원을 축소하는 방법으로 아래와 같은 것들을 예로 들 수 있다. 먼저, 상관계수가 높은 변수들이라면 동일한 움직임의 방향을 갖기 때문에 그들 중 하나의 변수만을 선택해도 큰 문제가 없다고 보는 측면이다. 이 방법에서의 문제점은 예를 들어 두 변수의 상관계수가 0.8이라면, 나머지 0.2에 해당하는 정보는 버려지게 되는 점이다. 이런 부분을 보완한 것이 PCA이다. PCA는 차원을 줄이면서도 정보의 손실을 최소화하는 것이다.

차원축소법의 종류

공분산 행렬의 이해

  • 공분산 행렬은 쉽게 말해 행렬의 내적이라고 할 수 있다. 아래 그림에서 처럼 계산할 수 있다. 대각 요소를 제외한 나머지 비대각요소들은 두 변수간의 움직임의 방향을 알 수 있다. 그러므로 상관관계를 미리 알고 있다면 두 변수간의 공분산의 부호도 알 수 있다.

공분산 행렬의 이해 - 01

  • 공분산 행렬의 활용은 위에서 언급했던 것 처럼 두 변수간의 상관계수의 부호를 알 수 있는 것 말고도 존재한다. 아래 그림과 같이 특정 점들과의 내적연산을 시행하면, 점의 위치를 이동시키는데 이 때 이동된 점들의 분포가 공분산 구조와 비슷한 형태를 가지게 된다. 즉 공분산 행렬과 점(벡터 또는 행렬)들의 연산은 공분산 구조로 점들을 분포시키는 기능을 한다.

공분산 행렬의 이해 - 02

  • 공분산 행렬이 대칭행렬이지만, positive definite가 아닌 행렬인 경우를 다음 그림에서 보여주고 있다. 아래 수식이 성립한다면 행렬 A가 positive definite하다고 한다.

참고 - 행렬의 성질

공분산 행렬의 이해 - 03

  • 아래의 공분산 행렬은 행렬식(determinant)가 0인 경우이다. 이렇게 행렬식이 0인 공분산행렬과의 내적은 오른쪽 그림과 같이 원점을 기준으로 일직선의 형태를 이루게 된다.

공분산 행렬의 이해 - 04

Principal Components의 이해

  • 아래 그림을 살펴보면 x1과 x2는 음의 강한 상관관계를 갖는다는 것을 확인 할 수 있다. x1이 증가하면 x2가 감소하는 움직을 갖는다. 결론적으로는 정보가 중복되어있다. 이렇게 중복되어있는 정보를 요약해서 갖고있을수 있을 순 없을까에 대한 방법을 고안한 것이 바로 PCA이다. 아래 그림과 같이 두 변수간의 가장 큰 분산을 나타내는 벡터에 대해 각 데이터를 projection을 취한다면 해당 projection 된 데이터들의 벡터만을 가지고도 기존의 데이터에 대한 분산을 표현할 수 있게 된다.
  • 차원을 줄이면서 정보의 손실을 최소화하는 방법은 자료의 변동을 가장 잘 설명하는 어떤 축을 찾는 것이다.

Principal Components의 개념 - 01

  • Principal Components를 찾아내는 방법을 간단히 말하자면 자료의 분산을 가장 많이 설명하는 축인 장축과 자료의 분산을 가장 적게 설명하는 단축을 찾아내는 것이다.

Principal Components의 개념 - 02

Principal Components의 개념 - 03

PCA 수학적 개념이해 - 행렬연산, 행렬식, 특성방정식

행렬식 구하는 방법

  • 행렬식(determinant)은 쉽게 말해 해당 행렬이 갖는 Volume(2차원인 경우는 면적)을 의미한다. 아래 그림과 같이 2차원 공간상에서 면적이 1을 갖는 좌표들(파란색)을 D라는 행렬로 명명했을 경우, A행렬로 선형변환시켜주면 아래 그림의 빨간색 직사각형으로 변환되며, 부피는 각 행렬식의 곱 형태로 계산 되어 5를 갖는다.
  • 만약 행렬식이 0을 갖는다면 행렬의 곱은 1직선을 이룰 것이고, 선분의 형태로 표현될 것이다.

행렬식의 기하하적인 요소

행렬식의 활용

고유값과 고유벡터

  • 임의의 정방행렬 A로 선형변환하더라도 방향은 유지되면 해당 벡터를 고유벡터라고 하며, 크기(늘어난 정도)를 고유값이라고 한다.

고유값과 고유벡터 - 01

  • 기하학적으로 설명해보자면, 아래 그림과 같이 고유벡터는 빨간색 선을 제외한 나머지 선형변환을 해도 벡터의 방향이 바뀌지 않는 파란색, 분홍색 벡터들이 고유벡터를 의미한다. 그리고 고유값은 스케일(크기)를 의미한다.

고유값과 고유벡터 - 02

  • 아래 그림과 같은 식으로 고유값과 고유벡터를 구할 수 있다. 먼저 고유값을 구하는 방법은 $det(A - \lambda I)=0$을 만족하는 고유값을 찾으면 되는데, 이유는 우리가 구하고 싶은 고유값과 고유벡터는 0벡터를 제외한 다른 벡터를 구하고 싶기 때문에 행렬식이 0이아닌 다른 값을 갖는다면 역행렬이 존재하게 되어 0벡터가 해당 선형시스템의 유일한 해가 되지 않도록하려면 non-trivial solution(해가 무수히 많아야)을 갖어야 한다. 그러므로 해당 행렬식이 0의 값을 갖게되어 역행렬이 존재하지 않도록 해야하기 때문에 아래와 같은 수식을 통해 고유값을 구할 수 있다.
  • 고유값은 크기를 기준으로 내림차순으로(큰 것부터 작은 것 순으로)적어주면, 그에따른 고유벡터도 동일한 인덱스를 매칭해준다. 여기서 주의할 점은 고유벡터는 해당 고유벡터를 normalization을 통해 크기가 1인 벡터를 기준으로 스칼라배를 해도 동일한 고유벡터라고 여긴다는 점이다.

고유값과 고유벡터 - 03

PCA 수학적 개념이해 - Singular Value Decomposition(SVD)

  • PCA는 다르게 행렬식을 계산하기 때문에 정방행렬인 경우에만 계산이 가능하다는 단점이 있다. 이러한 점을 보완하기 위한 Decomposition 방법이 바로 SVD(Singular Value Decomposition)이다.
  • SVD는 임의의 행렬 X에 관해 3개의 행렬로 분해가 가능하며, 각각의 행렬의 크기는 아래와 같고, V와 U는 column들이 Orthogonal(직교)한 행렬(서로 직교하는 성분들끼리의 내적은 0)이므로 동일행렬의 내적은 Identity matrix를 갖는다. V와 D가 각각 임의의행렬 X에 공분산행렬에 해당하는 고유벡터 행렬과 고유값 행렬을 의미한다.

SVD 개념

  • 공분산 행렬인 $X^{T}X$를 SVD 한 후, 아래 그림과 같이 eigen vector들의 행렬로 곱해주면 eigen vector들의 행렬과 eigen value들의 내적 값을 구할 수 있다.

SVD와 eigen vector, eigen value와의 연과성

PCA 수행과정 및 수학적 개념 적용

  • 제일 먼저, 각 데이터에 대해 standardization을 통해 표준정규분포를 따르도록 scaling을 해준다. 이런 normalization은 각 feature에 대한 공간의 범위가 다르다면 비교하는데 어려움이 있기 때문이다. 또한, 이 과정에서 feature 벡터의 크기를 1로 갖게끔 Unit vector로 만들어 주는 것이 추후에 SVD를 계산하는 과정에서 Orthogonal한 eigen vector가 Orthonormal vector가 되어 계산함에 있어서 편리하게 된다.

PCA 수행과정 - 01

  • 그 후 SVD는 우선 우리는 프로그램을 사용하여 바로 구할 수 있다는 가정을 해보자. 여기서 eigen vector같은 경우에는 공분산 구조나 공분산 행렬이나 동일한 값을 갖지만, eigen value는 다음 그림에서와 같이 관측치의 개수에서 하나를 빼주어야 한다.

PCA 수행과정 - 02

  • PC Score는 위에서와 같이 큰 순서대로 정렬된 eigen value 행렬 D와 앞에 U행렬값의 내적이 곧 행렬 X와 V의 내적을 하여 상수인 $\lambda V$를 만드는 과정과 동일하다.

PCA 수행과정 - 03

  • 아래 그림과 같이 PC Score를 구해 중요도를 따져 상위 q개만을 통해 회귀분석을 진행할 수 있다.

PCA 수행과정 - 04

PCA의 심화적 이해

  • 한 마디로 PCA는 데이터의 변동을 가장 잘 설명하는 한 축을 찾아서 그 축에 대해 각 관측치들을 projection한 성분을 의미한다. 그 다음에는 이러한 해당 변동축에 직각이 되는 축에 관측치들을 projection하는 과정을 반복하여 진행하게 되는데 직각이 되는 축을 찾는 이유는 이전의 축과 동일한 정보를 갖지않는 새로운 피처를 뽑기 위함이라고 필자는 생각한다.

PC Score의 본질적인 의미

  • PCA의 단점 중 하나로는 해당 성분이 의미하는 바를 직관적으로 설명할 수 없다는 점이다. 또한 선형회귀에 사용되는 것과 같이 해당 변수들이 비선형관계를 갖는다면 잡아낼 수 없다.

PCA의 단점

  • 위에서 언급한 첫번째 단점(직관적으로 PC성분을 통한 피처를 설명하기 어렵다.)을 조금이나마 보완할 수 있는 방법은 grid를 통해 해당하는 곳의 범위들의 데이터를 직접 뽑아 각 성분의 의미를 설명할 수 있다. 아래와 같이 이미지 데이터인 경우는 좀 더 구별하기 쉬울 것이다.

PCA의 단점을 보완하는 방법

Kernel PCA

  • 위에서 언급했던 두 번째 단점인 비선형관계를 갖는다면 잡아내기 힘들다는 점을 보완하기 위한 방법으로서, 다음 그림과 같은 상황에서 Kernel PCA를 사용할 것이다. 아래 관측치들의 집합인 행렬 X의 공분산 구조는 0에 가까운 값을 갖을 것이다. 즉, 서로 선형관계가 아닌 상황이다.

Kernel PCA를 하는 경우

  • 기존의 PCA는 feature들 사이의 패턴이 존재하는 것으로 간주하여 비교(각 feature들간의 움직이는 방향을 나타내는 공분산 구조를 통해 값을 구했기 때문)를 했지만, 이번에는 관측치와 관측치 사이의 패턴을 수치화하여 PC를 구하는 방법이다. 아래 그림에서 K(Kernel matrix)의 예시를 보듯이 여러가지 방법이 존재한다.

Kernel PCA를 계산하는 방법

  • 아래 그림과 같이 Kernel PCA를 계산할 수 있다.

Kernel matrix를 계산하는 방법

  • 아래 그림과 같이 원형의 띠로 구분지어져 있는 형상인데도 불구하구 Kernel PCA를 사용하면 잘 구분되는지에 대한 이유는 다음과 같다. 먼저 각 관측치에대해 pair-wise하게 Kernel matrix를 구해 비슷한 값들을 갖는 관측치들로 정렬하여 보면 비슷한 값을 갖는 관측치들 끼리 모여 block matrix를 형성하는 모습을 볼 수 있다.

Kernel matrix의 형태

  • Kernel matrix를 구한 값으로 eigen vector의 역할을 하는 행렬 U와 각 eigen value의 $d_{i}$의 곱인 PC Score를 통해 얻은 결과를 그래프로 그려보면 아래와 같은 결과를 얻을 수 있다. 아래의 경우에서는 첫번째 성분을 선택하여 사용하면 3가지 군집을 잘 판별할 수 있을 것이다.

Kernel matrix의 결과