[선형대수] 특이값 분해
Date:
특이값 분해
- 정방행렬은 고유분해로 고윳값과 고유벡터를 찾을 수 있음
- 하지만 정방행렬이 아닌 행렬은 고유분해가 불가능하여, 이를 대체한 분해 방법임
특이값과 특이벡터
-
NxM 크기의 행렬$A$를 다음과 같은 3개의 행렬의 곱으로 나타내는 것이 특이분해(singular decomposition) 또는 특이값 분해(singular value decomposition)
$A = U\Sigma V^T$
- $\Sigma \in \mathbf{R}^{N \times M}$ : 대각성분이 양수인 대각행렬, 큰 수부터 작은 수 순서로 배열
- $U \in \mathbf{R}^{N \times N}$ : $U$는 N차원 정방행렬로 모든 열벡터가 단위벡터이고, 서로 직교해야함
- $V \in \mathbf{R}^{M \times M}$ : $V$는 M차원 정방행렬로 모든 열벡터가 단위벡터이고, 서로 직교해야함
위 조건을 만족하는 행렬 $\Sigma$의 대각성분들을 특이값(Singular Value), 행렬 $U$의 열벡터을 왼쪽 특이벡터(Left Singular Vector), 행렬$V$의 행벡터들을 오른쪽 특이벡터(Right Singular Vector)
특이분해는 모든 행렬에 대해 가능하다. 즉 어떤 행렬이 주어지더라도 위와 같이 특이분해 할 수 있다.
특이값 분해 행렬의 크기
- 특이값의 수는 행렬의 열과 행의 개수 중 작은 값과 같음
특이값 분해 축소형
- 특이값 대각행렬에서 0인부분은 사실상 아무런 의미가 없기 때문에, 0 원소 부분과 이에 대응하는 벡터들을 없애고 다음처럼 축소된 형태로 만들어도 마찬가지 행렬이 나옴
파이썬을 활용한 특이분해
SVD
📰code
import numpy as np
from numpy.linalg import svd
A = np.array([[3,-1],
[1,3],
[1,1]])
U,S,VT =svd(A)
U @ np.diag(S, 1)[:,1:] @ VT
🔍result
array([[ 3., -1.],
[ 1., 3.],
[ 1., 1.]])
축소형 SVD
import numpy as np
from numpy.linalg import svd
A = np.array([[3,-1],
[1,3],
[1,1]])
U,S,VT =svd(A, full_matrices=False)
U @ np.diag(S) @ VT
🔍result
array([[ 3., -1.],
[ 1., 3.],
[ 1., 1.]])
📌reference
💡 수정 필요한 내용은 댓글이나 메일로 알려주시면 감사하겠습니다!💡
댓글