logo

Razčlenitev singularne vrednosti (SVD)

Razčlenitev singularne vrednosti (SVD) matrike je faktorizacija te matrike na tri matrike. Ima nekaj zanimivih algebraičnih lastnosti in posreduje pomembna geometrijska in teoretična spoznanja o linearnih transformacijah. Ima tudi nekaj pomembnih aplikacij v podatkovni znanosti. V tem članku bom poskušal razložiti matematično intuicijo za SVD in njegov geometrijski pomen.

Matematika za SVD:

zemljevid java

SVD mxn matrike A je podana s formulo A = USigma V^T



kje:

  • IN: mxm matriko ortonormiranih lastnih vektorjev AA^{T}.
  • INT: prenos a nxn matriko, ki vsebuje ortonormirane lastne vektorje A^TA.
  • Sigma: diagonalna matrika z r elementi, ki so enaki korenu pozitivnih lastnih vrednosti AAᵀ ali Aᵀ A (obe matriki imata vseeno enake pozitivne lastne vrednosti).

Primeri

  • Poiščite SVD za matriko A = egin{bmatrix} 3&2 & 2  2& 3& -2 end{bmatrix}
  • Za izračun SVD moramo najprej izračunati singularne vrednosti z iskanjem lastnih vrednosti 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}

  • Značilna enačba za zgornjo matriko je:

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

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

= (lambda-25)(lambda -9)

torej so naše edinstvene vrednosti: sigma_1 = 5 , ; sigma_2 = 3

  • Zdaj najdemo prave singularne vektorje, tj. ortonormirano množico lastnih vektorjev ATA. Lastne vrednosti ATA so 25, 9 in 0, in ker je ATA je simetričen, vemo, da bodo lastni vektorji pravokotni.

Za lambda =25,

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

kako preveriti blokirane številke na androidu

ki se lahko vrstično zmanjša na:

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

Enotski vektor v njegovi smeri je:

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

Podobno je za lambda = 9 lastni vektor:

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

Za 3. lastni vektor bi lahko uporabili lastnost, da je pravokoten na v1 in v2, tako da:

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

Reševanje zgornje enačbe za ustvarjanje tretjega lastnega vektorja

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}

java ima naslednje

Zdaj izračunamo U z uporabo formule u_i = frac{1}{sigma} A v_i in to daje U = egin{bmatrix} frac{1}{sqrt{2}} &frac{1}{sqrt{2}}  frac{1}{sqrt{2}}& frac{-1 }{sqrt{2}} end{bmatrix}. Zato postane naša končna enačba 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}

Aplikacije

  • Izračun psevdoinverza: Psevdo inverz ali Moore-Penrose inverz je posplošitev matričnega inverza, ki morda ni invertibilen (kot so matrike nizkega ranga). Če je matrika obrnljiva, bo njen inverz enak psevdo inverzu, vendar psevdo inverz obstaja za matriko, ki ni inverzibilna. Označena je z 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>

Zgornja enačba daje psevdoinverzijo.

Reševanje niza homogene linearne enačbe (Mx =b): če je b=0, izračunajte SVD in vzemite kateri koli stolpec VTpovezana z enkratno vrednostjo (in IN ) enako 0.

If , Multiply by>

To vemo iz psevdoinverza M^{-1} = V W^{-1} U^{T}

torej

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

  • Razvrstitev, obseg in ničelni prostor:
    • Rang matrike M je mogoče izračunati iz SVD s številom neničelnih singularnih vrednosti.
    • Obseg matrike M je Levi singularni vektorji U, ki ustrezajo singularnim vrednostim, ki niso nič.
    • Ničelni prostor matrike M so desni singularni vektorji V, ki ustrezajo ničelnim singularnim vrednostim.

M = U W V^{T}

izdelava lupinskega skripta izvršljivega
  • Težava s prilagajanjem krivulje: Razčlenitev singularne vrednosti je mogoče uporabiti za zmanjšanje napake najmanjšega kvadrata. Za približek uporablja psevdo inverz.
  • Poleg zgornje aplikacije se lahko v digitalni obdelavi signalov in obdelavi slik uporabljata tudi dekompozicija singularne vrednosti in psevdo-inverz.

Izvedba:

V tej kodi bomo poskušali izračunati razgradnjo singularne vrednosti z uporabo Numpy in Scipy. Izračunali bomo SVD in izvedli tudi psevdoinverzijo. Na koncu lahko uporabimo SVD za stiskanje slike

Python3

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

Izhod:

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

Izvirna v primerjavi s k-sliko SVD