logo

Singular Value Decomposition (SVD)

Matricas Singular Value Decomposition (SVD) ir šīs matricas faktorizācija trīs matricās. Tam ir dažas interesantas algebriskas īpašības, un tas sniedz svarīgus ģeometriskus un teorētiskus ieskatus par lineārajām transformācijām. Tam ir arī daži svarīgi pielietojumi datu zinātnē. Šajā rakstā es mēģināšu izskaidrot SVD matemātisko intuīciju un tās ģeometrisko nozīmi.

Matemātika aiz SVD:

mxn matricas A SVD ir norādīts pēc formulas A = USigma V^T



kur:

apakšvirkne java
  • IN: mxm ortonormālo īpašvektoru matrica AA^{T}.
  • INT: transponēt a nxn matrica, kas satur ortonormālos īpašvektorus A^TA.
  • Sigma: diagonālā matrica ar r elementiem, kas vienādi ar AAᵀ vai Aᵀ A pozitīvo īpašvērtību sakni (abām matricām tik un tā ir vienādas pozitīvās īpašvērtības).

Piemēri

  • Atrodiet SVD matricai A = egin{bmatrix} 3&2 & 2  2& 3& -2 end{bmatrix}
  • Lai aprēķinātu SVD, vispirms ir jāaprēķina vienskaitļa vērtības, atrodot AA^{T} īpašvērtības.

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}

  • Iepriekš minētās matricas raksturīgais vienādojums ir:

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

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

= (lambda-25) (lambda-9)

tātad mūsu atsevišķās vērtības ir: sigma_1 = 5 , ; sigma_2 = 3

  • Tagad mēs atrodam pareizos vienskaitļa vektorus, t.i., ortonormālo A īpašvektoru kopuTA. A īpašvērtībasTA ir 25, 9 un 0, un tā kā ATA ir simetrisks, mēs zinām, ka īpašvektori būs ortogonāli.

Priekš lambda =25,

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

ls komandē linux

kuru rinda var samazināt līdz:

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

Vienības vektors tā virzienā ir:

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

Līdzīgi, ja lambda = 9, īpašvektors ir:

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

Trešajam īpašvektoram mēs varētu izmantot īpašību, ka tas ir perpendikulārs v1 un v2, lai:

java do while piemērs

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

Iepriekš minētā vienādojuma atrisināšana, lai ģenerētu trešo īpašvektoru

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}

Tagad mēs aprēķinām U, izmantojot formulu u_i = frac{1}{sigma} A v_i, un tas dod U = egin{bmatrix} frac{1}{sqrt{2}} &frac{1}{sqrt{2}}  frac{1}{sqrt{2}}& frac{-1 }{sqrt{2}} end{bmatrix}. Tādējādi mūsu galīgais SVD vienādojums kļūst:

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}

Lietojumprogrammas

  • Pseido-inversās vērtības aprēķins: Pseidoinversais vai Mūra-Penrouza apgrieztais ir matricas inverso vispārinājums, kas var nebūt invertējams (piemēram, zema ranga matricas). Ja matrica ir invertējama, tad tās inverss būs vienāds ar pseido inverso, bet pseido inverss pastāv matricai, kas nav invertējama. To apzīmē ar 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>

Iepriekš minētais vienādojums dod pseido-inverso.

Homogēna lineāra vienādojuma kopas atrisināšana (Mx =b): ja b = 0, aprēķiniet SVD un ņemiet jebkuru V kolonnuTsaistīta ar vienskaitļa vērtību (in IN ) vienāds ar 0.

If , Multiply by>

No pseido-inversā mēs to zinām M^{-1} = V W^{-1} U^{T}

Tāpēc

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

  • Rangs, diapazons un nulles atstarpe:
    • Matricas M rangu var aprēķināt no SVD pēc nulles vienskaitļa vērtību skaita.
    • Matricas M diapazons ir U kreisie vienskaitļa vektori, kas atbilst nulles vienalga vērtībām.
    • Matricas M nulles telpa ir V labie vienskaitļa vektori, kas atbilst nulles vienskaitļa vērtībām.

M = U W V^{T}

stīgu celtnieks
  • Līkņu pielāgošanas problēma: Lai samazinātu mazāko kvadrātu kļūdu, var izmantot vienskaitļa vērtību sadalīšanu. Tas izmanto pseido apgriezto, lai to tuvinātu.
  • Papildus iepriekš minētajam lietojumam ciparu signālu apstrādē un attēlu apstrādē var izmantot arī vienskaitļa vērtību sadalīšanu un pseido-inverso.

Īstenošana:

Šajā kodā mēs mēģināsim aprēķināt Singular vērtību sadalīšanos, izmantojot Numpy un Scipy. Mēs aprēķināsim SVD, kā arī veiksim pseido-inversu. Galu galā attēla saspiešanai varam izmantot SVD

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

Izvade:

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

Oriģināls pret SVD k-attēlu