본문 바로가기
머신러닝, 딥러닝/머신러닝

차원축소 기본 - 고유값, 고유벡터, 고유분해

by 장찐 2022. 5. 29.

📚 차원 축소

차원의 저주  (Curse of Dimensionality) 

:  피쳐의 수가 지나치게 많아져서 발생하는 문제 

지도 학습 : 노이즈 제거를 통해서 과적합 가능성 감소 및 모델 성능 향상

• 비지도 학습 :

 피쳐가 많으면 각 관측치 간의 거리가 유사해진다. 거리 계산하는 요소가 많아지면 평준화되는 경향이 있다. 

 또한 한 관측치를 설명하는 피쳐가 많으면, 중요한 피쳐가 무엇인지 파악하기 어렵기 때문에 벡터가 관측치의 unique한 특성을 반영할 수가 없어서 벡터간 구분이 어렵다. 

 

• 각 관측치가 가지고 있는 피쳐의 수 = 해당 벡터가 존재하는 공간의 차원의 수 = 해당 벡터의 원소의 수

 

차원 축소 방법 

📌1. Feature Selection 

•  원래 피쳐 중에서 목적에 적합한 중요 변수를 몇 개 선택하는 방법 

•  선택되지 않은 피쳐가 가지고 있는 정보를 분석에 반영하지 못한다는 단점이 있음 

 

 

📌2. Feature Extraction 

•  원래 피쳐를 그대로 사용하는 것이 아니라, 이 피쳐들의 정보를 사용하여 새로운 피쳐를 추출하는 방법 

 새롭게 추출된 피쳐는 원래 피쳐의 수보다 적음. PCA가 이에 해당됨 

• 원래 피쳐의 정보를 버리지 않고 최대한 많이 사용할 수 있다는 장점이 있음 

 


📚 고유값과 고유분해

✅ Principal Component 

• Principal Component 정의 : 원래 데이터가 가지고 있는 정보, 즉 독립변수들이 가지고 있는 축을 의미함. PCA에서는 원래 피쳐가 가지고있는 이러한 정보를 '분산'을 통해서 표현한다. 분산이 크면 여러 가지 정보가 많이 존재하고, 분산이 작으면 적은 정보가 존재한다고 볼 수 있다. 

• 전체 PC의 수 = 전체 독립변수의 수 

각 PC에 의해서 설명되는 정보의 양(=분산의 크기)이 다른데, 설명하는 정보의 양(=분산의 크기)에 따라서 정렬하면 중요한 PC를 선정할 수 있다. 첫 번째 PC는 분산을 가장 많이 설명하는 축이 된다. 

• 각 PC는 서로 수직이다. 

 

 

✅ 고유값(eigen values)과 고유벡터(eigen vectors)

n x n의 정사각행렬 A가 있을 때,

Av= λv 를 만족하는 v를 행렬 A에 대한 고유벡터라고 부르고,  λ를 행렬 A에 대한 고유값이라고 부른다. 

여기서 v는 영벡터(원소가 모두 0인 벡터) 가 아닌 nx1 형태이고,  λ는 스칼라 값이다.

 

 

📌기하학적 의미 

 위 그림은 v라는 벡터를 A행렬을 통해서 이동시킨 결과이다. 행렬은 공간상에서 하나의 점을 다른 위치로 '선형변환'을 시키는 역할을 한다. 고유벡터는 행렬 A에 의해서 선형변환이 되는 경우 방향은 바뀌지 않고 벡터의 길이만 달라진다(선형변환의 특징). 위 그림에서도 v에서 λv 로 이동할 때 방향은 동일하고 길이(원점으로부터의 거리)만 변화한다. 

 

 

📌고유값과 고유벡터 구하기 

Av= λv는 아래와 같이 이항해서 정리할 수 있다. 

(A-λI)v= 0 

(I는 단위행렬 : 대각성분 =1, 나머지 = 0)

v는 0벡터가 아니어야 하므로, 이 조건을 만족하기 위해서는 (A-λI)의 역행렬이 존재하지 않아야 한다. (역행렬은 곱했을 때 단위행렬이 되야함) 만약 (A-λI)의 역행렬이 존재한다면 위 식을 만족하는 v는 0벡터 밖에 없다. 

 

 역행렬이 존재하지 않기 위해서는 해당 행렬의 행렬식(determinant)이 0이면 된다. 이를 det(A−𝜆𝐼)=0 로 표현할 수 있다.
참고로 아래 역행렬 공식에서 ad-bc가 행렬의 determinant가 된다. ad-bc=0이면 분모가 0이 되어서 계산이 불가능해서 역행렬이 존재하지 않게 된다. 

 

A가 2x2 행렬이라고 가정하고, 단위행렬 1(=I)가 있을 때 

det(A−𝜆𝐼)=0 를 찾기 위해서 ad-bc=0을 만족하는 람다를 찾으면 

두 개의 람다 값을 넣어서 고유벡터를 찾기 위해서 (A-λI)v= 0를 계산해보면 (여기서 v는 x,y로 구성된 행렬이라고 가정) 

 

(1) λ = 2 인 경우 : 

3x+y=0를 만족하는 모든 x,y가 λ = 2 에 대한 고유벡터가 된다.

이 경우에는 위 조건을 만족하는 x, y가 무수히 많으므로 고유벡터 후보는 여러 가지가 존재할 수 있다. 

하지만 일반적으로 고유벡터는 길이가 1인 벡터를 사용한다.  

 원점으로부터의 x,y 까지의 거리가 1인 경우를 루트를 표현해서 나타내면 위 식과 같고, 

여기서 루트를 빼면 아래 식이 된다. 따라서 이 조건을 만족하는 x,y가 고유벡터의 원소가 된다. 

 

(2) λ = 6 인 경우 : 

x = y가 되고, 마찬가지로 원점으로부터의 거리가 1인 조건을 동시에 충족하는 값을 구하면 λ = 6에 대한 고유벡터가 된다. 

 

 

 

📌Python numpy로 구하기 

파이썬의 numpy 라이브러리를 사용하면 간단하게 선형대수 계산을 할 수 있다. 

import numpy as np
A = np.array([[5, 1],
            [3, 3]])
            
eigVals, eigVecs = np.linalg.eig(A)

위에서 손으로 계산한 것과 동일하게 계산해보면, 람다=6, 2인 경우에 대해서 eigVecs에 컬럼별로 고유벡터가 저장되어 있는 것을 확인할 수 있다. 

 

 

 

📌고유값의 특성 

 

① 행렬식(determinant) = 고유값들의 곱셈 값

ex) 위의 행렬 A에서는 5*3 - 3*1 = 6*2 = 12

 

② 고유값들의 합 = 행렬의 trace = 대각 성분의 합 = tr(행렬)

ex) 위의 행렬 A에서는 6+2 = 5+3

 

위 특성을 나타내는 식을 유도하는 과정은 다음과 같다. 

여기서 고유 벡터를 찾기 위해서는 아래 행렬식을 풀어야 하는데 

 람다에 대해서 이차식 형태로 정리하면 다음과 같다

 

이차 방정식의 근과 계수의 관계 공식에 따라서 합과 곱은 아래와 같이 구해진다. 

따라서 아래와 같이 정리된다. 

λ1 + λ2 = a + d (② 특성) 

 λ1 * λ2 = ad - bc (① 특성)

 

③ 대칭행렬의 고유벡터는 서로 수직이다. (=사이각이 90도이다 = cos세타 = 0)

 


 

✅ 고유 분해 (Eigen decomposition)

: 고유값과 고유벡터를 이용해서 특정 정사각 행렬을 서로다른 여러 개의 행렬로 분해하는 방법 

고유 분해 식은 아래와 같이 표현된다. 

ex) 2x2 행렬 A가 있을 때, 고유벡터 v1, v2이 다음과 같으면 V는 아래와 같이 정의할 수 있다. 

 고유값(람다)이 2개만 존재한다면 Λ는 아래와 같이 표현된다. 

 

📌고유분해 식 도출 과정

 

아래와 같이 행렬 A, 고유값 벡터가 있을 때 A= VΛV-1를 유도하는 식은 다음과 같다. 

AV는 다음과 같이 나타낼 수 있다. Av1, Av2는 각각이 하나의 벡터가 된다. 

v1에 해당하는 고유값을 λ1 , v2에 해당하는 고유값을 λ2라고 하면 

Av= λv에 따라서 아래의 첫번째 표현과 같이 다시 풀어서 쓸 수 있다. 이를 다시 두 번째 식으로 풀어서 쓰면 최종적으로 AV= VΛ임을 확인할 수 있다 

AV= VΛ 에서 양쪽에 V의 역행렬을 취하면 아래 고유 분해 식을 도출할 수 있다. 즉 특정한 행렬이 있으면 그 행렬은 세 가지로 분해할 수 있다

 

위의 고유분해 식을 도출할 때의 조건은 다음과 같다 : 

V 행렬이 반드시 full rank여야 한다. 이는 고유벡터가 모두 linearly independent 한다는 것을 의미하며 이를 통해서 V의 역행렬이 존재한다는 것을 보장할 수 있다. 

 

 

📌고유분해를 어디에 사용? 

1. A변환이 여러번 수행되는 경우 간단하게 계산이 가능하다. 

2. PCA 차원축소에 사용 

 

 

 


📚  Reference

 

 

 

 

 

댓글