Faza 01 · lecția 11
Descompunerea în valori singulare
Scopul lecției: SVD este briceagul elvețian al algebrei liniare. Orice matrice are o asemenea descompunere. Orice specialist în știința datelor are nevoie de ea.
Versiunea curentă AlexBred.com: primele 100 de lecții ale programului în limba română.
Cuprinsul lecției
- Obiective de învățare
- Problema
- Conceptul
- Interpretarea geometrică a SVD
- Descompunerea completă
- Vectori singulari stângi, valori singulare și vectori singulari drepți
- Forma bazată pe produse exterioare
- Relația cu descompunerea în valori proprii
- SVD trunchiată: aproximarea de rang redus
- Compresia imaginilor cu SVD
- SVD pentru sisteme de recomandare
- SVD în NLP: analiza semantică latentă
- SVD pentru reducerea zgomotului
- Pseudoinversa prin SVD
- Avantajele privind stabilitatea numerică
- Legătura cu PCA
- Construirea implementării
- Pasul 1: SVD de la zero folosind metoda puterii
- Pasul 2: testarea și compararea cu NumPy
- Pasul 3: demonstrație de compresie a unei imagini
- Pasul 4: reducerea zgomotului
- Pasul 5: pseudoinversa
- Utilizarea implementării
- Livrarea rezultatului
- Exerciții
- Termeni-cheie
- Lecturi suplimentare
SVD este briceagul elvețian al algebrei liniare. Orice matrice are o asemenea descompunere. Orice specialist în știința datelor are nevoie de ea.
Tip: Construire Limbaje: Python, Julia Cerințe preliminare: Faza 1, lecțiile 01 (Intuiție pentru algebra liniară), 02 (Vectori, matrice și operații), 03 (Transformări matriciale) Durată: ~120 de minute
Obiective de învățare
- Implementarea SVD prin metoda puterii și explicarea semnificației geometrice a matricelor U, Sigma și V^T
- Aplicarea SVD trunchiate pentru compresia imaginilor și măsurarea raportului de compresie și a erorii de reconstrucție
- Calcularea pseudoinversei Moore–Penrose prin SVD pentru rezolvarea sistemelor supradeterminate prin metoda celor mai mici pătrate
- Stabilirea legăturii dintre SVD și PCA, sistemele de recomandare bazate pe factori latenți și analiza semantică latentă din NLP
Problema
Aveți o matrice 1000x2000. Poate conține evaluările acordate filmelor de către utilizatori, frecvențele termenilor din documente sau valorile pixelilor unei imagini. Trebuie să o comprimați, să eliminați zgomotul, să-i descoperiți structura ascunsă ori să rezolvați cu ajutorul ei un sistem prin metoda celor mai mici pătrate. Descompunerea în valori proprii funcționează numai pentru matrice pătratice. Chiar și atunci, matricea trebuie să aibă un sistem complet de vectori proprii liniar independenți.
SVD funcționează pentru orice matrice, indiferent de dimensiuni sau rang și fără condiții suplimentare. Descompune matricea în trei factori care dezvăluie geometria acțiunii sale asupra spațiului. Este cea mai generală și mai utilă factorizare din întreaga algebră liniară.
Conceptul
Interpretarea geometrică a SVD
Orice matrice, indiferent de dimensiuni, efectuează succesiv trei operații: rotație, scalare și încă o rotație. SVD face explicită această descompunere.
A = U * Sigma * V^T
m x n m x m m x n n x n
(oricare) (rotație) (scalare) (rotație)
Pentru orice matrice A, SVD o factorizează astfel:
- V^T rotește vectorii din spațiul de intrare, cu n dimensiuni
- Sigma scalează de-a lungul fiecărei axe, prin dilatare sau contracție
- U rotește rezultatul în spațiul de ieșire, cu m dimensiuni
Gândiți-vă astfel: îi oferiți algoritmului SVD o matrice, iar acesta vă spune că matricea transformă o sferă de intrări rotind-o mai întâi prin V^T, apoi întinzând-o într-un elipsoid prin Sigma și, la final, rotind elipsoidul prin U. Valorile singulare sunt lungimile axelor elipsoidului.
Descompunerea completă
Pentru o matrice A cu dimensiunile m x n:
A = U * Sigma * V^T
unde:
U este m x m, ortogonală (U^T U = I)
Sigma este m x n, diagonală (valorile singulare pe diagonală)
V este n x n, ortogonală (V^T V = I)
Valorile singulare sigma_1 >= sigma_2 >= ... >= sigma_r > 0
unde r = rang(A)
Coloanele matricei U se numesc vectori singulari stângi. Coloanele matricei V se numesc vectori singulari drepți. Elementele diagonale ale matricei Sigma se numesc valori singulare. Acestea sunt întotdeauna nenegative și, prin convenție, sunt ordonate descrescător.
Vectori singulari stângi, valori singulare și vectori singulari drepți
Fiecare componentă a SVD are o semnificație geometrică distinctă.
Vectorii singulari drepți (coloanele matricei V): formează o bază ortonormată pentru spațiul de intrare (R^n). Sunt direcțiile din spațiul de intrare pe care matricea le transformă în direcții ortogonale din spațiul de ieșire. Îi puteți considera sistemul natural de coordonate al domeniului.
Valorile singulare (diagonala matricei Sigma): sunt factorii de scalare. A i-a valoare singulară indică factorul cu care matricea întinde vectorii de-a lungul celui de-al i-lea vector singular drept. O valoare singulară egală cu zero înseamnă că matricea anulează complet direcția respectivă.
Vectorii singulari stângi (coloanele matricei U): formează o bază ortonormată pentru spațiul de ieșire (R^m). Al i-lea vector singular stâng reprezintă direcția din spațiul de ieșire în care ajunge al i-lea vector singular drept, după scalare.
Relația dintre aceste componente este:
A * v_i = sigma_i * u_i
Matricea A preia al i-lea vector singular drept v_i,
îl scalează cu sigma_i și îl transformă în al i-lea vector singular stâng u_i.
Astfel obțineți o imagine, coordonată cu coordonată, a acțiunii oricărei matrice.
Forma bazată pe produse exterioare
SVD poate fi scrisă ca o sumă de matrice de rang 1:
A = sigma_1 * u_1 * v_1^T + sigma_2 * u_2 * v_2^T + ... + sigma_r * u_r * v_r^T
Fiecare termen sigma_i * u_i * v_i^T este o matrice de rang 1 (un produs exterior).
Matricea completă este suma a r asemenea matrice, unde r este rangul.
Această formă reprezintă fundamentul aproximării de rang redus. Fiecare termen adaugă un nivel de structură. Primul termen surprinde tiparul dominant. Al doilea îl surprinde pe următorul ca importanță și așa mai departe. Trunchierea sumei oferă cea mai bună aproximare posibilă pentru orice rang dat.
Aproximare de rang 1: A_1 = sigma_1 * u_1 * v_1^T
(surprinde tiparul dominant)
Aproximare de rang 2: A_2 = sigma_1 * u_1 * v_1^T + sigma_2 * u_2 * v_2^T
(surprinde cele mai importante două tipare)
Aproximare de rang k: A_k = suma primilor k termeni
(optimă conform teoremei Eckart–Young)
Relația cu descompunerea în valori proprii
SVD și descompunerea în valori proprii sunt strâns legate. Valorile și vectorii singulari ai matricei A provin direct din valorile și vectorii proprii ai matricelor A^T A și A A^T.
A^T A = V * Sigma^T * U^T * U * Sigma * V^T
= V * Sigma^T * Sigma * V^T
= V * D * V^T
unde D = Sigma^T * Sigma este o matrice diagonală cu sigma_i^2 pe diagonală.
Prin urmare:
- Vectorii singulari drepți (V) sunt vectori proprii ai matricei A^T A
- Pătratele valorilor singulare (sigma_i^2) sunt valori proprii ale matricei A^T A
În mod similar:
A A^T = U * Sigma * V^T * V * Sigma^T * U^T
= U * Sigma * Sigma^T * U^T
Prin urmare:
- Vectorii singulari stângi (U) sunt vectori proprii ai matricei A A^T
- Valorile proprii ale matricei A A^T sunt tot sigma_i^2
Această legătură vă arată trei lucruri:
- Valorile singulare sunt întotdeauna reale și nenegative, deoarece sunt rădăcinile pătrate ale valorilor proprii ale unei matrice pozitiv semidefinite.
- Ați putea calcula SVD prin descompunerea în valori proprii a matricei A^T A, însă astfel pătrați numărul de condiționare și pierdeți precizie numerică. Algoritmii SVD specializați evită această problemă.
- Când A este pătratică, simetrică și pozitiv semidefinită, SVD și descompunerea în valori proprii coincid.
SVD trunchiată: aproximarea de rang redus
Teorema Eckart–Young–Mirsky afirmă că cea mai bună aproximare de rang k a matricei A, atât în norma Frobenius, cât și în norma spectrală, se obține păstrând numai primele k valori singulare și vectorii corespunzători:
A_k = U_k * Sigma_k * V_k^T
unde:
U_k este m x k (primele k coloane ale matricei U)
Sigma_k este k x k (blocul k x k din colțul stânga-sus al matricei Sigma)
V_k este n x k (primele k coloane ale matricei V)
Eroarea de aproximare = sigma_{k+1} (în norma spectrală)
= sqrt(sigma_{k+1}^2 + ... + sigma_r^2) (în norma Frobenius)
Aceasta nu este doar „o aproximare bună”, ci, în mod demonstrabil, cea mai bună aproximare posibilă de rang k. Nicio altă matrice de rang k nu este mai apropiată de A.
| Componentă | Mărime relativă | Păstrată în aproximarea de rang 3? |
|---|---|---|
| sigma_1 | Cea mai mare | Da |
| sigma_2 | Mare | Da |
| sigma_3 | Mediu-mare | Da |
| sigma_4 | Medie | Nu (eroare) |
| sigma_5 | Mediu-mică | Nu (eroare) |
| sigma_6 | Mică | Nu (eroare) |
| sigma_7 | Foarte mică | Nu (eroare) |
| sigma_8 | Infimă | Nu (eroare) |
Păstrați primele 3 componente: A_3 surprinde cele mai mari trei valori singulare. Eroarea este dată de valorile rămase, de la sigma_4 la sigma_8.
Dacă valorile singulare descresc rapid, un k mic surprinde cea mai mare parte a matricei. Dacă descresc lent, matricea nu are o structură de rang redus.
Compresia imaginilor cu SVD
O imagine în tonuri de gri este o matrice de intensități ale pixelilor. O imagine 800x600 conține 480.000 de valori. SVD vă permite să o aproximați folosind mult mai puține.
Imagine originală: 800 x 600 = 480.000 de valori
SVD de rang k:
U_k: 800 x k valori
Sigma_k: k valori
V_k: 600 x k valori
Total: k * (800 + 600 + 1) = k * 1401 valori
k=10: 14.010 valori (2,9% din original)
k=50: 70.050 valori (14,6% din original)
k=100: 140.100 valori (29,2% din original)
Raportul de compresie se îmbunătățește când k scade,
dar calitatea vizuală se degradează.
Observația esențială este că valorile singulare ale imaginilor naturale descresc rapid. Primele valori singulare surprind structura generală, precum formele și gradienții. Cele ulterioare surprind detaliile fine și zgomotul. Trunchierea la rangul 50 produce adesea o imagine aproape identică vizual cu originalul, folosind cu 85% mai puțin spațiu de stocare.
SVD pentru sisteme de recomandare
Netflix Prize a făcut celebră această utilizare. Aveți o matrice de evaluări utilizator–film, în care majoritatea elementelor lipsesc.
Film1 Film2 Film3 Film4 Film5
Utilizator1 [ 5 ? 3 ? 1 ]
Utilizator2 [ ? 4 ? 2 ? ]
Utilizator3 [ 3 ? 5 ? ? ]
Utilizator4 [ ? ? ? 4 3 ]
? = evaluare necunoscută
Ideea este că această matrice de evaluări are rang redus. Gusturile utilizatorilor nu sunt complet independente. Un număr mic de factori latenți, precum acțiune față de dramă, filme vechi față de noi sau filme intelectuale față de filme care mizează pe reacții instinctive, explică majoritatea preferințelor.
SVD aplicată matricei de evaluări, după completarea valorilor lipsă, o descompune astfel:
- U: profilurile utilizatorilor în spațiul factorilor latenți
- Sigma: importanța fiecărui factor latent
- V^T: profilurile filmelor în spațiul factorilor latenți
Evaluarea prezisă a unui film de către un utilizator este produsul scalar dintre profilul utilizatorului și cel al filmului, ponderat prin valorile singulare. Aproximarea de rang redus completează elementele lipsă.
În practică, se folosesc variante precum SVD incrementală a lui Simon Funk sau metoda alternantă a celor mai mici pătrate (ALS; engl. alternating least squares), care tratează direct datele lipsă. Ideea de bază rămâne însă aceeași: descompunerea în factori latenți prin SVD.
SVD în NLP: analiza semantică latentă
Analiza semantică latentă (Latent Semantic Analysis, LSA), numită și indexare semantică latentă (Latent Semantic Indexing, LSI), aplică SVD unei matrice termen–document.
Doc1 Doc2 Doc3 Doc4
„pisică” [ 3 0 1 0 ]
„câine” [ 2 0 0 1 ]
„pește” [ 0 4 1 0 ]
„animal” [ 1 1 1 1 ]
„ocean” [ 0 3 0 0 ]
După SVD cu rangul k=2:
Fiecare document devine un punct într-un „spațiu conceptual” bidimensional.
Fiecare termen devine un punct în același spațiu bidimensional.
Documentele cu subiecte similare se grupează împreună.
Termenii cu sensuri similare se grupează împreună.
„pisică” și „câine” ajung aproape unul de celălalt (animale terestre).
„pește” și „ocean” ajung aproape unul de celălalt (concepte acvatice).
Doc1 și Doc3 se grupează dacă au subiecte similare.
LSA a fost una dintre primele metode reușite de identificare a similitudinii semantice din text brut. Funcționează deoarece termenii sinonimi tind să apară în documente similare, iar SVD îi grupează în aceleași dimensiuni latente. Reprezentările vectoriale moderne ale cuvintelor, precum Word2Vec și GloVe, pot fi considerate continuatoare ale acestei idei.
SVD pentru reducerea zgomotului
Atunci când datele pot fi modelate ca un semnal de rang redus perturbat de zgomot și există o separare spectrală clară, semnalul tinde să fie concentrat în primele valori singulare, iar o parte importantă a zgomotului apare în valorile mai mici. În acest regim, trunchierea poate reduce nivelul de fond al zgomotului.
Valorile singulare ale semnalului curat:
| Componentă | Mărime | Tip |
|---|---|---|
| sigma_1 | Foarte mare | Semnal |
| sigma_2 | Mare | Semnal |
| sigma_3 | Medie | Semnal |
| sigma_4 | Aproape zero | Neglijabilă |
| sigma_5 | Aproape zero | Neglijabilă |
Valorile singulare ale semnalului cu zgomot (zgomotul se adaugă tuturor):
| Componentă | Mărime | Tip |
|---|---|---|
| sigma_1 | Foarte mare | Semnal |
| sigma_2 | Mare | Semnal |
| sigma_3 | Medie | Semnal |
| sigma_4 | Mică | Zgomot |
| sigma_5 | Mică | Zgomot |
| sigma_6 | Mică | Zgomot |
| sigma_7 | Mică | Zgomot |
Metoda este folosită în procesarea semnalelor, măsurători științifice și curățarea datelor. Pentru o matrice coruptă de zgomot aditiv, SVD trunchiată oferă o metodă fundamentată de separare aproximativă a semnalului de zgomot atunci când ipoteza de semnal cu rang redus și separarea spectrală sunt plauzibile.
Pseudoinversa prin SVD
Pseudoinversa Moore–Penrose A+ generalizează inversarea matricelor pentru matrice nepătratice și singulare. SVD face calcularea ei foarte simplă.
Dacă A = U * Sigma * V^T, atunci:
A+ = V * Sigma+ * U^T
unde Sigma+ se formează astfel:
1. Transpuneți Sigma (interschimbați liniile și coloanele)
2. Înlocuiți fiecare element diagonal nenul sigma_i cu 1/sigma_i
3. Păstrați zerourile neschimbate
Pentru A (m x n): A+ este (n x m)
Pentru Sigma (m x n): Sigma+ este (n x m)
Pseudoinversa rezolvă probleme prin metoda celor mai mici pătrate. Dacă Ax = b nu are o soluție exactă, ca în cazul unui sistem supradeterminat, atunci x = A+ b minimizează ||Ax - b|| și, dintre toate soluțiile care ating acest minim, are norma euclidiană minimă.
Sistem supradeterminat (mai multe ecuații decât necunoscute):
[1 1] [3]
[2 1] x = [5] Nu există nicio soluție exactă.
[3 1] [6]
x_ls = A+ b = V * Sigma+ * U^T * b
Rezultatul este valoarea x care minimizează suma pătratelor reziduurilor.
Dacă A are rang complet pe coloane, este aceeași soluție ca în cazul
ecuațiilor normale (A^T A)^(-1) A^T b, dar calculul prin SVD este mai stabil numeric.
Avantajele privind stabilitatea numerică
Calcularea descompunerii în valori proprii a matricei A^T A pătrățește valorile singulare, deoarece valorile proprii ale matricei A^T A sunt sigma_i^2. Astfel se pătrățește numărul de condiționare și se amplifică erorile numerice.
Exemplu:
A are valorile singulare [1000, 1, 0.001]
Numărul de condiționare al matricei A: 1000 / 0.001 = 10^6
A^T A are valorile proprii [10^6, 1, 10^{-6}]
Numărul de condiționare al matricei A^T A: 10^6 / 10^{-6} = 10^{12}
Calcul SVD direct: folosește numărul de condiționare 10^6
Calcul prin A^T A: folosește numărul de condiționare 10^{12}
(se pierd încă 6 cifre de precizie)
Algoritmii SVD moderni, precum bidiagonalizarea Golub–Kahan, lucrează direct cu A și nu formează niciodată A^T A. De aceea, trebuie să preferați întotdeauna np.linalg.svd(A) în locul np.linalg.eig(A.T @ A).
Legătura cu PCA
PCA este chiar SVD aplicată datelor centrate. Nu este o analogie, ci exact același calcul.
Pentru matricea de date X (n_samples x n_features), centrată (media a fost scăzută):
Matricea de covarianță: C = (1/(n-1)) * X^T X
PCA găsește vectorii proprii ai matricei C. Însă:
X = U * Sigma * V^T (SVD a matricei X)
X^T X = V * Sigma^2 * V^T
C = (1/(n-1)) * V * Sigma^2 * V^T
Prin urmare, componentele principale sunt exact vectorii singulari drepți V.
Varianța explicată de fiecare componentă este sigma_i^2 / (n-1).
În sklearn, PCA este implementată cu SVD, nu prin descompunere în valori proprii.
Este mai rapidă și mai stabilă numeric.
Aceasta înseamnă că tot ce ați învățat despre reducerea dimensionalității în lecția 10 folosește SVD în interior. PCA este cea mai frecventă aplicație a SVD în învățarea automată.
svd-rank-reconstruction
Construirea implementării
Pasul 1: SVD de la zero folosind metoda puterii
Ideea este următoarea: pentru a găsi cea mai mare valoare singulară și vectorii săi, aplicați metoda puterii matricei A^T A sau A A^T. Apoi eliminați componenta găsită din matrice și repetați procesul pentru următoarea valoare singulară.
import numpy as np
def power_iteration(M, num_iters=100):
n = M.shape[1]
v = np.random.randn(n)
v = v / np.linalg.norm(v)
for _ in range(num_iters):
Mv = M @ v
v = Mv / np.linalg.norm(Mv)
eigenvalue = v @ M @ v
return eigenvalue, v
def svd_from_scratch(A, k=None):
m, n = A.shape
if k is None:
k = min(m, n)
sigmas = []
us = []
vs = []
A_residual = A.copy().astype(float)
for _ in range(k):
AtA = A_residual.T @ A_residual
eigenvalue, v = power_iteration(AtA, num_iters=200)
if eigenvalue < 1e-10:
break
sigma = np.sqrt(eigenvalue)
u = A_residual @ v / sigma
sigmas.append(sigma)
us.append(u)
vs.append(v)
A_residual = A_residual - sigma * np.outer(u, v)
U = np.column_stack(us) if us else np.empty((m, 0))
S = np.array(sigmas)
V = np.column_stack(vs) if vs else np.empty((n, 0))
return U, S, V
Notă tehnică a traducerii: Acest cod didactic păstrează implementarea originală. În
power_iteration, normalizarea poate împărți la zero dacăM @ vdevine vectorul nul; iar deflația succesivă fără reortogonalizare poate pierde precizie, mai ales pentru valori singulare apropiate sau repetate. O implementare de producție trebuie să trateze aceste cazuri și să folosească algoritmi SVD stabili.
Pasul 2: testarea și compararea cu NumPy
np.random.seed(42)
A = np.random.randn(5, 4)
U_ours, S_ours, V_ours = svd_from_scratch(A)
U_np, S_np, Vt_np = np.linalg.svd(A, full_matrices=False)
print("Our singular values:", np.round(S_ours, 4))
print("NumPy singular values:", np.round(S_np, 4))
A_reconstructed = U_ours @ np.diag(S_ours) @ V_ours.T
print(f"Reconstruction error: {np.linalg.norm(A - A_reconstructed):.8f}")
Pasul 3: demonstrație de compresie a unei imagini
def compress_image_svd(image_matrix, k):
U, S, Vt = np.linalg.svd(image_matrix, full_matrices=False)
compressed = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
return compressed
image = np.random.seed(42)
rows, cols = 200, 300
image = np.random.randn(rows, cols)
for k in [1, 5, 10, 20, 50]:
compressed = compress_image_svd(image, k)
error = np.linalg.norm(image - compressed) / np.linalg.norm(image)
original_size = rows * cols
compressed_size = k * (rows + cols + 1)
ratio = compressed_size / original_size
print(f"k={k:>3d} error={error:.4f} storage={ratio:.1%}")
Pasul 4: reducerea zgomotului
np.random.seed(42)
clean = np.outer(np.sin(np.linspace(0, 4*np.pi, 100)),
np.cos(np.linspace(0, 2*np.pi, 80)))
noise = 0.3 * np.random.randn(100, 80)
noisy = clean + noise
U, S, Vt = np.linalg.svd(noisy, full_matrices=False)
denoised = U[:, :5] @ np.diag(S[:5]) @ Vt[:5, :]
print(f"Noisy error: {np.linalg.norm(noisy - clean):.4f}")
print(f"Denoised error: {np.linalg.norm(denoised - clean):.4f}")
print(f"Improvement: {(1 - np.linalg.norm(denoised - clean) / np.linalg.norm(noisy - clean)):.1%}")
Pasul 5: pseudoinversa
A = np.array([[1, 1], [2, 1], [3, 1]], dtype=float)
b = np.array([3, 5, 6], dtype=float)
U, S, Vt = np.linalg.svd(A, full_matrices=False)
S_inv = np.diag(1.0 / S)
A_pinv = Vt.T @ S_inv @ U.T
x_svd = A_pinv @ b
x_lstsq = np.linalg.lstsq(A, b, rcond=None)[0]
x_pinv = np.linalg.pinv(A) @ b
print(f"SVD pseudoinverse solution: {x_svd}")
print(f"np.linalg.lstsq solution: {x_lstsq}")
print(f"np.linalg.pinv solution: {x_pinv}")
Notă tehnică a traducerii: Fragmentul inversează toate valorile singulare fără un prag de toleranță. Pentru matrici cu rang numeric deficient, valorile foarte mici trebuie considerate zero;
np.linalg.pinvșinp.linalg.lstsqaleg un prag pentru a evita amplificarea extremă a erorilor.
Utilizarea implementării
Demonstrațiile complete se află în code/svd.py. Rulați fișierul pentru a vedea cum se aplică SVD la compresia imaginilor, sistemele de recomandare, analiza semantică latentă și reducerea zgomotului.
python svd.py
Versiunea Julia din code/svd.jl demonstrează aceleași concepte folosind funcția nativă svd() din Julia și pachetul LinearAlgebra.
julia svd.jl
Livrarea rezultatului
În urma acestei lecții obțineți:
outputs/skill-svd.md- un modul reutilizabil care vă ajută să decideți când și cum să aplicați SVD în proiecte reale
Exerciții
-
Implementați SVD completă de la zero fără să folosiți metoda puterii. În schimb, calculați descompunerea în valori proprii a matricei A^T A pentru a obține V și valorile singulare, apoi calculați U = A V Sigma^{-1}. Comparați precizia numerică cu cea a versiunii bazate pe metoda puterii și cu rezultatul NumPy.
-
Încărcați o imagine reală în tonuri de gri sau convertiți una în tonuri de gri. Comprimați-o la rangurile 1, 5, 10, 25, 50 și 100. Pentru fiecare rang, calculați raportul de compresie și eroarea relativă. Găsiți rangul la care imaginea devine acceptabilă vizual.
-
Construiți un sistem de recomandare de dimensiuni mici. Creați o matrice 10x8 cu evaluările unor filme de către utilizatori și cu câteva elemente cunoscute. Completați elementele lipsă cu mediile liniilor. Calculați SVD și reconstruiți o aproximare de rang 3. Folosiți matricea reconstruită pentru a prezice evaluările lipsă. Verificați dacă predicțiile sunt rezonabile.
-
Creați o matrice termen–document 100x50 cu 3 subiecte sintetice. Fiecare subiect are 5 termeni asociați. Adăugați zgomot. Aplicați SVD și verificați dacă primele 3 valori singulare sunt mult mai mari decât restul. Proiectați documentele în spațiul latent tridimensional și verificați dacă documentele din același subiect se grupează împreună.
-
Generați o matrice curată de rang redus, cu rangul 3 și dimensiunile 50x40, apoi adăugați zgomot gaussian la nivelurile sigma = 0.1, 0.5, 1.0 și 2.0. Pentru fiecare nivel de zgomot, găsiți rangul optim de trunchiere parcurgând valorile k de la 1 la 40 și măsurând eroarea de reconstrucție față de matricea curată. Reprezentați grafic modul în care rangul k optim se modifică odată cu nivelul zgomotului.
Termeni-cheie
| Termen | Formulare uzuală | Ce înseamnă de fapt |
|---|---|---|
| SVD | „Factorizați orice matrice” | Descompunerea matricei A sub forma U Sigma V^T, unde U și V sunt ortogonale, iar Sigma este diagonală și are elemente nenegative. Funcționează pentru orice matrice, indiferent de dimensiuni. |
| Valoare singulară | „Importanța acestei componente” | Al i-lea element diagonal al matricei Sigma. Măsoară factorul cu care matricea întinde spațiul de-a lungul celei de-a i-a direcții principale. Este întotdeauna nenegativă, iar valorile sunt ordonate descrescător. |
| Vector singular stâng | „Direcție de ieșire” | O coloană a matricei U. Direcția din spațiul de ieșire în care este transformat al i-lea vector singular drept, după scalarea cu sigma_i. |
| Vector singular drept | „Direcție de intrare” | O coloană a matricei V. Direcția din spațiul de intrare pe care matricea o transformă în al i-lea vector singular stâng, după scalarea cu sigma_i. |
| SVD trunchiată | „Aproximare de rang redus” | Păstrează doar primele k valori singulare și vectorii lor. Produce, în mod demonstrabil, cea mai bună aproximare de rang k a matricei originale, conform teoremei Eckart–Young. |
| Rang | „Dimensionalitatea reală” | Numărul valorilor singulare nenule. Indică numărul direcțiilor independente folosite efectiv de matrice. |
| Pseudoinversă | „Inversă generalizată” | V Sigma+ U^T. Inversează valorile singulare nenule și păstrează zerourile. Rezolvă probleme prin metoda celor mai mici pătrate pentru matrice nepătratice sau singulare. |
| Număr de condiționare | „Sensibilitatea la erori” | sigma_max / sigma_min. Un număr de condiționare mare înseamnă că modificări mici ale intrării produc modificări mari ale ieșirii. SVD dezvăluie direct această proprietate. |
| Factor latent | „Variabilă ascunsă” | O dimensiune din spațiul de rang redus descoperit prin SVD. În recomandări, un factor latent poate corespunde preferinței pentru un gen. În NLP, poate corespunde unui subiect. |
| Norma Frobenius | „Dimensiunea totală a matricei” | Rădăcina pătrată a sumei pătratelor elementelor. Este egală cu rădăcina pătrată a sumei pătratelor valorilor singulare și se folosește pentru măsurarea erorii de aproximare. |
| Teorema Eckart–Young | „SVD oferă cea mai bună compresie” | Pentru orice rang țintă k, SVD trunchiată minimizează eroarea de aproximare dintre toate matricele posibile de rang k. |
| Metoda puterii | „Găsiți vectorul propriu dominant” | Înmulțirea repetată a unui vector aleatoriu cu matricea și normalizarea rezultatului. Converge către vectorul propriu corespunzător celei mai mari valori proprii. Este componenta de bază a multor algoritmi SVD. |
Lecturi suplimentare
- Gilbert Strang: Linear Algebra and Its Applications, Chapter 7 - prezentare detaliată a SVD și a aplicațiilor sale
- 3Blue1Brown: But what is the SVD? - interpretarea geometrică a SVD
- We Recommend a Singular Value Decomposition - prezentare accesibilă realizată de American Mathematical Society
- Netflix Prize and Matrix Factorization - articolul original al lui Simon Funk despre SVD pentru recomandări
- Latent Semantic Analysis - aplicația originală a SVD în NLP
- Numerical Linear Algebra by Trefethen and Bau - lucrarea de referință pentru înțelegerea algoritmilor SVD și a proprietăților lor numerice
Sursă: Singular Value Decomposition — original
Navigare: înapoi: 01.10 — Reducerea dimensionalității · Faza 1 — Fundamente matematice · Catalog complet · în continuare: 01.12 — Operații cu tensori.