일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- NCP
- linux
- 기초 수학
- phpredis
- Go
- Node
- nodejs
- javascript
- Redux
- AWS
- SQL
- Backbone.js
- For
- laravel
- Redis
- Switch
- CentOS
- python
- docker
- Machine Learning
- Babel
- nginx
- fastapi
- React
- php
- deep learning
- rabbitmq
- 블레이드 템플릿
- webpack
- mariadb
- Today
- Total
개발일기
기초 수학 - 고유값의 특성 본문
고유값
고유값은 행렬의 계수가 행렬의 모든 고유값의 곱과 같다는 특징을 가지고 있다.
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://colab.research.google.com/drive/15sp5O-v4jp5S674Q4wNZbqz_MOe7wVTM?usp=sharing
'Deep Learning, Machine Learning > 기초 수학' 카테고리의 다른 글
기초 수학 - 특이값 분해(SVD)를 활용한 이미지 압축 (0) | 2024.04.20 |
---|---|
기초 수학 - 특이값 분해(SVD) (0) | 2024.04.13 |
기초 수학 - 행렬 판별식 (0) | 2024.03.31 |
기초 수학 - 고유 벡터와 고유값 (0) | 2024.03.31 |
기초 수학 - 행렬 (0) | 2024.03.27 |