📚 특이값 분해 (Singular Value Decomposition)
✅ 기본 개념
위의 고유분해를 사용하면 하나의 행렬을 서로 다른 3개의 행렬로 분해할 수 있다. 이 때 분해하는 행렬은 정사각 행렬이어야 한다.
한편, 분해 대상 행렬이 정사각 행렬이 아니라 직사각 행렬일 경우에는 위와 같이 SVD를 사용할 수 있다. 각 기호에 대한 설명은 아래와 같다.
X : 정사각행렬이 아닌 m x n 형태의 행렬
U : XXT 행렬의 고유벡터를 열로 갖는 행렬
V : XTX 행렬의 고유벡터를 열로 갖는 행렬
D : 대각원소가 XTX 또는 XXT의 eigen values(λi)에 루트를 씌운 값(√λi )인 대각 행렬. 이 값을 X에 대한 singular value라고 한다.
📌예시
X 가 3x2 형태의 행렬일 때, XT는 2x3 형태이고 X*XT는 3x3 형태가 된다. 따라서 X*XT는 정사각 행렬이라서 고유값과 고유 벡터를 구할 수 있다. 3*3 형태이기 때문에 고유값 3개를 구할 수 있다.
XT*X 는 2x2 형태가 되고 마찬가지로 정사각 행렬이라서 고유값 2개를 구할 수 있다.
D는 대각원소가 XTX(V)또는 XXT(U)의고유값의 루트를 씌운 값인 대각 행렬이다. 전자(V)는 2x2 형태이고 후자(U)는 3x3 형태이다. XXT의 고유값 3개 중에서 두개의 고유값은 XTX 의 고유값 2개와 중복되고, 나머지 하나는 0이 되기 때문에 사용하지 않는다. 따라서 결과적으로 XTX(V)의 고유값 2개를 이용해서 D 행렬을 만든다.
* 참고 : 고유값이 0인 경우에는 해당 고유값과 고유벡터를 사용하지 않는다.
✅ 예제 코드
python 에서 np.linalg.svd()를 사용하면 SVD를 쉽게 할 수 있다.
full_matrices의 파라미터는 기본적으로 True이고 U와 VT가 정사각 행렬 형태인 경우이다.
import numpy as np
np.set_printoptions(suppress=True)
A = np.array([[7, 2],
[3, 4],
[5, 3]])
#full_matrix=False 인 경우
U, D, V_T = np.linalg.svd(A, full_matrices=False)
#full_matrix=True 인 경우
U2, D2, V_T2 = np.linalg.svd(A, full_matrices=True)
full_matrices=False인 경우 U가 간소화된 형태로 출력됨.
D는 0인 부분을 제외하고 대각성분만 출력된다.
📚 Reference
https://ko.wikipedia.org/wiki/%ED%8A%B9%EC%9E%87%EA%B0%92_%EB%B6%84%ED%95%B4
'머신러닝, 딥러닝 > 머신러닝' 카테고리의 다른 글
GMM (Gaussian Mixture Models) (0) | 2022.06.18 |
---|---|
서포트 벡터 머신 (Support Vector Machine) (0) | 2022.06.18 |
차원축소 - PCA(Principal Component Analysis) (0) | 2022.05.30 |
차원축소 기본 - 고유값, 고유벡터, 고유분해 (0) | 2022.05.29 |
앙상블 기법(Ensemble Method) - Boosting (0) | 2022.05.28 |
댓글