수학을 까먹은 사람을 위한 고유값분해와 주성분분석(PCA)
고유값분해가 무엇인지, 주성분분석이라는 차원축소 기법과 어떤 관계인지 설명한 글입니다. 개발자를 위한 실전 선형대수학의 12장을 주로 참고하였고, 선형대수를 거의 모르거나 잘 기억나지 않아도 이해할 수 있도록 필요한 개념들을 포함하여 작성하였습니다. 다만 읽기 전에 행렬과 벡터가 무엇인지와 곱하는 법 정도는 아셔야 합니다.
고유값분해 이해하기
기본 개념
우선 고유값분해를 이해하려면 당연히 고유값(eigenvalue) 와 고유벡터(eigenvector) 를 개념적으로 알아야 합니다. 이 두 가지 개념은 다음과 같은 엄청나게 간단한 식으로 표현됩니다.
이 식은 물론
잠깐 기억을 되살려 보면, 벡터에는 방향과 크기가 있죠.
‘방향’이 다른 벡터들 (그림 출처)
2u는 u에다가 상수값을 곱한 것으로 u와 방향은 같으나 ‘크기’가 다르다 (그림 출처)
많은 경우, 벡터에 행렬을 곱하면 다음과 같이 방향이 바뀝니다.
(그림 출처)
근데 어떤 특별한 행렬과 특별한 벡터가 만나면, 신기하게도 방향은 안 바뀌고 크기만 변할 수도 있습니다!
(그림 출처)
이때 이 벡터가 이 행렬의 고유벡터이며, 벡터가 늘어나거나 줄어드는 양이 고유값입니다. 예를 들면,
- 즉 이 행렬의 고유벡터는
이고 고유값은 3
여기까지 보고 알 수 있는 것은 고유값과 고유벡터는 특정 행렬에 따라오는 존재라는 것입니다. 특별한 매칭 관계랄까요. 단 1:1 매칭은 아닙니다. 왜인지는 더 아래에서 설명하겠습니다.
한 가지 더 알 수 있는 것은 정의 상 고유값과 고유벡터를 얻으려면 행렬
하는 법
고유값분해를 하는 방법은 주어진 행렬에 대해 고유값과 고유벡터를 찾는 것입니다. 순서는 고유값이 먼저입니다.
위 식을 다시 고쳐보겠습니다.
행렬에서 스칼라를 빼줄 수는 없으니까
다시 돌아와서, 이동시킨
이 부분을 이해하려면 몇 가지 개념들이 필요합니다.
- 벡터의 선형독립
- 행렬의 공간, 영공간
- 행렬의 계수(rank)
순서대로 간단히 짚어 보겠습니다.
- 벡터의 선형독립
- 다음과 같이 여러 개의 벡터에 각각 다른 스칼라 값을 곱해서 더하는 것을 선형가중결합이라고 한다.
- 주어진 벡터 집합 중 한 개의 벡터에 대해, 만약 다른 벡터들을 어떻게든 선형가중결합해서 이 벡터를 만들 수 있다면 이 벡터 집합은 서로 선형종속(linearly dependent)이며, 그렇지 못하면 선형독립(linearly independent)이다.
- 예를 들어
은 선형종속이다. 첫번째랑 두번째를 더하면 세번째가 됨. - 예를 들어
은 선형독립이다. 다른 두 개에 무슨 짓을 해도 나머지 하나를 만들 수 없음. - 선형종속의 정의를 쓰면
인데 이건 사실 다시 쓰면 - 물론 모든 람다값이 0이면 다 되지만 역시 자명한 답은 안 쳐준다.
- 예를 들어
- 다음과 같이 여러 개의 벡터에 각각 다른 스칼라 값을 곱해서 더하는 것을 선형가중결합이라고 한다.
- 행렬의 공간
- 행렬을 열벡터의 집합으로 간주하고(세로로 자른다는 소리), 이 열벡터를 가지고 무한하게 선형가중결합을 한다고 생각하자. 그러면 무한 개의 벡터를 만들 수 있을 텐데, 만들어지는 무한한 집합을 이 행렬의 공간(열공간)이라고 한다.
-
- 즉
과 에 어떤 실수값이든 넣어서 만들 수 있는 모든 벡터들이 이 행렬의 열공간이다. 예를 들어서 , 이면 우리는 를 얻을 수 있으며, 이 벡터는 이 행렬의 열공간에 포함된다고 할 수 있음. 즉 가중치 의 조합 가 존재해서, 가 가능하다면, 벡터 는 행렬 의 열공간 안에 포함된다는 것이다. - 그런데 재미있는 사실: 이 행렬의 열공간은
이다! 즉 모든 실수값 2개로 이루어진 벡터를 저 2개의 열벡터를 선형결합해서 만들 수 있다. - 물론 모든 행렬의 열공간이 이렇지는 않다.
-
- 이 경우 두 벡터를 아무리 선형결합 시켜도
의 무한한 영역을 커버할 수 없는데, 두 개의 열벡터가 선형독립이 아니기 때문임. 이 벡터들로 만들 수 있는 공간은 2차원이 아니라 1차원인 것이다. (그림 출처)
-
- 행렬의 계수(rank)
- 열 공간의 차원의 수, 선형독립 집합을 형성할 수 있는 최대 열의 수를 뜻한다.
- 즉 위 행렬의 공간 예시 중 첫번째 행렬은 rank가 2고, 두번째 행렬은 rank가 1이다.
- 가능한 최대값은 행의 수랑 열의 수 중 더 작은 값이며 (즉
행렬의 가능한 최대 계수는 3임) 열과 행의 계수는 동일하므로 한쪽만 보면 된다. - 물론 행렬에 따라서 최대 계수를 계수로 가질 수도 안 가질 수도 있다.
- 위 행렬의 공간 예시 중 두번째 행렬은
행렬로 최대 계수는 2이지만 실제 계수가 1인 행렬이었다. - 이 행렬처럼 최대 계수를 가지지 않는 행렬은 행렬을 이루고 있는
개의 벡터가 선형독립이 아니라는 뜻이다(선형독립인 애들 개수가 개보다 작다는 뜻이다). 이런 특징을 최대계수보다 모자라 rank-deficient하다고 부르며, 이러한 행렬은 특이(singular) 행렬이라고도 한다. 다른 이름으로는 비가역(non-invertible) 행렬인데, 행렬식 값이 0으로서 역행렬(상수 계산에서 역수와 동일하게 곱해서 단위행렬이 되는 행렬, )을 구할 수 없다.
- 위 행렬의 공간 예시 중 두번째 행렬은
- 열 공간의 차원의 수, 선형독립 집합을 형성할 수 있는 최대 열의 수를 뜻한다.
- 행렬의 영공간
- 영공간은
이 되는 모든 벡터 (이번에도 영벡터는 빼고..!) - 영공간은 비어 있을 수도 있고 비어있지 않을 수도 있다. 영공간이 비어 있지 않으려면, 행렬의 열벡터들이 선형종속이어야 한다. 선형종속의 정의
를 다시 떠올려 보면 당연하다.
- 영공간은
살짝 멀리 갔다 돌아왔는데요, 우리는
2X2 행렬을 예시로 들면 다음과 같습니다. (
행렬식 공식을 대입하면,
이 이차 방정식을 풀면 2개의
제법 긴 과정을 거쳐 고유값을 구했습니다. 고유벡터는 어떻게 정해질까요?
맨 처음 예시로 돌아가서, 다음 행렬의 고유값 2개 중 하나는 3이었습니다.
그렇다는 건 요 행렬을 -3 이동시킨
고유벡터를 찾는 일반화된 방법은 더 어렵지만요, 이 예시에서는
즉 여기서 우리가 알 수 있는 것은 고유값의 개수는 정해져 있지만 고유벡터는 무한 개가 존재할 수 있다는 것입니다. 벡터의 크기가 아니라 방향이 중요합니다.
보통 라이브러리 등을 사용해서 고유벡터를 구해달라고 하면 노름이 1인 정규화된 고유벡터를 구해주곤 합니다. 그냥 대표 친구를 하나 알려주는 거죠. 여기서 노름은 벡터의 크기를 뜻하며, 벡터의 모든 원소를 제곱해서 더한 것에 제곱근을 취해준 결과입니다. 일반적인 유클리디언 거리 공식 떠올리시면 됩니다.
이 값이 1인 걸 단위벡터라고 하는데, 모든 벡터는 노름으로 모든 원소를 나눠줌으로써 단위벡터로 만들 수 있습니다.
필수 조건과 행렬 대각화
다시 돌아가서,
즉
이 여러 개의 식은 행렬화하여 간단하게 표현할 수 있습니다. 2차원으로 예시를 들면, 어떤 행렬 A에 대해 2개의 고유값과 각각에 해당하는 고유벡터가 있을 때, 이 2개의 고유벡터를 열 단위로 합친 행렬
그러면 저 쩜쩜쩜(
다르게 쓰면 이렇죠.
여기서 어떤 정방행렬이 고유값분해될 수 있는가 없는가? 를 판가름하는 중요한 조건이 나옵니다. 이 식이 성립하려면
즉 그 행렬의 열벡터들이 선형 종속이 아닌 경우를 의미합니다. 결론적으로
아무튼 저렇게 두번째 식처럼 A를 다시 쓰는 것을 멋진 말로 대각화(Diagonalization)라고 부릅니다. 대각화는 여러 가지로 유용한 수법인데요, (행렬의 거듭제곱이나 행렬식 계산을 쉽게 할 수 있다든지) 고유값분해를 이해하는 데 반드시 필요한 내용은 아니므로 이번 글에서는 생략합니다. 다음 페이지에 잘 정리되어 있어 첨부하겠습니다.
PCA와 고유값분해가 뭔 상관인지 이해하기
주성분분석(PCA; Principal Component Analysis)이란, 잘 알려진 차원 축소 기법입니다. 차원을 축소할 때 가장 중요한 것은 차원이 작아지는 것의 이점은 충분히 누리면서, 원 데이터의 정보는 최대한 날아가지 않도록 보존하는 것입니다.
일단 이 축소라는 걸 어떻게 할까요? 우리에게 변수가 10개인, 즉 10개 차원의 데이터가 있고, 이를 1차원으로 줄이고 싶다고 칩시다. PCA의 축소는 간단히 말하면 선형변환입니다. 우리는 10차원의 벡터 1개를 임의로 정해서 (이걸 축이라고 부릅니다) 각 데이터포인트와 이 벡터를 내적해서 선형변환을 할 수 있습니다.
그림으로 보면 다음과 같이 축을 정해서 투영(projection)시키는 건데요, 10차원은 못 그리니까 2차원에서 1차원으로 줄이는 예시를 봅시다.
파란색 원이 원래의 데이터고, 까만 x 표시가 z라는 축(선)을 기준으로 1차원으로 투영된 데이터임 (그림 출처)
중요한 문제는 이 축 벡터
주어진
이 제약 조건 하에서 라그랑주 승수법을 쓰면 다음과 같이 풀 수 있습니다.
결론적으로 우리가 찾는 축은
- 대칭행렬이 뭐였더라
전치행렬과 본 행렬이 같은, 즉 행렬의 모든 원소를 뒤집어도(대각선을 기준으로 접어도) 똑같은 대칭인 행렬- 공분산행렬은 대칭행렬임
-
- 벡터의 직교가 뭐였더라
- 두 벡터의 내적이 0이면 두 벡터가 직교함
-
- 왜 대칭 행렬의 고유벡터는 직교할까?
-
- 대칭 행렬의 특성인
때문에 C의 서로 다른 고유값 , 와 상응하는 고유벡터 , 에 대해 이런 식이 도출되는데 , 는 서로 다른 값이어서 그 차이가 0이 될 수 없으므로 라는 직교의 정의를 얻을 수 있다!
-
다시 제일 만만한 2차원 그림을 보자. PC1과 PC2가 2개의 직교하는 축이며, PC1이 더 큰 고유값 = 더 많은 분산을 보존한다! (그림 출처)
다시 돌아와서, 얻은 축들을 고유값이 큰 순서에 따라 내림차순으로 정렬합니다(처음 문제를 풀었던 식을 들여다보면 고유값이 클수록 분산이 더 크게 보존될 거라는 걸 알 수 있습니다). 우리는 1차원으로 축소하고 싶으므로 이 값이 가장 큰 고유벡터를 사용하면 됩니다.