[개발자를 위한 실전 선형대수학] 12.1 고윳값과 고유벡터의 해석, 12.2 고윳값 구하기

[chapter12] 고윳값 분해 : 선형대수학의 진주

1. 고윳값

기하학적 해석

행렬과 벡터를 특수하게 결합하면 행렬이 벡터를 늘리기는 하지만 회전시키지는 않는다.

이 벡터가 행렬의 고유벡터이며, 늘어나는 양이 고윳값이다.

책 254p

그림은 2x2 행렬로 곱하기 전과 후의 벡터를 보여준다.

왼쪽 그림의 v1, v2를 보면, 실선은 원래 벡터를 말하고 점선은 행렬 M을 곱한 결과를 말한다.

이 때 실선과 점선이 같은 직선 위에 있기 때문에 v1, v2는 고유벡터이다.

반대로 오른쪽 그림에서 w1, w2와 Mw1, Mw2는 행렬을 곱한 후 벡터가 다른 방향으로 꺾였기 때문에 고유벡터가 아니다.

즉, 고유벡터는 행렬 벡터 곱셈이 스칼라-벡터 곱셈처럼 작동한다는 것을 의미한다. 이를 방정식으로 나타내면 아래와 같다.

$$ Av = \lambda v $$

이 때 행렬이 스칼라와 같다는 의미는 아니고, 동일한 벡터에 대해 행렬이 미치는 효과가 스칼라가 미치는 효과와 동일하다는 것이다.

이를 '고윳값 방정식'이라고 하며 꼭 외워두어야 할 선형대수학의 핵심 공식이다.

잡음

대부분의 데이터 집합에는 잡음(noise)이 포함되어 있다.

잡음은 설명할 수 없거나(예: 무작위 변동) 원치 않는 데이터 집합의 분산을 의미한다.

무작위 잡음을 줄이는 한 가지 방법은 시스템의 고윳값과 고유벡터를 식별한 다음, 작은 고윳값과 관련된 데이터 공간에서 방향을 투영하는 것이다.

즉 무작위 잡음이 전체 분산에 기여하는 바가 상대적으로 작다고 가정한다.

데이터 차원을 '투영'한다는 것은 임곗값보다 낮은 일부 고윳값을 0으로 설정한 후 데이터 집합을 재구성하는 것을 의미한다.

ChatGPT랑 다시 이해하기

데이터 = 의미있는 구조 + 무작위 잡음 으로 정의했을 때, 잡음은 전체 분산에 조금만 기여한다고 가정한다.

데이터 행렬에서 고유벡터는 '데이터가 퍼져있는 방향'을 의미하고, 고윳값은 '그 방향으로 분산 크기'를 말한다.

즉, 큰 고윳값은 데이터가 많이 퍼진 방향(신호)이고, 작은 고윳값은 거의 안퍼진 방향(잡음일 가능성이 큼)이다.

작은 고윳값에 해당하는 방향은 버려도 정보 손실이 크지 않은 잡음이라고 가정하는 것이다.

따라서 중요하지 않은(작은 고윳값) 방향을 제거하고 중요한 방향으로만 데이터를 다시 만들어 차원을 줄이고, 잡음을 줄이는 방법이다.

2. 고윳값 구하기

정방 행렬을 고윳값 분해하려면 먼저 고윳값을 찾은 다음 각 고윳값을 사용하여 해당 고유벡터를 찾는다.

파이썬을 이용하면 행렬의 고윳값을 매우 쉽게 찾을 수 있다.

matrix = np.array([
    [1,2],
    [3,4]
])

# 고윳값 구하기
evals = np.linalg.eig(matrix)[0]
print(evals)
# [-0.37228132  5.37228132]

행렬의 고윳값을 구하려면 위에서 본 고윳값 방정식으로 시작해 간단한 대수 연산을 수행한다.

$$ \begin{align} Av = \lambda v \\ Av - \lambda v = 0 \\ (A - \lambda I) = 0 \end {align} $$

두 번째 식의 왼쪽에는 두 개의 벡터 항이 있고, 둘다 v를 포함하기 때문에 공통인수를 추출한다.

이 때 A에서 스칼라 $\lambda$를 빼야하기 때문에 대신 행렬을 $\lambda$만큼 이동하여 계산한다.

세 번째 방정식은 고유벡터가 고윳값에 의해 이동된 행렬의 영공간에 존재한다는 것을 의미한다.

$$ \begin{align}\widetilde{A} = A - \lambda I \\ \widetilde{A}v = 0 \end {align} $$

선형대수학에서는 단순한 해를 무시하므로 v = 0을 고유벡터로 보지 않는다.

즉, v는 0이 아니므로 Mv = 0이 되게 하는 행렬 M은 특이행렬이다.

이는 고윳값에 의해 이동된 행렬이 특이 행렬이라는 것을 의미하는데 특이 행렬만이 자명하지 않은 영공간을 갖기 때문이다.

그리고 특이 행렬의 행렬식은 0이므로 아래와 같은 식을 만족한다.

$$ \left | A - \lambda I\right | = 0 $$

그러면 아래 그림처럼 식을 얻어 람다값을 구할 수 있다.

 

책 258p

정리하자면 아래와 같다.

  • 행렬-벡터 곱셈은 스칼라-벡터 곱셈(고윳값 방정식)처럼 동작한다.
  • 고윳값 방정식을 영벡터로 설정하고 공통항을 추출한다.
  • 이렇게 하면 고유벡터가 고윳값에 의해 이동된 행렬의 영공간에 있음을 알 수 있다. 영벡터를 고유벡터로 간주하지 않으므로 이동된 행렬은 특이행렬이다.
  • 따라서 이동된 행렬의 행렬식을 0으로 설정하고 미지의 고윳값을 구한다.

고윳값으로 이동된 행렬의 행렬식을 0으로 둔 것을 행렬의 특성 다항식이라 한다.

방정식을 만족시킬 수 있는 람다값은 두 가지가 있다.

즉 MxM 행렬의 특성 다항식은 $\lambda^M$항을 가진다. 

3. 고유벡터 찾기

파이썬에서는 아래와 같이 고유벡터를 찾을 수 있다.

evals, evecs = np.linalg.eig(matrix)
print(evals), print(evecs)
#[-0.37228132  5.37228132]

#[[-0.82456484 -0.41597356]
# [ 0.56576746 -0.90937671]]

고유벡터는 행렬 evecs의 열에 존재하고, 고윳값과 같은 순서이다.

즉 행렬 evecs의 첫 번째 열에 있는 고유벡터는 벡터 evals의 첫 번째 고윳값과 짝을 이룬다.

고유벡터는 $\lambda$만큼 이동한 행렬의 영공간에 있는 벡터 v를 구해 찾을 수 있다. 식은 아래와 같다.

$$ v_i \in N(A - \lambda_iI) $$

예를 들면, 다음은 행렬과 행렬의 고윳값이다.

$$ \begin{bmatrix}1 & 2 \\2 & 1 \\\end{bmatrix} \Rightarrow \lambda_1 = 3, \lambda_2 = -1 $$

행렬의 고유벡터를 구하기 위해 행렬을 3만큼 이동하고 그 영공간에서 벡터를 찾는다.

$$ \begin{bmatrix}1-3 & 2 \\2 & 1-3 \\\end{bmatrix} = \begin{bmatrix}-2 & 2 \\2 & -2\\\end{bmatrix}\begin{bmatrix}1 \\1\end{bmatrix} = \begin{bmatrix}0 \\0\end{bmatrix} $$

즉 [1 1]은 고윳값 3과 관련된 행렬의 고유벡터이다.

영공간 벡터는 가우스-조던을 사용하여 연립방정식을 풀면 구할 수 있다.

여기서 계수 행렬은 $\lambda$만큼 이동된 행렬이고, 상수벡터는 영벡터이다.

고유벡터의 부호와 크기 불확정성

위의 예시에서 [1 1]이 영공간에 대한 유일한 기저벡터는 아니다. [4 4] 또는 [-5.4 -5.4] 등 무수한 벡터가 될 수 있다.

즉, 벡터 [1 1]의 크기를 조정한 모든 벡터는 영공간의 기저가 될 수 있다.

v가 행렬의 고유벡터라면 0을 제외한 모든 실숫값 $\alpha$에 대해 $\alpha v$도 고유벡터이다.

실제로 고유벡터는 크기가 아닌 방향 때문에 중요하다.

고유벡터는 무수히 많으나, 단위 정규화된 고유벡터(유클리드 노름 1)는 하나만 존재한다.

또한 고유벡터는 방향만 중요하고 부호는 중요하지 않다.

고유벡터는 하나의 벡터가 아니라 원점을 지나는 직선이고, 그 직선위에 있는 모든 벡터는 고유벡터이다.

따라서 v와 -v는 같은 고유방향이기 때문에 부호가 정해지지 않는다. 이걸 부호 불확정성이라 한다.