logo

Vienaskaitos reikšmės skaidymas (SVD)

Matricos vienaskaitos vertės skaidymas (SVD) yra tos matricos faktorius į tris matricas. Jis turi keletą įdomių algebrinių savybių ir perteikia svarbias geometrines ir teorines įžvalgas apie tiesines transformacijas. Jis taip pat turi keletą svarbių pritaikymų duomenų moksle. Šiame straipsnyje pabandysiu paaiškinti SVD matematinę intuiciją ir jos geometrinę reikšmę.

Matematika už SVD:

mxn matricos A SVD pateikiamas pagal formulę A = USigma V^T



kur:

  • IN: mxm ortonormalių savųjų vektorių matrica AA^{T}.
  • INT: perkelti a nxn matrica, kurioje yra ortonormalieji savieji vektoriai A^TA.
  • Sigma: įstrižainė matrica su r elementų, lygių AAᵀ arba Aᵀ A teigiamų savųjų reikšmių šaknims (abiejų matricų teigiamos savosios reikšmės vis tiek yra vienodos).

Pavyzdžiai

  • Raskite matricos A = SVD egin{bmatrix} 3&2 & 2  2& 3& -2 end{bmatrix}
  • Norėdami apskaičiuoti SVD, pirmiausia turime apskaičiuoti vienaskaitos reikšmes, surasdami AA^{T} savąsias reikšmes.

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 ir 8 8 ir 17 end{bmatrix}

  • Aukščiau pateiktos matricos charakteristikos lygtis yra tokia:

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

pavyzdys

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

= (lambda-25) (lambda -9)

taigi mūsų išskirtinės vertės yra: sigma_1 = 5 , ; sigma_2 = 3

  • Dabar randame tinkamus vienaskaitinius vektorius, ty ortonormalią A savųjų vektorių rinkinįTA. A savosios reikšmėsTA yra 25, 9 ir 0, o kadangi ATA yra simetriškas, žinome, kad savieji vektoriai bus stačiakampiai.

Dėl lambda =25,

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

kuris gali būti sumažintas iki:

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

Vieneto vektorius jo kryptimi yra:

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

Panašiai, kai lambda = 9, savasis vektorius yra:

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

Trečiajam savajam vektoriui galime naudoti savybę, kad jis yra statmenas v1 ir v2, kad:

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

Aukščiau pateiktos lygties sprendimas, kad būtų sukurtas trečiasis savasis vektorius

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}

Dabar apskaičiuojame U pagal formulę u_i = frac{1}{sigma} A v_i ir gauname U = egin{bmatrix} frac{1}{sqrt{2}} &frac{1}{sqrt{2}}  frac{1}{sqrt{2}}& frac{-1 }{sqrt{2}} end{bmatrix}. Taigi mūsų galutinė SVD lygtis tampa:

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}

Programos

  • Pseudoatvirkštinio apskaičiavimas: Pseudo atvirkštinė arba Moore-Penrose atvirkštinė yra matricos atvirkštinės apibendrinimas, kuris gali būti neinvertuojamas (pvz., žemo rango matricos). Jei matrica yra apverčiama, tada jos atvirkštinė vertė bus lygi pseudo atvirkštinei, tačiau egzistuoja pseudo atvirkštinė matrica, kuri nėra apverčiama. Ją žymi 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>

Aukščiau pateikta lygtis suteikia pseudo-atvirkštinę.

Homogeninės tiesinės lygties (Mx =b) aibės sprendimas: jei b = 0, apskaičiuokite SVD ir paimkite bet kurį V stulpelįTsusietas su vienaskaita reikšme (in IN ) lygus 0.

If , Multiply by>

Mes tai žinome iš pseudo-inversijos M^{-1} = V W^{-1} U^{T}

Vadinasi,

10 iš 50.00

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

  • Reitingas, diapazonas ir nulinė erdvė:
    • Matricos M rangą galima apskaičiuoti pagal SVD pagal nulinių vienaskaitos verčių skaičių.
    • Matricos M diapazonas yra U kairieji vienaskaitos vektoriai, atitinkantys nulines vienaskaitos reikšmes.
    • Matricos M nulinė erdvė yra V dešinieji vienaskaitos vektoriai, atitinkantys nulines vienaskaitos reikšmes.

M = U W V^{T}

  • Kreivės pritaikymo problema: Vienaskaitos vertės skaidymas gali būti naudojamas siekiant sumažinti mažiausią kvadratinę paklaidą. Jis apytiksliai naudoja pseudo atvirkštinę vertę.
  • Be pirmiau nurodytos programos, vienaskaitos vertės skaidymas ir pseudo-inversija taip pat gali būti naudojami skaitmeniniam signalų apdorojimui ir vaizdo apdorojimui.

Įgyvendinimas:

Šiame kode bandysime apskaičiuoti Singular reikšmės skaidymą naudodami Numpy ir Scipy. Mes apskaičiuosime SVD, taip pat atliksime pseudo-inversiją. Galų gale, norėdami suspausti vaizdą, galime pritaikyti 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()>
>
>

Išvestis:

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

Originalus vs SVD k-image