본문 바로가기

Data Science/Machine Learning

[ML] PCA(주성분분석), SVD, LDA by Fisher

반응형

※해당 게시물에 사용된 일부 자료는 순천향대학교 빅데이터공학과 정영섭 교수님의 머신러닝 전공수업 자료에 기반하였음을 알려드립니다.

 

이번 포스팅에서는 선형대수의 벡터를 기반으로 하는 모델들에 대해서 알아보려고 한다. 앞으로 소개할 모델들을 이해하기 위해서는 벡터공간에서의 기저(Basis)에 대한 개념 이해가 중요하다. 필자도 이 모델에 대한 수업을 들으면서 선형대수의 기초 개념 공부의 필요성을 느꼈고 개인적으로 오픈 소스 강의를 통해 학습을 진행하고 있다. 

 

앞으로 소개할 목차는 다음과 같다.

 

1. 기본적으로 알고가야 할 개념

2. Eigen Value(고유값) Decomposition

3. SVD(Singular Value Decomposition)

4. PCA(Principal Component Analysis)

5. LDA(Linear Discriminant Analysis)

 

1. 기본적으로 알고가야 할 개념

우선적으로 사전적으로 알고있어야 할 몇 가지 개념부터 짚고 넘어가자.

1-1. 기저(Basis)

임의의 벡터공간 V에 대하여 벡터집합 S가 서로 '1차 독립' 이면서 벡터공간 V를 생성하면 벡터집합 S = V의 기저(Basis)라고 할 수 있다. 이렇게 말로 풀어쓰기만 한다면 무슨 소린지 이해가 잘 안갈 것이다. 다음 그림을 보자.

 

기저란 무엇일까?

위와 같이 x축 , y축으로 이루어진 벡터공간 V가 있다고 가정하자. 이 때 벡터공간 V의 기저는 바로 x축, y축 2개가 될 수 있다는 것이다. 

 

1-2. 고유벡터(Eigen Vector)와 고유값(Eigen Value)

먼저 고유벡터란, 어떤 벡터에 선형변환을 취했을 때 방향은 변하지 않고 크기(양=길이)만 변환되는 벡터를 말한다. 다시 말해, 임의의 정방행렬 A를 특정 벡터(V1)과 곱했을 때, 임의의 실수 람다(λ)와 특정 벡터(V1)를 곱했을 때 똑같이 나오는 것을 말한다. 이에 대한 수식은 다음과 같다.

 

고유벡터란!?

 

다음 그림을 보자.

고유벡터와 고유값이란 무엇일까?

우리는 기존의 벡터인 x=(2,3)에 변환을 가해주는 연산행렬 A를 취해주었을 때 Ax=(8,7)로 변하게 되는 것이다. 이렇게 변하게 되는 과정에서는 고유벡터와 고유값이 관여한다. 고유벡터에 대한 개념은 위에서 말했던 것과 같은 개념이고 고유값은 윗 그림의 수식의 실수인 람다(λ) 값이 되게 되는 것이다.

 

즉, 고유값은 위 그림에서 들은 예시처럼 기존의 벡터 x=(2,3) 을 변환 후 벡터인 Ax=(8,7)로 "얼마나 축소하고 확대를 했는지에 대한 값"이다.

 

#참고로 n by n 정방행렬일 때, 고유벡터의 개수는 n개이다.

 

1-3. 행렬계수(Rank)

행렬계수는 종류를 우선 나누어서 설명하는 것이 이해가 더 쉬울 것 같다.

  • Column Rank : 선형독립인 열 벡터의 개수

  • Row Rank : 선형독립인 행 벡터의 개수

#행 벡터와 열 벡터에 대해서 모른다면 밑의 그림을 참고하자.

행 벡터와 열 벡터란?

여기서 만약 모든 행이나 열이 다 '0'이 되게 된다면 서로의 조합으로 생길 수 있다는 것을 의미하고 이는 결국 서로 선형독립이 아님을 방증하며 행렬계수를 계산하게 될 때는 다 '0'이 되는 행 또는 열을 개수로 포함시키지 않는다.

 

행렬계수로 세지 않을 때는 모든 행 또는 열 element가 0일 때

 

2. EigenValue Decomposition

고유값 분해(Decomposition)는 변환 후 벡터가 변환 전 벡터에서 얼마나 확대, 축소를 가했는지를 파악하기 위함이다.

이제 위에서 배웠던 개념을 적용해보는 시간이다. 다음 필기 그림을 보자.

 

Eigen Value Decomposition 이란 무엇인가?

고유값 분해는 기본적으로 N by N 정방행렬을 반드시 필요로 한다. 즉 이 N by N 정방행렬 A에 대해서 3개 행렬(벡터)의 내적으로 나타낼 수 있다는 것이다. 필기 그림 속에 등장하는 고유값, 고유벡터에 대한 설명을 볼펜으로 잘 써놓았으니 읽으면서 이해하면 도움이 된다. 한 가지 추가적으로 말할 것은 파란색 글씨의 'New 축' 이라는 것인데, 이 '새로운 축'이라는 의미는 이전에 사용했던 그림자료에서 V1이라는 고유벡터의 새로운 '관점'에서 바라보는 것이다.

 

New 축이라는 것은 고유벡터 v1(또는 v2)를 의미한다.

3. SVD(Singular Value Decomposition)

그렇다면 정방행렬이 아닌 직사각형 행렬(ex. m by n)일 때는 어떻게 할까? 이 때는 SVD를 사용한다. Decomposition은 '분할'이라는 뜻으로 이름 그대로, m by n 행렬에 대해 3개의 행렬 내적으로 나타내는 것이다. 우선 그림을 보기 전에 SVD의 가장 중요한 포인트는 직사각 행렬 m by n에 임의의 행렬 A라는 연산을 취했을 때 벡터의 방향만 변하고 양(길이)는 절대 변하지 않음을 기억하자.

 

SVD의 Process

SVD의 프로세스에 대해서 알아보자. 우선 위 그림에서 m by n 이라는 A 행렬을 다음과 같은 3개의 행렬의 곱으로 나타낸다.

 

  • U 행렬 : A행렬보다 차원이 더 높은 m by m 행렬

  • V^T(Transpose행렬) : A행렬보다 차원이 낮은 행렬

  • 시그마 행렬 : 루트 람다로 이루어진 대각 행렬(이 때 람다의 개수는 m by n의 n개와 값이 동일하다.)

여기서 우리는 람다(λ)값에 왜 루트를 씌워야 하는지 의아해 할 수도 있다. 이는 처음에 SVD를 언급하면서 강조했던 Point부분과 연관이 있다. 즉, A행렬보다 차원이 높고 낮은 행렬 각 1개를 서로 곱해주었다. 이 두 행렬을 곱합으로써 벡터길이(k)도 두 번 곱해진 것이다. 우리는 Point라고 말했던 부분에서 SVD는 벡터의 방향을 바꿀지언정 길이(양)는 절대 변하지 않는다고 했다. 따라서 이를 맞춰주기 위해서 벡터의 길이를 두번 곱함(k제곱)에서 루트를 씌워주어 원래의 길이로 변환시켜주는 것이다.

 

다음은 SVD의 종류이다. 크게 Full SVD와 Reduced SVD가 존재하는데 보통 Reduced SVD가 더 자주 활용된다. Reduced SVD는 Thin SVD, Compact SVD, Truncated SVD로 나누어 진다. 다음 그림을 보면서 각각의 종류를 이해해보자.

 

SVD의 종류

Full SVD는 딱히 설명할 부분이 없어 바로 Reduced SVD의 종류들에 대해 알아보자.

 

  • Thin SVD : <그림3>에 해당하며 빨간색으로 쳐진 부분은 0이 될 부분이기 때문에 해당 부분을 모두 없애버리고 SVD(3개의 행렬 내적연산)를 하는 종류이다. 그래서 원래의 행렬 A로 복구시키기 위해서는 없애버린 부분을 0으로만 채우면 된다.

  • Compact SVD : <그림4>에 해당하며 Thin SVD와 마찬가지로 빨간색 부분이 0이 될 부분이기 때문에 모두 없애버리고 SVD를 하는 종류이다. 원래의 행렬 A로 복구하는 방법은 Thin SVD 복구방법과 동일하다.

  • Truncated SVD : <그림5>에 해당하며 다른 SVD와는 달리 0이 아닌 부분도 없애버리는 것이 특징이다. 따라서 원래의 행렬 A로 완전한 복구가 힘들다.

그렇다면 Truncated SVD는 왜 활용할까? 바로 이미지나 영상을 전달할 때 용량을 줄이기 위해 자주 사용된다. 밑의 그림을 보자. 

 

Truncated SVD를 활용한 이미지 변환

 

왼쪽의 원본 사진을 오른쪽 위는 Truncated SVD를 적용하지 않고 모든 요소를 살린 이미지, 오른쪽 아래는 Truncated SVD를 적용해 약간 흐릿하게 보이는 이미지를 볼 수 있다. Truncated SVD는 이처럼 0값이 아닌 요소들을 삭제할 때 이미지나 동영상에서 중요한 시각적 정보를 담고 있는것이 아닌 디테일하고 짜잘짜잘(?)한 정보들을 없애는 것이다. 

 

아까 SVD 종류라고 되어있는 자료사진의 Truncated SVD를 보자. SVD의 시그마(Σ)행렬 부분을 보면 왼쪽 위에는 주로 중요한 정보를 담고 있어 그 부분만을 살리지만 오른쪽 아래는 주로 디테일한 정보가 들어있어 해당 부분을 삭제하게 된다.

 

4. PCA (Principal Component Analysis)

다음은 PCA라고 불리는 주성분 분석에 대해서 알아보자. PCA는 보통 데이터의 분포에 대한 주성분 즉, 최적의 Feature 조합을 찾기 위한 방법이다. 여기서 주성분이란, 우리가 앞서 2.Eigen Value Decomposition 목차에서 배웠던 것을 적용하여 일명 '새로운 축(관점)'으로 데이터를 바라보는 것이다. 이렇게 PCA를 하는 목적을 최적의 Feature를 선택한다고 해서 'Feature Selection' 라 하거나 n개의 Feature를 n-1개이하의 Feature로 감소시킨다고 하여 'Feature Dimension Reduction' 이라고도 한다. 

 

그렇다면 PCA를 어떻게 하는 걸까? 

PCA는 어떻게 동작할까?

 

PCA는 Eigen value decomposition(고유값 분할)을 통해 새로 만든 '축(관점)'으로 데이터를 바라보는 것이다. 위 그림처럼 왼쪽의 청록색 축이였다가 오른쪽으로 노란색 축으로 데이터를 바라보는 것이다. PCA를 구하는 구체적인 단계는 다음과 같다.

 

PCA를 구하는 구체적인 단계

 

우선 주어진 데이터들의 평균(중심)으로 원점을 가정한다. 그리고 Eigen value Decomposition을 통해서 공분산행렬, 고유값, 고유벡터를 구하게 됬다. 이렇게 고유값 분할을 통해 얻게 된 새로운 다양한 축(고유벡터) 관점에서 가장 큰 분산을 가질 때의 축을 기준으로 데이터를 바라보게 되는 것이다.

 

#공분산 : 서로 다른 2개의 Feature가 서로 얼마나 상관성이 있는지 수치화한 값

#Feature가 m개일 때 공분산행렬은 m by m이다.

 

5. LDA (Linear Discriminant Analysis)

LDA는 기본적으로 클래스를 가장 잘 구분할 수 있는 새로운 축을 찾아주기 위함이다. 아래 그림을 보자.

 

어떤 축이 클래스를 더 잘 구분했을까?

 

우선 그림 속 필기내용은 제껴두고 그래프 분포와 축만보고 어떤 축이 데이터를 더 잘 구분해준 것일까?

잘 모르겠다면 밑의 수식을 이해하고 다시 이 문제에 대한 답을 찾아가보자.

 

LDA의 수식

 

기본적으로 어떤 축이 더 잘 구분했는지에 대한 척도를 측정하기 위한 목적함수는 다음의 2가지 기준으로 구성된다.

 

  • 두 클래스의 중심간의 거리 간격
  • 각 클래스 내의 데이터들의 분산값

위 수식에서 2개의 클라스의 각 중심은 M0, M1으로 나타내어지는 평균값이다. 그리고 우리는 우리가 찾고자하는 벡터와 각 클래스의 중심값을 곱한값들을 m0, m1이라고 하자. 이제 m0와 m1간의 거리를 최대화시켜야 한다. 

 

이 때 또 고려할 사항으로는 각 클래스 데이터들 내의 분산값들이다. 따라서 목적함수는 다음과 같이 정의된다.

 

" 두 클래스간 중심간의 거리 / 각 클래스 내 분산의 합 " 

 

따라서 수식은 다음과 같아지며 분모분산값은 최소화시킬수록, 분자거리값은 최대가 될수록 가장 잘 분류할 수 있는 축을 구하기 위한 목적함수가 정의된다.

 

LDA의 목적함수

 

이렇게 목적함수를 정의한 후, 편미분을 통해 고유값과 고유벡터를 구하게 되며 구한 고유벡터값은 각 클래스를 가장 잘 분류해줄 수 있는 새로운 축이 된다.

 

5-1. LDA의 용도와 한계

  • 용도 : 분류문제에 적용(이진분류 이상도 가능)이 가능하다. 또한 새로운 축을 구한 것이므로 Feature Selection의 기능도 갖고 있다.
  • 한계 : 각 클래스의 중심에 데이터가 몰려있음을 가정하므로 '비선형 분포 데이터'에는 부적합하다.

5-2. PCA와 LDA의 차이는?

그러면 이쯤에서 PCA와 LDA의 차이에 대해 명확히 짚고 넘어가자. 다음 그림을 보고 각 차이에 대해 알아보자.

 

PCA vs LDA

 

  • PCA : 데이터가 넓게 분포(분산이 큼)되어 있도록 하는 새로운 축을 찾음.

  • LDA : 클래스들을 가장 잘 구분할 수 있는 새로운 축을 찾음.

 

반응형