logo

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}.
  • ENT: 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

nombre aleatori java

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 ATA. Els valors propis de ATA són 25, 9 i 0, i ja que ATA é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}

estructura de dades

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}

conversió int a cadena

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 VTassociat 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}

in.next java
  • 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