Main Content

Valori singolari

Un valore singolare e i vettori singolari corrispondenti di una matrice rettangolare A sono rispettivamente un σ scalare e una coppia di vettori u e v che soddisfano

Av=σuAHu=σv,

in cui AH è il trasposto hermitiano di A. I vettori singolari u e v solitamente sono scalati per presentare una norma di 1. Inoltre, se u e v sono vettori singolari di A, allora anche -u e -v sono vettori singolari di A.

I valori singolari di σ sono sempre reali e non negativi, anche se A è complesso. Con i valori singolari in una matrice di diagonali Σ e i corrispondenti vettori singolari che formano le colonne di due matrici ortogonali U e V, si ottengono le equazioni

AV=UΣAHU=VΣ.

Poiché U e V sono matrici unitarie, moltiplicando la prima equazione per VH sulla destra si ottiene l'equazione di decomposizione in valori singolari

A=UΣVH.

La decomposizione completa in valori singolari di una matrice mxn comporta:

  • Matrice U mxm

  • Matrice Σ mxn

  • Matrice Vnxn

In altre parole, U e V sono entrambi quadrate e Σ presenta le stesse dimensioni di A. Se A presenta molte più righe che colonne (m > n), allora la matrice U mxm che ne risulta è grande. La maggior parte delle colonne in U, tuttavia, è moltiplicata per zero in Σ. In questo caso, la decomposizione economy sized consente di risparmiare tempo e spazio di memorizzazione producendo una U mxn, una Σ nxn e la stessa V:

In the economy-sized decomposition, columns in U can be ignored if they multiply zeros in the diagonal matrix of singular values.

La decomposizione in autovalori è lo strumento appropriato per analizzare una matrice quando quest'ultima rappresenta una mappatura da uno spazio di vettori in se stessa, come avviene per una normale equazione differenziale. La decomposizione in valori singoli è invece lo strumento appropriato per analizzare una mappatura da uno spazio di vettori in un altro spazio di vettori, possibilmente di dimensioni diverse. Molti sistemi di equazioni lineari simultanee rientrano in questa seconda categoria.

Se A è singolare, simmetrica e definita positiva, allora le sue decomposizioni in autovalori e in valori singolari coincidono. Poiché A, invece, si discosta dalla simmetria e dalla definitività positiva, la differenza tra le due decomposizioni aumenta. In particolare, la decomposizione in valori singolari di una matrice reale è sempre reale, mentre la decomposizione in autovalori di una matrice reale non simmetrica potrebbe essere complessa.

Per la matrice dell'esempio

A = [9     4
     6     8
     2     7];

la decomposizione completa in valori singolari è

[U,S,V] = svd(A)

U =

   -0.6105    0.7174    0.3355
   -0.6646   -0.2336   -0.7098
   -0.4308   -0.6563    0.6194


S =

   14.9359         0
         0    5.1883
         0         0


V =

   -0.6925    0.7214
   -0.7214   -0.6925

È possibile verificare che U*S*V' è pari a A entro i margini di arrotondamento degli errori. Per questo problema di piccola entità, la decomposizione economy size è solo leggermente più piccola.

[U,S,V] = svd(A,"econ")

U =

   -0.6105    0.7174
   -0.6646   -0.2336
   -0.4308   -0.6563


S =

   14.9359         0
         0    5.1883


V =

   -0.6925    0.7214
   -0.7214   -0.6925

Ancora una volta, U*S*V' è uguale a A entro i margini di arrotondamento degli errori.

Calcolo della SVD in batch

Qualora si debba decomporre un grande gruppo di matrici della stessa dimensione, eseguire tutte le decomposizioni in un loop con svd risulta essere inefficiente. È invece possibile concatenare tutte le matrici in un array multidimensionale e utilizzare pagesvd per eseguire le decomposizioni ai valori singolari su tutte le pagine dell’array, tramite un'unica chiamata di funzione.

FunzioneUtilizzo
pagesvdUtilizzare pagesvd per eseguire le decomposizioni ai valori singolari sulle pagine di un array multidimensionale. Si tratta di un modo efficiente per eseguire la SVD su un grande gruppo di matrici della stessa dimensione.

Ad esempio, si consideri un gruppo di tre matrici 2 per 2. Concatenare le matrici in un array di 2 per 2 per 3 utilizzando la funzione cat.

A = [0 -1; 1 0];
B = [-1 0; 0 -1];
C = [0 1; -1 0];
X = cat(3,A,B,C);

Ora, utilizzare pagesvd per eseguire le tre decomposizioni contemporaneamente.

[U,S,V] = pagesvd(X);

Per ciascuna pagina di X, sono presenti le pagine corrispondenti negli output U, S e V. Ad esempio, la matrice A si trova sulla prima pagina d X e la sua decomposizione è data da U(:,:,1)*S(:,:,1)*V(:,:,1)'.

Approssimazioni SVD di rank ridotto

Per le grandi matrici sparse, non è sempre pratico utilizzare svd per calcolare tutti i valori singolari e i vettori singolari. Ad esempio, se fosse necessario conoscere solo alcuni dei valori singolari più grandi, calcolare tutti i valori singolari di una matrice sparsa 5000x5000 rappresenta un lavoro in più.

Nei casi in cui sia necessario solo un sottoinsieme dei valori singolari e dei vettori singolari, è preferibile utilizzare le funzioni svds e svdsketchrispetto a svd.

FunzioneUtilizzo
svdsUtilizzare svds per calcolare un'approssimazione rank-k della SVD. È possibile specificare se la sotto-serie di valori singolari deve essere quella più grande, quella più piccola, oppure quella più prossima a un numero specifico. svds generalmente calcola la miglior approssimazione possibile rank-k.
svdsketchUtilizzare svdsketch per calcolare un'approssimazione SVD parziale della matrice di input che soddisfa una tolleranza specifica. Mentre svds richiede la specifica del rank, svdsketch determina in modo adattivo il rank dello sketch della matrice in base alla tolleranza specificata. L'approssimazione rank-kutilizzata in ultima istanza da svdsketchsoddisfa la tolleranza ma, diversamente da svds, non è garantito che sia la migliore possibile.

Ad esempio, si consideri una matrice sparsa casuale 1000x1000 con una densità di circa il 30%.

n = 1000;
A = sprand(n,n,0.3);

I sei valori singolari più grandi sono

S = svds(A)

S =

  130.2184
   16.4358
   16.4119
   16.3688
   16.3242
   16.2838

I sei valori singolari più piccoli, inoltre, sono

S = svds(A,6,"smallest")

S =

    0.0740
    0.0574
    0.0388
    0.0282
    0.0131
    0.0066

Per le matrici più piccole, che possono essere memorizzate come una matrice completa, full(A), l'uso di svd(full(A)) potrebbe risultare più veloce rispetto a svds o svdsketch. Per matrici molto grandi e sparse, tuttavia, diventa necessario usare svds o svdsketch.

Vedi anche

| | | |

Argomenti complementari