👩‍💻LEARN : ML&Data/Book Study

[알고리즘 구현으로 배우는 선형대수] #10. 고유값과 고유벡터

쟈니유 2023. 4. 13. 15:04
728x90

기하학! 하고 안울어도 되어서 다행이다 ..아직은...


#10. 고유값과 고유벡터 

 

1. 고윳값과 고유 벡터의 개념 

 

Ax = λx 

 

  • 고유 벡터(x) 
    • 벡터에 선형 변환(A)을 취했을 때, 방향은 변하지 않고 크기만 변하는 벡터 
  • 고윳값 (eigenvalue, λ)
    • 행렬의 특성을 나타내는 값으로 선형 변환 이후 변한 크기 (λ)로, 기존 벡터 x의 방향은 변하지 않고 길이만 λ만큼 변한 것을 의미 
구분 길이 변화 방향 변화
λ <= -1 기존 벡터보다 길어짐  기존 벡터 반대
-1 <= λ <= 0 기존 벡터보다 짧아짐 기존 벡터 반대
0 <= λ <= 1 기존 벡터보다 짧아짐  기존 벡터 동일
λ >=1 기존 벡터보다 길어짐 기존 벡터 동일 

 

2. 고윳값과 고유 벡터 계산 

특성 방정식 사용하여 계산하기

  • Ax = λx 
  • => (A -λ)x = 0 
  • 고유값 λ가 존재하기 위한 필요충분 조건은 A -λ의 행렬식이 0이 되는 것 (=역행렬이 없는 것) 
  • 이에 위의 특성 방정식을 만족하는 λ를 찾으면 고유값을 구할 수 있음 

예제 

❊ 3 이상의 n x n  행렬일 경우 소행렬식과 여인수를 사용하여 행렬식 계산 [참고]

 

QR분해 사용하여 계산하기

전제 

  • A= QR 이므로 Q는 직교 행렬이며 R은 상삼각 행렬이다.
  • Q 가 직교행렬이므로 Q의 역행렬 = Q의 전치행렬과 동일하다 [참고]

첫번째 단계 

QR분해할 행렬 A를 준비하고, 초기 행렬 A0 = A로 설정한다. 

 

두번째 단계

A0 = Q0R0 

 

세번째 단계 

앞서 구한 Q0,R0를 바탕으로 행렬 A1을 아래와 같이 구한다 

A1 = R0Q0 

 

네번째 단계

A1 = Q1R1 

 

다섯번째 단계

A2 = R1Q1 

 

여섯번째 단계

즉 Ak = QkRk 이며 Ak+1 = RkQk임을 확인함 

 

Ak+1 = RkQk = Qk의 역행렬*Qk*Rk*Qk

= Qk의 역행렬 *Ak*Qk

= Qk의 전치행렬 * Ak*Qk

= Qk의 전치행렬 * (Qk-1의 전치행렬 * Ak-1 * Qk-1) *Qk

= (Q의 전치행렬들) * A0 * (Q행렬들)

그러므로 

Ak+1(Q의 행렬들 which is 전치행렬이었음) = A0(Q의 행렬들) 

 

위 과정을 반복하면 Ak는 삼각행렬 상태로 수렴하게 되어 Ak의 고유값을 대각원소의 곱으로 구할 수 있음

A0와도 동일한 고윳값으로, 이를 통해 고유벡터를 구할 수 있음 

 

이때 Ak+1(Q의 행렬들 which is 전치행렬이었음) = A0(Q의 행렬들) 이므로, 고유 벡터 = Q의 행렬들임을 알 수 있음 

이를 통해 고유값과 고유벡터를 구할 수 있음 

 

 

3. 고윳값과 고유 벡터의 성질 

  • 양의 정수 n에 대해 행렬 A의 고윳값이 λ이고 고유벡터가 x일 때 행렬 A**n의 고윳값은 λ**n이고 고유 벡터는 xdlek. 
  • 정사각 행렬 A가 가역행렬(역행렬이 있는 행렬)이기 위한 필요충분 조건은 행렬 A의 고윳값이 0 이 아닌 것
  • 고유 벡터는 유일하지 않음 

4. 파이썬 실습 

#행렬의 고윳값과 고유 벡터 구하기 

#1. 넘파인 활용 
import numpy as np

A = np.array([[3,0],[8,-1]])

e,v = np.linalg.eig(A)  #e:고윳값, v :고유벡터 

#2. 함수 정의 with QR분해 

def eig_qr(A):
"""A가 대칭행렬일 때만 사용 가능"""

n = lean(A)
E = deepcopy(A)
V = identity(n) #단위행렬로 초기화. 추후 고유벡터로 업데이트됨 

for i in range(0,30): #임의의 수
	Q,R = qr_gram(E)  #E를 QR분해해서 할당 
    E = matmul(R,Q)   #E는 RQ행렬곱으로 업데이트 > 고유값 
    V = matmul(V,Q)   #V는 VQ행렬곱으로 업데이트 
    
return E,V