Descomposició de valors singulars (SVD)

Descomposició de valors singulars (SVD)

La descomposició de valors singulars (SVD) d'una matriu és una factorització d'aquesta matriu en tres matrius. Té algunes propietats algebraiques interessants i transmet importants coneixements geomètrics i teòrics sobre transformacions lineals. També té algunes aplicacions importants en ciència de dades. En aquest article, intentaré explicar la intuïció matemàtica darrere de SVD i el seu significat geomètric.

Matemàtiques darrere de SVD:

La SVD de la matriu mxn A ve donada per la fórmula A = USigma V^T

on:

  • EN: mxm matriu dels vectors propis ortonormals de AA^{T} .
  • EN T : transposició d'a nxn matriu que conté els vectors propis ortonormals de A^TA .
  • Sigma : matriu diagonal amb r elements iguals a l'arrel dels valors propis positius de AAᵀ o Aᵀ A (ambdues matrius tenen els mateixos valors propis positius de totes maneres).

Exemples

  • Trobeu l'SVD per a la matriu A = egin{bmatrix} 3&2 i 2  2& 3& -2 end{bmatrix}
  • Per calcular l'SVD, primer, hem de calcular els valors singulars trobant valors propis de 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 i 8 8 i 17 end{bmatrix}

  • L'equació característica de la matriu anterior és:

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

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

= (lambda-25)(lambda -9)

per tant, els nostres valors singulars són: sigma_1 = 5 , ; sigma_2 = 3

  • Ara trobem els vectors singulars correctes, és a dir, el conjunt ortonormal de vectors propis de A T A. Els valors propis de A T A són 25, 9 i 0, i ja que A T A és simètric, sabem que els vectors propis seran ortogonals.

Per lambda =25,

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

que es pot reduir a fila a:

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

Un vector unitari en la seva direcció és:

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

De la mateixa manera, per a lambda = 9, el vector propi és:

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

Per al tercer vector propi, podríem utilitzar la propietat que és perpendicular a v1 i v2 de manera que:

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

Resoldre l'equació anterior per generar el tercer vector propi

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}

Ara, calculem U mitjançant la fórmula u_i = frac{1}{sigma} A v_i i això dóna U = egin{bmatrix} frac{1}{sqrt{2}} &frac{1}{sqrt{2}}  frac{1}{sqrt{2}} i frac{-1 }{sqrt{2}} end{bmatrix} . Per tant, la nostra equació SVD final esdevé:

A = egin{bmatrix} frac{1}{sqrt{2}} ifrac{1}{sqrt{2}}  frac{1}{sqrt{2}} i 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}} i frac{4} {sqrt{18}} frac{2}{3}&frac{-2}{3} ifrac{1}{3} end{bmatrix}

Aplicacions

  • Càlcul de Pseudo-invers: Pseudo inversa o inversa de Moore-Penrose és la generalització de la matriu inversa que pot no ser inversible (com les matrius de rang baix). Si la matriu és invertible, la seva inversa serà igual a Pseudo inversa, però existeix una pseudo inversa per a la matriu que no és invertible. Es denota per 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 

L'equació anterior dóna la pseudo-inversa.

Resolució d'un conjunt d'equacions lineals homogènies (Mx =b): si b=0, calculeu SVD i preneu qualsevol columna de V T associat a un valor singular (en EN ) igual a 0.

If , Multiply by 

Del pseudo-invers, ho sabem M^{-1} = V W^{-1} U^{T}

Per tant,

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

  • Classificació, rang i espai nul:
    • El rang de la matriu M es pot calcular a partir de SVD pel nombre de valors singulars diferents de zero.
    • El rang de la matriu M és Els vectors singulars esquerre de U corresponents als valors singulars diferents de zero.
    • L'espai nul de la matriu M és Els vectors singulars dret de V corresponents als valors singulars zero.

M = U W V^{T}

  • Problema d'ajustament a la corba: La descomposició de valors singulars es pot utilitzar per minimitzar l'error de mínims quadrats. Utilitza el pseudo-invers per aproximar-lo.
  • A més de l'aplicació anterior, la descomposició de valors singulars i la pseudo-inversa també es poden utilitzar en el processament de senyals digitals i el processament d'imatges

Implementació:

En aquest codi, intentarem calcular la descomposició de valors singulars mitjançant Numpy i Scipy. Calcularem SVD, i també realitzarem pseudo-invers. Al final, podem aplicar SVD per comprimir la imatge

Python 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()>

Sortida:

[[ 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]]) --------------------------- 

Imatge k original vs SVD