특이값 분해(SVD)

특이값 분해(SVD)

행렬의 SVD(특이값 분해)는 해당 행렬을 세 개의 행렬로 인수분해한 것입니다. 이는 몇 가지 흥미로운 대수적 특성을 갖고 있으며 선형 변환에 대한 중요한 기하학적, 이론적 통찰력을 전달합니다. 또한 데이터 과학에도 몇 가지 중요한 응용 프로그램이 있습니다. 이 글에서는 SVD의 수학적 직관과 그 기하학적 의미를 설명하려고 합니다.

SVD 뒤에 숨은 수학:

mxn 행렬 A의 SVD는 다음 공식으로 표현됩니다. A = U시그마 V^T

어디:

  • 안에: mxm 정규직교 고유벡터의 행렬 AA^{T} .
  • 안에 : a의 전치 nxn 정규직교 고유벡터를 포함하는 행렬 A^TA .
  • 시그마 : AAᵀ 또는 Aᵀ A의 양의 고유값의 근과 동일한 r 요소를 갖는 대각 행렬(두 행렬 모두 어쨌든 동일한 양의 고유값을 가짐)

  • 행렬 A =에 대한 SVD를 구합니다. egin{bmatrix} 3&2 & 2  2& 3& -2 end{bmatrix}
  • SVD를 계산하려면 먼저 AA^{T}의 고유값을 찾아 특이값을 계산해야 합니다.

A cdot A^{T} =egin{bmatrix} 3& 2 & 2  2& 3& -2 end{bmatrix} cdot egin{bmatrix} 3 & 2  2 & 3  2 & -2 end{bmatrix} = egin{bmatrix} 17 & 8 8 & 17 end{bmatrix}

  • 위 행렬의 특성 방정식은 다음과 같습니다.

W - lambda I =0  A A^{T} - lambda I =0

lambda^{2} - 34 lambda + 225 =0

= (람다-25)(람다 -9)

그래서 우리의 특이값은 다음과 같습니다: sigma_1 = 5 , ; sigma_2 = 3

  • 이제 우리는 올바른 특이 벡터, 즉 A의 고유 벡터의 정규 직교 집합을 찾습니다. A. A의 고유값 A는 25, 9, 0이고 A 이후 A는 대칭입니다. 우리는 고유벡터가 직교할 것이라는 것을 알고 있습니다.

을 위한 람다 =25,

A^{T}A - 25 cdot I = egin{bmatrix} -12 & 12& 2 12 & -12 & -2 2& -2 & -17 end{bmatrix}

이는 다음과 같이 행 축소될 수 있습니다.

egin{bmatrix} 1& -1& 0  0& 0& 1 0& 0& 0 end{bmatrix}

해당 방향의 단위 벡터는 다음과 같습니다.

v_1 = egin{bmatrix} frac{1}{sqrt{2}} frac{1}{sqrt{2}} 0 end{bmatrix}

마찬가지로 lambda = 9인 경우 고유벡터는 다음과 같습니다.

v_2 =egin{bmatrix} frac{1}{sqrt{18}} frac{-1}{sqrt{18}} frac{4}{sqrt{18}} end{bmatrix}

세 번째 고유벡터의 경우 v1 및 v2에 수직이라는 속성을 사용할 수 있습니다.

v_1^{T} v_3 =0  v_2^{T} v_3 =0

위 방정식을 풀어 세 번째 고유벡터를 생성합니다.

v_3 = egin{bmatrix} a b c end{bmatrix} = egin{bmatrix} a -a  -a/2 end{bmatrix} = egin{bmatrix} frac{ 2}{3} frac{-2}{3} frac{-1}{3} end{bmatrix}

이제 u_i = frac{1}{sigma} A v_i 공식을 사용하여 U를 계산하면 U = egin{bmatrix} frac{1}{sqrt{2}} &frac{1}{sqrt{2}}  frac{1}{sqrt{2}}& frac{-1 }{sqrt{2}} end{bmatrix} . 따라서 최종 SVD 방정식은 다음과 같습니다.

A = egin{bmatrix} frac{1}{sqrt{2}} &frac{1}{sqrt{2}}  frac{1}{sqrt{2}}& frac{ -1}{sqrt{2}} end{bmatrix} egin{bmatrix} 5 & 0& 0  0 & 3& 0 end{bmatrix} egin{bmatrix} frac{1}{sqrt{2 }}& frac{1}{sqrt{2}} &0  frac{1}{sqrt{18}}& frac{-1}{sqrt{18}} & frac{4} {sqrt{18}} frac{2}{3}&frac{-2}{3} &frac{1}{3} end{bmatrix}

응용

  • 의사 역의 계산: 유사 역행렬 또는 무어-펜로즈 역행렬은 역행렬이 불가능할 수 있는 역행렬(예: 낮은 순위 행렬)을 일반화한 것입니다. 행렬이 가역적이면 역행렬은 유사 역행렬과 동일하지만 역행렬이 아닌 행렬에는 유사 역행렬이 존재합니다. A로 표시됩니다. + .
Suppose, we need to calculate the pseudo-inverse of a matrix M: Then, the SVD of M can be given as: Multiply both sides by M^{-1}.Multiply both side by V:Multiply by W^{-1}Since the W is the singular matrix, the inverse of W  is Multiply by 

위의 방정식은 유사 역수를 제공합니다.

동차 선형 방정식 세트 풀기(Mx =b): b=0이면 SVD를 계산하고 V의 열을 취합니다. 특이값과 연관됨( 안에 )는 0과 같습니다.

If , Multiply by 

유사 역수로부터 우리는 다음을 압니다. M^{-1} = V W^{-1} U^{T}

따라서,

x = V W^{-1} U^{T} b

  • 순위, 범위 및 Null 공간:
    • 행렬 M의 순위는 SVD에서 0이 아닌 특이값의 개수로 계산할 수 있습니다.
    • 행렬 M의 범위는 0이 아닌 특이값에 해당하는 U의 왼쪽 특이 벡터입니다.
    • 행렬 M의 영공간은 0으로 지정된 특이값에 해당하는 V의 오른쪽 특이 벡터입니다.

M = U W V^{T}

  • 곡선 피팅 문제: 최소 제곱 오차를 최소화하기 위해 특이값 분해를 사용할 수 있습니다. 이를 근사화하기 위해 유사 역원을 사용합니다.
  • 위의 응용 외에도 특이값 분해 및 의사 역수를 디지털 신호 처리 및 이미지 처리에 사용할 수 있습니다.

구현:

이 코드에서는 Numpy와 Scipy를 사용하여 특이값 분해를 계산해 보겠습니다. 우리는 SVD를 계산하고 pseudo-inverse도 수행할 것입니다. 결국 이미지 압축을 위해 SVD를 적용할 수 있습니다.

파이썬3

# Imports> from> skimage.color> import> rgb2gray> from> skimage> import> data> import> matplotlib.pyplot as plt> import> numpy as np> from> scipy.linalg> import> svd> '''> Singular Value Decomposition> '''> # define a matrix> X> => np.array([[> 3> ,> 3> ,> 2> ], [> 2> ,> 3> ,> -> 2> ]])> print> (X)> # perform SVD> U, singular, V_transpose> => svd(X)> # print different components> print> (> 'U: '> , U)> print> (> 'Singular array'> , singular)> print> (> 'V^{T}'> , V_transpose)> '''> Calculate Pseudo inverse> '''> # inverse of singular matrix is just the reciprocal of each element> singular_inv> => 1.0> /> singular> # create m x n matrix of zeroes and put singular values in it> s_inv> => np.zeros(X.shape)> s_inv[> 0> ][> 0> ]> => singular_inv[> 0> ]> s_inv[> 1> ][> 1> ]> => singular_inv[> 1> ]> # calculate pseudoinverse> M> => np.dot(np.dot(V_transpose.T, s_inv.T), U.T)> print> (M)> '''> SVD on image compression> '''> cat> => data.chelsea()> plt.imshow(cat)> # convert to grayscale> gray_cat> => rgb2gray(cat)> # calculate the SVD and plot the image> U, S, V_T> => svd(gray_cat, full_matrices> => False> )> S> => np.diag(S)> fig, ax> => plt.subplots(> 5> ,> 2> , figsize> => (> 8> ,> 20> ))> curr_fig> => 0> for> r> in> [> 5> ,> 10> ,> 70> ,> 100> ,> 200> ]:> > cat_approx> => U[:, :r] @ S[> 0> :r, :r] @ V_T[:r, :]> > ax[curr_fig][> 0> ].imshow(cat_approx, cmap> => 'gray'> )> > ax[curr_fig][> 0> ].set_title(> 'k = '> +> str> (r))> > ax[curr_fig,> 0> ].axis(> 'off'> )> > ax[curr_fig][> 1> ].set_title(> 'Original Image'> )> > ax[curr_fig][> 1> ].imshow(gray_cat, cmap> => 'gray'> )> > ax[curr_fig,> 1> ].axis(> 'off'> )> > curr_fig> +> => 1> plt.show()>

산출:

[[ 3 3 2]  [ 2 3 -2]] --------------------------- U: [[-0.7815437 -0.6238505]  [-0.6238505 0.7815437]] --------------------------- Singular array [5.54801894 2.86696457] --------------------------- V^{T} [[-0.64749817 -0.7599438 -0.05684667]  [-0.10759258 0.16501062 -0.9804057 ]  [-0.75443354 0.62869461 0.18860838]] -------------------------- # Inverse  array([[ 0.11462451, 0.04347826],  [ 0.07114625, 0.13043478],  [ 0.22134387, -0.26086957]]) --------------------------- 

원본 대 SVD k-이미지