개발일기

기초 수학 - 고유값의 특성 본문

Deep Learning, Machine Learning/기초 수학

기초 수학 - 고유값의 특성

Flashback 2024. 3. 31. 22:51
728x90
반응형

고유값

고유값은 행렬의 계수가 행렬의 모든 고유값의 곱과 같다는 특징을 가지고 있다.

import numpy as np

A = np.array([[4, 5],
              [2, 6]])
lam, v = np.linalg.eig(A) # EigenValues, EigenVectors
det = np.linalg.det(A) # Determinant

print("EigenValues product: ", np.product(lam))
print("Determinant: ", det)

"""
EigenValues product:  14.0
Determinant:  14.000000000000004
"""

A 행렬은 2차원 행렬이므로 고유값이 2개가 생성된다. 고유값을 모두 곱하고 행렬 계수와 비교하면 동일한 값이 나오는 것을 확인할 수 있다.

 

고유값 분해

행렬을 분해하면 선형 방정식의 해를 구하거나 행렬 연산을 효율적으로 하거나 행렬의 구조를 밝히는 목적 등을 위해 행렬을 분해하곤 한다. 행렬 분해 중에서 자주 쓰이는 방법 중 하나가 고유값 분해이다. 정방 핼열에서 구한 고유 벡터와 고유값을 활용하여 행렬을 분해하면 앞서 설명한 행렬 분해의 이점을 얻을 수 있다. 고유값 분해가 사용되는 예는 다음 게시글에 써볼 예정이며 지금은 고유값 분해를 하는 방법과 설명하고자 한다.

고유값 분해는 $ A = V \Lambda V^{-1} $ 공식으로 분해된다. 고유 벡터에 고유값을 곱한 후, 고유 벡터의 역행렬을 곱하면 A 행렬이 나온다는 의미이다. 기존에 사용하던 고유값 부호는 $ \lambda $이다. 고유값 분해에는 대문자 lambda를 사용하는데 대각 행렬로 표현된다. 즉 lambda값이 대각선에 위치하고 나머지 요소들은 0으로 채워넣으면 된다. 즉 벡터 형식의 고유값이 행렬 형식으로 바뀌게 된다.

# Uppercase Lambda
import numpy as np

A = np.array([[4, 5],
              [2, 6]])

lam, v = np.linalg.eig(A) # EigenValues, EigenVectors
print("Vector Lambda: ", lam, "\\n")

lam = np.diag(lam)
print("Matrix Lambda: \\n", lam)

"""
Vector Lambda:  [1.68337521 8.31662479] 

Matrix Lambda: 
 [[1.68337521 0.        ]
 [0.         8.31662479]]
"""

diag(): 대각 행렬을 만드는 numpy메서드다.

diag()로 기존 lamba(EigenValues)를 대각 행렬로 만든다.

# Eigen Decomposition
import numpy as np

A = np.array([[4, 5],
              [2, 6]])

lam, v = np.linalg.eig(A) # EigenValues, EigenVectors
lam = np.diag(lam)

eigen_decomposition = np.dot(np.dot(v, lam), np.linalg.inv(v))
print(eigen_decomposition)

"""
[[4. 5.]
 [2. 6.]]
"""

$ A = V \Lambda V^{-1} $ 공식을 따라 행렬을 곱하면 고유값 분해 결과가 행렬 A와 동일한 것을 확인할 수 있다. 또한 고유값 분해를 간단하게 하기 위해 보통 대칭 행렬에서 계산이 이루어진다. 대칭 행렬에서의 고유값 분해는 공식으로 보면 $ A = Q\Lambda Q^{-T} $가 된다. V라는 벡터가 Q로 변경되고 역행렬이 아닌 전치 행렬을 곱하도록 바뀐다. Q로 표시하는 이유는 나중가면 알겠지만 행렬이 직교 행렬이라는 것이 증명되기에 Q로 표시한다.

 

import numpy as np

A = np.array([[3, 0],
              [0, 2]])

lam, Q = np.linalg.eig(A) # 고유 벡터가 대각 행렬
lam = np.diag(lam)

print("EigenValues Lambda: \\n", lam)
print("EigenVectors Q: ", Q)
print("Result: \\n", np.dot(Q, np.dot(lam, Q.T)))

"""
EigenValues Lambda: 
 [[3. 0.]
 [0. 2.]]
EigenVectors Q:  [[1. 0.]
 [0. 1.]]
Result: 
 [[3. 0.]
 [0. 2.]]
"""

고유 벡터가 대각 행렬인 행렬로 공식을 풀어보면 올바르다는걸 확인할 수 있다. 대각 행렬은 기존 행렬과 전치 행렬을 곱하면 단위 행렬이 계산되는 특징을 가지고 있다. 즉, $ QQ^T $는 단위 행렬 $ \begin{pmatrix} 1 & 0 \\ 0 & 1 \\ \end{pmatrix} $ 이 되기에 고유값의 대각 행렬이 행렬 A와 동일하다는게 확인된다.


참고 사이트:

https://better-tomorrow.tistory.com/entry/%EA%B3%A0%EC%9C%A0%EA%B0%92-%EB%B6%84%ED%95%B4-eigen-decomposition

 

고유값 분해 (eigen decomposition)

수학적 대상 중에는 그것을 구성요소들로 분해해서, 표현 방식과는 무관하게 보편적인 어떤 성질을 찾아내면 더 잘 이해 할 수 있는 것이 많다. 예시) 어떤 경우이든 십진수 12는 2 X 2 X 3이라는

better-tomorrow.tistory.com

 

https://datascienceschool.net/02%20mathematics/03.03%20%EA%B3%A0%EC%9C%B3%EA%B0%92%20%EB%B6%84%ED%95%B4.html#id29

 

3.3 고윳값 분해 — 데이터 사이언스 스쿨

 

datascienceschool.net

 

https://colab.research.google.com/drive/15sp5O-v4jp5S674Q4wNZbqz_MOe7wVTM?usp=sharing

 

고유값의 성질.ipynb

Colaboratory notebook

colab.research.google.com

 

728x90
반응형
Comments