Math & Linear Algebra/Concepts

SVD(Singular Value Decomposition)

metamong 2023. 2. 20.

 

๐Ÿฉด ์ €๋ฒˆ ์„ ํ˜•๋Œ€์ˆ˜ํ•™ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ณ ์œ ๋ฒกํ„ฐ ๋ถ„ํ•ด eigendecomposition์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค.

 

eigendecomposition

๐Ÿคพ๐Ÿฝ‍โ™‚๏ธ ์ €๋ฒˆ ์‹œ๊ฐ„์— eigenvalue์™€ eigenvector์— ๋Œ€ํ•ด ํ•™์Šตํ–ˆ๋‹ค. eigenvalue & eigenvector * intro ๐Ÿ”… ์œ„์—์„œ ๋ฐฐ์šด transform ์—ฐ์‚ฐ์—์„œ transformation์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ๋ถ€๋ถ„, ์ฆ‰ transform์„ ํ•ด๋„ ๋ฐฉํ–ฅ์ด ๋ณ€ํ•˜์ง€

sh-avid-learner.tistory.com

 

๐Ÿฉด ์ด๋ฒˆ์—๋Š” ์œ ์‚ฌํ•œ ๋ถ„ํ•ด 'ํŠน์ž‡๊ฐ’ ๋ถ„ํ•ด(Singular Values Decomposition)'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค ํ•œ๋‹ค.

SVD ์ •์˜

"๋ชจ๋“  mxn matrix๋Š” $A = U \Sigma V^T$ ํ˜•ํƒœ๋กœ ๋ถ„ํ•ด๋œ๋‹ค."

 

โ€ป eigendecomposition์€ nxn matrix์—์„œ๋งŒ ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ, singular value decomposition์€ ๋ชจ๋“  mxn matrix์— ๋Œ€ํ•ด ๋ถ„ํ•ด ๊ฐ€๋Šฅ

 

โ‘  $U$๋Š” mxm orthogonal matrix

โ‘ก $\Sigma$๋Š” mxn diagonal matrix (non-negative $\lambda$์˜ decreasing order๋กœ ๊ตฌ์„ฑ)

โ‘ข $V^T$๋„ nxn orthogonal matrix 

→ $U$ - $\Sigma$ - $V^T$, ์ฆ‰ rotate - stretch - rotate ์ˆœ

 

$U$๋Š” $AA^T$ ํ–‰๋ ฌ์˜ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์—ด๋กœ ๊ฐ–๋Š” ํ–‰๋ ฌ (left singular vectors)

$V$๋Š” $A^TA$ ํ–‰๋ ฌ์˜ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์—ด๋กœ ๊ฐ–๋Š” ํ–‰๋ ฌ (right singular vectors)

$\Sigma$๋Š” ๋Œ€๊ฐํ–‰๋ ฌ๋กœ, ๋Œ€๊ฐ์›์†Œ($\sigma$)๋Š” $A^TA$(๋˜๋Š”$AA^T$)์˜ eigenvalues($\lambda_i$)์— root๋ฅผ ์”Œ์šด ๊ฐ’ ($\sqrt{\lambda_i}$) (A์˜ singular values)


์ž์„ธํžˆ ํ’€๋ฉด..

$$A = \begin{bmatrix}
u_1 & u_2 \\
\end{bmatrix}\begin{bmatrix}
\sigma_1 & 0 \\
0 & \sigma_2 \\
\end{bmatrix}\begin{bmatrix}
v_1^T \\ v_2^T
\end{bmatrix}$$

์ •์˜๊ฐ€ ๋‚˜์˜จ ์ด์œ ๋ฅผ ์ง์ ‘ ๊ณ„์‚ฐํ•ด ๋ณด๋ฉด..

$$A = U \Sigma V^T$$


โ‘  $A^TA$์— ๊ด€ํ•ด ๊ณ„์‚ฐํ•˜๋ฉด..

$$A^TA = (V\Sigma^TU^T)U\Sigma V^T = V\Sigma^T \Sigma V^T$$

(U๋Š” orthogonal matrix์ด๋ฏ€๋กœ $U^TU$๋Š” identity matrix๊ฐ€ ๋œ๋‹ค)

 

 ์‹์„ ์ž์„ธํžˆ ๋ณด๋ฉด, $A^TA$์˜ eigendecomposition ์‹์ž„์„ ์บ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

$A^TA$๋Š” symmetricํ•œ square matrix

V๋Š” orthogonal matrix(eigenvector์˜ ๋ชจ์ž„)

$\Sigma^T \Sigma$๋Š” $A^TA$์˜ $\lambda$์ด์ž $A$์˜ $\sigma^2$

 

โ‘ก ์ด์ œ $AA^T$์— ๊ด€ํ•ด ๊ณ„์‚ฐํ•˜๋ฉด..

$$AA^T = U\Sigma V^T V \Sigma^T U^T = U\Sigma \Sigma^T U^T$$

 

→ ์—ญ์‹œ $AA^T$์˜ eigendecomposition ์‹

→ ๋”ฐ๋ผ์„œ, $AA^T$์™€ $A^TA$์˜ eigenvalue๊ฐ€ ์„œ๋กœ ๋™์ผ

SVD examples & real-world application

* examples

$$A = \begin{bmatrix}
2 &  2\\
1 &  1\\
\end{bmatrix} = \frac{1}{\sqrt{5}}\begin{bmatrix}
2 & 1\\
-1 & 2\\
\end{bmatrix}\begin{bmatrix}
\sqrt{10} & 0 \\
0 &  0\\
\end{bmatrix}\frac{1}{\sqrt{2}}\begin{bmatrix}
1 & 1 \\
1 & -1 \\
\end{bmatrix}$$

 

→ A๋Š” det(A)=0์ธ singular matrix๋กœ, singular values๋Š” $\sqrt{10}$๊ณผ 0์ด ์žˆ๋‹ค

* applications

→ ์‹ค์ œ์—์„œ๋Š” A์˜ SVD ๋ถ„ํ•ด ๊ฒฐ๊ณผ ๊ฐ€์žฅ ๋งŽ์€ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” $u_1 \sigma_1 v_1^T$๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ($\Sigma$์˜ $\lambda$๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ตฌ์„ฑ), ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์— ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. ์‹์œผ๋กœ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

 

→ ๊ฐ๊ฐ์˜ ์—ฌ๋Ÿฌ vector์™€ $\lambda$๋กœ ์ž์„ธํžˆ ๋‚˜ํƒ€๋‚ด๋ฉด

$$X = \begin{bmatrix}
x_1 & x_2 & x_3 & ... & x_n \\
\end{bmatrix}=U \Sigma V^T$$ 

$$= \begin{bmatrix}
u_1 & u_2 & u_3 & ... & u_n \\
\end{bmatrix}\begin{bmatrix}
\sigma_1 &  &  &  \\
 & \sigma_2 &  &  \\
 &  & \sigma_3 &  \\
 &  &  & \sigma_m \\
0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 \\
\end{bmatrix}\begin{bmatrix}
v_1 & v_2 & v_3 & ... & v_m \\
\end{bmatrix}^T$$

$$= \begin{bmatrix}
u_1 & u_2 & u_3 & ... & u_n \\
\end{bmatrix}\begin{bmatrix}
\sigma_1 &  &  &  \\
 & \sigma_2 &  &  \\
 &  & \sigma_3 &  \\
 &  &  & \sigma_m \\
0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 \\
\end{bmatrix}\begin{bmatrix}
v_1^T \\
v_2^t \\
... \\
v_m^T \\
\end{bmatrix}$$

 

โ‘  $U$์—์„œ์˜ ์—ฌ๋Ÿฌ $u_1, u_2, ... u_n$์€ ๊ฐ๊ฐ $x_1, x_2, ... x_n$ ๊ฐœ์ฒด์˜ eigen ๊ณ ์œ  ํŠน์„ฑ์„ hierarchically organizedํ•œ ๋ชจ์Œ

โ‘ก $\Sigma$์—์„œ์˜ ์—ฌ๋Ÿฌ $\lambda$๊ฐ’์€ ๊ฐ ๊ฐœ์ฒด์˜ ์ „์ฒด X๋ฅผ ๊ธฐ์—ฌํ•˜๋Š”๋ฐ์˜ ๊ฐ๊ฐ์˜ ๊ธฐ์—ฌ๋„๋ฅผ decreasing order - ์ฆ‰ ์ค‘์š”๋„ ์ˆœ์„œ๋กœ ๋‚˜์—ด

โ‘ข $V$์—์„œ์˜ ์—ฌ๋Ÿฌ $v_1, v_2, ... v_n$์€ ์˜ˆ๋ฅผ ๋“ค์–ด $v_1$์˜ ๊ฒฝ์šฐ $x_1$์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ชจ๋“  $u_1, u_2, ... u_n$ eigen mixture

 

→ ์ฆ‰ ๊ฐ๊ฐ ์ค‘์š”๋„ ์ˆœ์„œ๋Œ€๋กœ ํ•ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ถ„ํ•ดํ•˜๋ฉด

$$= \sigma_1u_1v_1^T + \sigma_2u_2v_2^T + ... + \sigma_mu_mv_m^T + 0$$

 

→ ์—ฌ๊ธฐ์„œ $x_1 .. x_m$ ์ด m๊ฐœ๋งŒ ์กด์žฌํ•˜๋ฏ€๋กœ n>m์ด๋ผ๋ฉด ๋‚˜๋จธ์ง€ ์š”์†Œ๋Š” ๋ชจ๋‘ 0

→ ๋”ฐ๋ผ์„œ ์ „์ฒด n๊ฐœ๋ฅผ ๊ณ ๋ฅผ ํ•„์š” ์—†๊ณ , ์ค‘์š” ์ •๋ณด m๊ฐœ๋งŒ ์„ ํƒ.

→ ์ด๋ณด๋‹ค๋„ ๋” ์ ์€ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋งŒ ๊ณจ๋ผ ์ค‘์š” ์ •๋ณด๋งŒ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋‹ค. (์ถ”ํ›„ PCA ํฌ์ŠคํŒ… ์ฐธ์กฐ)

python

๐Ÿฉดnp.linalg.svd() ์‚ฌ์šฉ

→ 3x2 X์˜ SVD 3x3์˜ U์™€ 2๊ฐœ์˜ singular values, ๊ทธ๋ฆฌ๊ณ  2x2์˜ $V^T$

→ ๊ฒฐ๊ณผ์ ์œผ๋กœ $\sigma_1u_1v_1^T + \sigma_2u_2v_2^T$๋กœ ๋ถ„ํ•ด

import numpy as np
np.set_printoptions(suppress=True)

X = np.array([[7, 2],
             [3, 4],
             [5, 3]])

U,sing_values,VT=np.linalg.svd(X)

U
'''
array([[-0.69366543,  0.59343205, -0.40824829],
       [-0.4427092 , -0.79833696, -0.40824829],
       [-0.56818732, -0.10245245,  0.81649658]])
'''

sing_values #array([10.25142677,  2.62835484])

VT
'''
array([[-0.88033817, -0.47434662],
       [ 0.47434662, -0.88033817]])
'''

 

๐Ÿฉด์‹ค์ œ๋กœ $XX^T$์˜ eigendecomposition์—์„œ $XX^T$์˜ eigenvector matrix๊ฐ€ U์ž„์„ ํ™•์ธํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  fill_diagonal()์„ ์‚ฌ์šฉํ•ด ์˜ํ–‰๋ ฌ์— singular values๋ฅผ ๋„ฃ์œผ๋ฉด ์›๋ž˜ ์‹๋Œ€๋กœ $U\Sigma V^T$์˜ ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‚˜์˜ด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

np.linalg.eig(np.dot(X,X.T))[1]
'''
array([[-0.69366543, -0.59343205, -0.40824829],
       [-0.4427092 ,  0.79833696, -0.40824829],
       [-0.56818732,  0.10245245,  0.81649658]])
'''

U
'''
array([[-0.69366543,  0.59343205, -0.40824829],
       [-0.4427092 , -0.79833696, -0.40824829],
       [-0.56818732, -0.10245245,  0.81649658]])
'''

D = np.zeros((3, 2))
np.fill_diagonal(D, sing_values)

D
'''
array([[10.25142677,  0.        ],
       [ 0.        ,  2.62835484],
       [ 0.        ,  0.        ]])
'''

np.dot(np.dot(U,D),VT)
'''
array([[7., 2.],
       [3., 4.],
       [5., 3.]])
'''

 

๐Ÿฉด์ถ•์†Œํ˜• - ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ 3x3์˜ U์—์„œ 3x2์˜ X๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœํžˆ 3x2์˜ U์˜ ์ •๋ณด๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

($\Sigma$์˜ ๋งจ ๋งˆ์ง€๋ง‰ ํ–‰์ด ๋ชจ๋‘ 0์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฏ€๋กœ). numpy svd()์˜ ์ธ์ž full_matrices๋ฅผ False๋กœ ์„ค์ •ํ•˜๋ฉด U์˜ ์ฐจ์›์ด ์ถ•์†Œ๋˜๊ณ , ์ถ•์†Œ๋œ U๋ฅผ ๊ธฐ์กด์˜ singular_values, $V^T$์™€ ๊ณฑํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๊ฒŒ ๋‚˜์˜ด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

U1,sing_values1,VT1=np.linalg.svd(X, full_matrices=False)

U1 #U 3x3
'''
array([[-0.69366543,  0.59343205],
       [-0.4427092 , -0.79833696],
       [-0.56818732, -0.10245245]])
'''

sing_values1 #array([10.25142677,  2.62835484])

VT1
'''
array([[-0.88033817, -0.47434662],
       [ 0.47434662, -0.88033817]])
'''

D1 = np.zeros((2, 2))
np.fill_diagonal(D1, sing_values1)

np.dot(np.dot(U1,D1),VT1)

'''
array([[7., 2.],
       [3., 4.],
       [5., 3.]])
'''

* ์ถœ์ฒ˜1) SVD by Gilbert Strang (MIT) https://youtu.be/mBcLRGuAFUk

* ์ถœ์ฒ˜2) SVD (mathematical overview) by Steve Brunton https://youtu.be/nbBvuuNVfco

 

 

'Math & Linear Algebra > Concepts' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Probability fundamentals  (0) 2023.02.27
eigendecomposition  (0) 2023.02.19
vector similarity  (0) 2023.02.09
Linear Equation & Linear System / Rank & det(A)  (0) 2023.02.01
Matrix (fundamentals)  (0) 2022.07.31

๋Œ“๊ธ€