본문 바로가기
머신러닝, 딥러닝/머신러닝

특이값 분해 (Singular Value Decomposition)

by 장찐 2022. 6. 17.

📚 특이값 분해 (Singular Value Decomposition)


✅ 기본 개념 

 위의 고유분해를 사용하면 하나의 행렬을 서로 다른 3개의 행렬로 분해할 수 있다. 이 때 분해하는 행렬은 정사각 행렬이어야 한다. 

https://ko.wikipedia.org/wiki/%ED%8A%B9%EC%9E%87%EA%B0%92_%EB%B6%84%ED%95%B4

한편, 분해 대상 행렬이 정사각 행렬이 아니라 직사각 행렬일 경우에는 위와 같이 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

 

댓글