Adattamento di nuove immagini da un calcolo SVD / PCA


16

Sto cercando di replicare le idee dalla pagina Eigenface su Wikipedia. Da un centinaio di immagini di esempio rappresentate da una matrice di dati (in cui ogni immagine è stata appiattita in un vettore di lunghezza n , quindi X è una matrice da 100 per n ), ho calcolato una decomposizione SVD:XnX100n

X=UΣVT

quindi:

XXT=UΣ2UT

Prendendo un sottoinsieme dei più grandi eigenmodes, posso approssimare la matrice (sia σ 1σ 2 ):qσ1σ2

Xσ1u1v1T+σ2u2v2T++σquqvqT

Ora dato un nuovo vettore , che rappresenta un'immagine non in X , come posso determinare la ponderazione degli autovettori q U per rappresentare al meglio la mia nuova immagine y ? Tranne casi patologici, questa rappresentazione è unica?yXqUy

In breve, ciò che mi piacerebbe fare è questo (dalla pagina wiki):

Queste autovetture possono ora essere utilizzate per rappresentare sia le facce esistenti sia quelle nuove : possiamo proiettare una nuova immagine (sottratta dalla media) sulle autovetture e quindi registrare come questa nuova faccia differisce dalla faccia media.

Come posso fare quella proiezione?


1
I futuri lettori potrebbero trovare utile questa implementazione.
Emre,

Risposte:


11

La "proiezione" a cui si fa riferimento è una proiezione vettoriale . Per calcolare la proiezione del vettore sul vettore b , si utilizza il prodotto interno dei due vettori:ab

aproj=a,bb

in questo caso è la componente vettoriale di a che si trova nella stessa direzione di b . Nello spazio euclideo, l'operatore del prodotto interno è definito come il loroprodotto punto:aprojab

a,b=ab=i=1naibi

dove è il numero di componenti nei vettori a e b e a i e b i sono l' i -componente dei vettori a e b , rispettivamente. Intuitivamente, calcolando il prodotto interno dei due vettori, si trova "quanto di" vettore a va nella direzione del vettore b . Si noti che questa è una quantità firmata, quindi un valore negativo significherebbe che l'angolo tra i due vettori è maggiore di 90 gradi, come illustrato da una definizione alternativa per l'operatore di proiezione:nabaibiiabab

aproj=|a|cos(θ)b

dove è l'angolo tra i due vettori.θ

Quindi, dati un vettore e un gruppo di vettori di base b i , si può trovare "quanto di a " va in ciascuna delle direzioni di ciascuno dei vettori di base. Tipicamente, quei vettori di base saranno tutti reciprocamente ortogonali. Nel tuo caso, SVD è una decomposizione ortogonale, quindi questa condizione dovrebbe essere soddisfatta. Quindi, per realizzare ciò che descrivi, prendi la matrice di autovettoriabia e calcolare il prodotto interno del vettore candidato y con ciascuna delle colonne della matrice:Uy

pi=yui

Il valore scalare che si ottiene da ciascun prodotto interno rappresenta quanto bene il vettore y "si è allineato" con l' i -esimo autovettore. Poiché gli autovettori sono ortonormali , è possibile ricostruire il vettore originale y nel modo seguente:piyiy

y=i=1npiui

Hai chiesto se questa rappresentazione è unica; Non sono sicuro di cosa significhi esattamente, ma non è unico nel senso che un dato vettore potrebbe essere scomposto per proiezione su un numero qualsiasi di basi ortonormali. Gli autovettori contenuti nella matrice U ne sono un esempio, ma puoi usarne un numero qualsiasi. Ad esempio, il calcolo della trasformata discreta di Fourier di y può essere visto come proiettandolo su una base ortonormale di vettori esponenziali complessi di frequenza variabile.yUy


y

yy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.