고유값과 고유벡터

고유값과 고유벡터

2016, Dec 01    


  • 참조 : https://darkpgmr.tistory.com/


  • 이번 글에서는 선형대수학에서 가장 핵심이 되는 고유값(eigenvalue)고유벡터(eigenvector)에 대하여 다루어 보도록 하겠습니다.
  • 고유값과 고유벡터에 대한 내용은 블로그 내의 다음 글에서도 참조 가능합니다.


※ 고유값(eigenvalue)과 고유벡터(eigenvector)


  • 선형대수학에서 가장 중요한 개념 중의 하나인 고유값고유벡터에 대해서 다루어 보겠습니다.
  • 고유값과 고유 벡터는 다음 개념 등에 사용되고 있습니다.
    • SVD(특이값 분해)
    • Pseudo-Inverse
    • 선형연립방정식의 풀이
    • PCA(주성분 분석)


1. 고유값과 고유벡터란?


  • 고유값(eigenvalue)와 고유벡터(eigenvector)에 대한 수학정 정의는 간단합니다.
    • 행렬 A를 선형변환으로 봤을 때, 선형변환 A에 의한 변환 결과가 자기 자신의 상수배가 되는 0이 아닌 벡터를 고유벡터
    • 이 때, 상수배 값을 고유값이라고 합니다.
    • 고유벡터 : n x n 정방행렬(고유값, 고유벡터는 정방행렬에 대해서만 정의됨) A에 대하여 Av=λvAv=λv를 만족하는 0이아닌 벡터
    • 고유값 : 상수 λλ
  • Av=λvAv=λv1번식

(a11a1nan1ann)(v1vn)=λ(v1vn)⎜ ⎜a11a1nan1ann⎟ ⎟⎜ ⎜v1vn⎟ ⎟=λ⎜ ⎜v1vn⎟ ⎟2번식

  • 좀 더 정확한 용어로 λλ행렬 A의 고유값이고 vv는 행렬 A의 λλ 에 대한 고유벡터이다 라고 말할 수 있습니다.
  • 고유값과 고유벡터는 행렬에 따라 정의되는 값으로서 어떤 행렬은 고유값과 고유벡터가 존재하지 않을 수도 있습니다.
    • 어떤 행렬은 하나만 존재하거나, 최대 N x N 행렬에서 N개까지 존재할 수 있습니다.


2. 고유값과 고유벡터의 기하학적 의미


  • 고유벡터 : 선형변환 A에 의해 방향은 보존되고 스케일만 변환되는 방향벡터
  • 고유값 : 고유벡터가 변화되는 스케일
  • 예를 들어 지구가 자전운동하는 것을 3차원 회전변환으로 생각해 보았을 때,
    • 고유벡터 : 회전축 벡터
    • 고유값 : 1


3. 고유값 분해를 이용한 대각화 : eigen-decomposition


  • 고유값, 고유벡터는 정방행렬의 대각화와 밀접한 관련이 있습니다.
  • 대각행렬과의 행렬곱에 대해 살펴보면, 대각행렬을 뒤에 곱하면 행렬의 열벡터들이 대각원소의 크기만큼 상수배가 됩니다
  • (v11v12v13v21v22v23v31v32v33)(λ1000λ1000λ1)=(λ1v11λ2v12λ3v13λ1v21λ2v22λ3v23λ1v31λ2v32λ3v33)v11v12v13v21v22v23v31v32v33λ1000λ1000λ1=λ1v11λ2v12λ3v13λ1v21λ2v22λ3v23λ1v31λ2v32λ3v333번식
  • 행렬 A의 고유값, 고유벡터들을 λi,vi,i=1,2,3,...,nλi,vi,i=1,2,3,...,n 이라고 하겠습니다.
    • Av1=λ1v1Av2=λ2v2...Avn=λnvnAv1=λ1v1Av2=λ2v2...Avn=λnvn4번식
  • 4번식을 한꺼번에 표현하여 정리해보겠습니다.
    • A[v1 v2 ...vn]=[λ1v1 λ2v2 ...λnvn]=[v1 v2 ...vn][λ1000λ20000λn]A[v1 v2 ...vn]=[λ1v1 λ2v2 ...λnvn]=[v1 v2 ...vn]⎢ ⎢ ⎢ ⎢ ⎢λ1000λ20000λn⎥ ⎥ ⎥ ⎥ ⎥5번식
  • 행렬 A의 고유벡터들을 열벡터로 하는 행렬을 PP, 고유값들을 대각원소로 하는 대각 행렬을 ΛΛ라고 하면 다음식이 성립합니다.
    • AP=PΛAP=PΛ6번식
    • A=PΛP1A=PΛP17번식
  • 이와 같이 행렬 A는 자신의 고유벡터들을 열벡터로 하는 행렬과(PP) 고유값을 대각원소로 하는 행렬(ΛΛ)의 곱으로 대각화 분해가 가능합니다.
    • 이러한 대각화 분해를 eigen-decomposition 이라고 합니다.
    • [110021003][111012002][100020003][111012002]111002100311101200210002000311101200218번식


  • 모든 정방행렬이 이런 방식의 eigen decomposition이 가능한 것은 아니지만 대각화 가능한 경우 아래 항목을 쉽게 계산할 수 있습니다.
    • det(A)
      •  det(A)=det(PΛP1)det(A)=det(PΛP1)
      •  =det(P) det(Λ) det(P)1=det(P) det(Λ) det(P)1
      •  =det(Λ)=det(Λ)
      •  =λ1λ2λn=λ1λ2λn9번식
      • 행렬 A의 determinant는 고유값들의 곱과 같습니다.
    • A의 거듭제곱
      •  Ak=(PΛP1)kAk=(PΛP1)k
      •  =(PΛP1)(PΛP1)(PΛP1)=(PΛP1)(PΛP1)(PΛP1)
      •  =PΛkP1=PΛkP1
      •  =P diag(λk1,,λkn)P1=P diag(λk1,,λkn)P110번식
      • 행렬 A의 거듭제곱은 PPΛΛ의 곱으로 나타내어 집니다.
    • 역행렬
      •  A1=(PΛP1)1A1=(PΛP1)1
      •  =PΛ1P1=PΛ1P1
      •  =P diag(1λ1,,1λn)P1=P diag(1λ1,,1λn)P111번식
      • 행렬 A의 역행렬은 PPΛΛ의 곱으로 나타내어 집니다.
    • 대각합(trace)
      •  tr(A)=tr(PΛP1)tr(A)=tr(PΛP1)
      •  =tr(Λ)(tr(AB)=tr(BA))
      •  =λ1++λn12번식
      • 행렬 A의 대각합은 고유값의 합과 같습니다.
    • 행렬의 다항식
      •  f(A)=a0E+a1A++anAn(f(x)=a0+a1x++anXn)
      •  =a0PP1+a1PΛP1++anPΛnP1
      •  =P(a0P1+a1ΛP1++anΛnP1)
      •  =P(a0E+a1Λ++anΛn)P1
      •  =P diag(f(λ1),,f(λn))P113번식
      • 행렬의 다항식은 고유값과 고유벡터를 이용하여 간략하게 표현할 수 있습니다.


4. 고유값 분해(eigen-decomposition) 가능조건 - 일차 독립


  • 모든 정방행렬이 고유값 분해가 가능한 것은 아닙니다.
  • n x n 정방행렬 A가 고유값 문해가 가능하려면 행렬 A가 n개의 일차독립인 고유벡터를 가져야 합니다.
    • 일차독립(Linearly Independent)를 간단하게 설명하면
    • 어떤 벡터들의 집합 {v1,,vn} 이 있을 때, 이들 벡터들 중 어느 한 벡터도 다른 벡터들의 일차결합으로 표현될 수 없으면 이 벡터들은 서로 일차독립이라고 정의합니다.
    • 벡터들의 일차결합이란 a1v1+a2v2++anvn과 같이 상수를 곱하여 합친 형태를 말합니다.
      • 만약 v1=(1,0,0),v2=(0,1,0),v3=(0,0,1) 이라면 v2,v3를 이용해서는 v1을 만들 수 없습니다.
      • 이와 같이 어떤 벡터도 다른 벡터들의 상수배 합으로 표현될 수 없으면 서로 일차독립이라고 합니다.
    • 또한 Rn 공간에서는 최대 n개의 일차독립인 벡터들을 가질 수 있으며 n개의 일차독립인 벡터들은 이 공간을 생성하는 basis 역할을 합니다.
      •  v1=(1,0,0),v2=(0,1,0),v3=(0,0,1),v4=(1,3,4) 라면 {v1,v2,v3}은 일차독립 이지만 {v1,v2,v3,v4}는 일차독립이 아닙니다.
        •  v4=v1+3v2+4v3
      • 즉, 3차원 공간에서 가능한 일차독립인 벡터들의 갯수는 최대 3개입니다.
    • 또한 v1,v2,v3을 이용하여 3차원 공간의 모든 (x,y,z) 좌표를 생성할 수 있음을 알 수 있습니다.
      • 어떤 일차 독립인 벡터들의 집합의 일차결합을 통하여 어떤 공간의 모든 좌표를 생성할 수 있으면 이 벡터들을 이 공간의 basis라고 정의합니다.
  • 따라서 n차 정방행렬이 고유값 분해가 가능하려면 n개의 일차독립인 고유벡터가 존재해야 합니다.
    • 이 이유에 대해서는 고유값과 고유벡터의 계산과정을 통하여 알아보겠습니다.


5. 고유값, 고유벡터의 계산


  • 고유값과 고유벡터를 정의하는 식인 Av=λv 에서 v 에 대해 정리해 보면 다음과 같습니다.
    •  Av=λv
    •  Avλv=0
    •  (AλE)v=014번식
  • 구하고자 하는 고유값, 고유벡터14번식을 풀어서 나오는 λv 입니다. (v0)
  • 그런데 14번식에서 (AλE)의 역행렬이 존재하면 v는 항상 영벡터가 됩니다.
  • 따라서 고유값과 고유벡터가 존재 하려면 (AλE) 의 역행렬이 존재하면 안됩니다.
    •  det(AλE)=015번식
    • 15번식을 행렬 A에 대하여 특성방정식(Characteristic equation)이라고 부르며 이 식을 λ에 대하여 풀면 A의 고유값을 구할 수 있습니다.
    • 고유벡터는 이렇게 구한 λ를 다시 (AλE)v=0 에 대입하여 구할 수 있습니다.


  • 다음 행렬의 고유값과 고유벡터를 구해보겠습니다.
  •  [202112001]
  •  det(AλE)=det([202112001]λ[100010001])
  •  =|2λ0211λ2001λ|
  •  =(2λ)((1λ)(1λ)0)
  •  =(2λ)(1λ)217번식
  • 따라서 특성방정식은 (2λ)(1λ)2=0
  • 특성방정식의 해는 λ=1,2이고 2인경우에는 단일근이지만 1인 경우에는 이중근입니다.
  • 고유벡터와 고유값은 쌍을 이루기 때문에 단일근에는 1개의 고유벡터가, 이중근에는 최대 2개, 삼중근에는 최대 3개의 고유벡터가 존재합니다.
  • 먼저 λ=2(AλE)v=0 에 대입하여 고유벡터를 구해보겠습니다.
    •  [2λ0211λ2001λ][v1v2v3]=[000]
    •  [002112001][v1v2v3]=[000]
    •  v1=v2,v3=019번식
    • 따라서 λ=2 일 때 대응하는 고유벡터는 v=[1,1,0]T 로 잡을 수 있습니다.
  • 동일한 방법으로 λ=1에 대하여 구해보면
    •  [102102000][v1v2v3]=[000]
    •  v1=2v320번식
    • 20번식을 만족하는 임의의 벡터는 [2t,s,t]로 표현할 수 있습니다. (t, s는 임의의 실수)
    • 그리고 [2t,s,t]=t[2,0,1]+s[0,1,0] 으로 표현할 수 있으므로 [2,0,1],[0,1,0]의 일차 결합으로 표현될 수 있습니다.
  • 계산 과정을 통해 확인을 해 보면 고유값은 유일하지만 고유벡터는 유일하지 않습니다.
    •  Av=λv의 양변에 상수 c를 곱하면
    •  A(cv)=λ(cv)
    • 만약 vλ에 대한 고유벡터이면 0이 아닌 임의의 상수 c에 대하여 cv 또한 λ에 대한 고유벡터임을 알 수 있습니다.
    • 또한 v1,v2가 모두 고유값 λ에 대응하는 고유벡터라고 하면 임의의 상수 c1,c2에 대하여
      •  A(c1v1+c2v2)=c1λv1+c2λv2=λ(c1v1+c2v2)
      • 따라서 c1v1+c2v2 또한 λ에 대한 고유벡터가 됨을 알 수 있습니다.
  • 따라서 고유벡터는 19번식 또는 20번식등과 같은 제약조건을 만족하는 벡터들 중에서 어느 벡터를 사용해도 무관하나 일반적으로 벡터의 크기를 1로 정규화한 단위 벡터를 고유벡터로 잡는 것이 일반적입니다.
  • 20번식에서는 자유도가 2이기 떄문에 일차독립인 2개의 고유벡터를 잡아야만 가능한 모든 고유벡터들을 대표할 수 있습니다.
  • 위에서 구한 고유값과 고유벡터를 이용하여 행렬 대각화가 정말로 성립하는 지 확인해 보겠습니다.
    •  A=PΛP1
    •  [202112001]=[102110001][200010001][102110001]1


6. 대칭행렬과 고유값 분해


  • 정방행렬들 중에서 대각원소를 중심으로 원소값들이 대칭되는 행렬 즉, AT=A (즉, 모든 i,j에 대하여 aij=aji)인 행렬을 대칭행렬이라 합니다.
  • 대칭행렬은 고유값 분해와 관련하여 매우 좋은 성질 2개를 가지고 있습니다.
    • 실수값 원소의 대칭행렬은 항상 고유값 대각화가 가능합니다.
    • 그리고 이 대각화는 직교행렬로 대각화가 가능하다.
    •  A=PΛP1 (A는 대칭행렬이라고 하면)
    •  =PΛPT24번식
      • 단, PPT=E(P1=PT)
      • 즉, P가 직교행렬인 경우를 뜻합니다. (직교행렬의 정의는 아래 글에서 확인 가능합니다.)
    • 대칭행렬의 이러한 성질은 특이값분해(SVD)와 주성분분석(PCA)에서 가장 기본이 되는 성질로 활용됩니다.
  • 모든 정방행렬이 고유값 분해가 가능한 것은 아니지만 대칭행렬항상 고유값 분해가 가능하고 직교행렬로 대각화가 가능함을 기억해둡시다.(증명은 생략)


7. 직교(orthogonal)와 정규직교(orthonormal) 그리고 직교행렬(orthogonal matrix)


  • orthogonal(직교) : 두 벡터 v1,v2v1v2=0의 관계를 가지는 경우 입니다.
    • 정리하면 v1v2=0
  • orthonormal(정규직교) : 두 벡터 v1,v2가 단위 벡터이면서 서로 orthogonal한 경우 입니다.
    • 단위 벡터인 경우는 벡터의 크기가 1인 경우로 정규화 과정을 거친 벡터를 말합니다.
      • 즉, v=vv 입니다.
    • 정리하면 v1v2=0,v1=1,v2=1
  • orthogonal matrix(직교행렬) : 전치행렬을 역행렬로 갖는 정방행렬을 뜻합니다.
    •  A1=AT
    •  AAT=E
    • 또한 직교 행렬이 가지고 있는 성질 중 직교 행렬을 구성하는 행/열벡터들은 모두 단위 벡터이면서 서로 orthogonal한 성질을 갖습니다.
      • 즉 각각의 행끼리 또는 열끼리 벡터들은 orthonormal 합니다.
      •  vi=1(i=1,,n),vivj=0(ij)
    • 따라서 정리하면 orthogonal matrix는 그 행렬을 구성하는 열벡터(행벡터)들이 서로 orthogonal 하면서 그 각각의 벡터들이 noraml(크기가 1)한 행렬도 정의될 수 있습니다.
  • 최종 정리하면 다음과 같습니다.
    • orthogonal : vivj=0
    • orthonormal : orthogonal + 크기가 1인 단위 벡터
    • orthogonal matrix : AAT=E (행렬을 구성하는 열벡터(행벡터)들이 orthonormal하다.)


python을 이용한 고유값과 고유벡터 구하기


  • 파이썬의 numpy를 이용하면 고유값과 고유벡터를 쉽게 구할 수 있습니다. 아래 코드는 임의의 행렬을 받았을 때, ① 고유값과 고유행렬을 구하고 ② 고유값의 크기가 큰 순서대로 내림차순 정렬을 하고 ③ 마지막으로 고유값의 크기가 0 (또는 0에 매우 근사)인 값을 제거하는 코드입니다.


import numpy as np

A = np.array([ 
    [1,0,2],
    [4,3,6],
    [3,1,9]
])

def get_eigen(A, sorted=True, non_zero=True, round_digit=4):
    eigvals, eigvecs = np.linalg.eig(A)
    eigvals = np.round(eigvals, round_digit)
    eigvecs = np.round(eigvecs, round_digit)

    if sorted:
        idx = np.argsort(eigvals)[::-1]
        eigvals = eigvals[idx]
        eigvecs = eigvecs[:, idx]

    if non_zero:
        zero_eigvals_idx = np.where(np.abs(eigvals) < 1e-10)
        eigvals = np.delete(eigvals, zero_eigvals_idx)
        eigvecs = np.delete(eigvecs, zero_eigvals_idx, axis = 1)

    return eigvals, eigvecs

eigvals, eigvecs = get_eigen(A)

print(eigvals)
# [10.5366  1.9196  0.5439]

print(eigvecs)
# [[-0.1535  0.1574 -0.6742]
#  [-0.664  -0.9849  0.7224]
#  [-0.7318  0.0724  0.1538]]