Anpassen neuer Bilder aus einer SVD / PCA-Berechnung

16

Ich versuche, die Ideen von der Eigenface-Seite auf Wikipedia zu replizieren . Aus hundert Beispielbildern, die durch eine Datenmatrix (wobei jedes Bild auf einen Vektor der Länge n abgeflacht ist , also X eine Matrix von 100 mal n ist), habe ich eine SVD-Zerlegung berechnet:XnX100n

X=UΣVT

daher:

XXT=UΣ2UT

Indem ich eine Teilmenge der größten Eigenmoden nehme , kann ich die Matrix approximieren (sei σ 1σ 2 ):qσ1σ2

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

Wie bestimme ich nun bei einem neuen Vektor , der ein Bild darstellt, das nicht in X ist , die Gewichtung der q Eigenvektoren U , um mein neues Bild y am besten darzustellen ? Ist diese Darstellung bis auf pathologische Fälle einzigartig?yXqUy

Kurz gesagt, ich möchte Folgendes tun (von der Wiki-Seite):

Diese Eigengesichter können nun verwendet werden , sowohl bestehende als auch darzustellen neue Gesichter : Wir können projizieren einen neuen (Mittelwert subtrahiert) Bild auf die Eigengesichter und dadurch aufzuzeichnen , wie das neue Gesicht unterscheidet sich von der mittleren Gesicht.

Wie mache ich diese Projektion?

Süchtig
quelle
1
Zukünftige Leser könnten diese Implementierung wertvoll finden.
Emre

Antworten:

11

Die "Projektion", auf die Bezug genommen wird, ist eine Vektorprojektion . Um die Projektion von Vektor auf Vektor b zu berechnen , verwenden Sie das innere Produkt der beiden Vektoren:einb

einprÖj=ein,bb

in diesem Fall die Vektorkomponente von a , die in der gleichen Richtung wie b liegt . Im euklidischen Raum wird der innere Produktoperator als seinSkalarprodukt definiert:einprÖjeinb

ein,b=einb=ich=1neinichbich

wobei die Anzahl der Komponenten in den Vektoren a und b ist und a i und b i die i- te Komponente der Vektoren a bzw. b sind. Wenn Sie das innere Produkt der beiden Vektoren berechnen, finden Sie intuitiv, wie viel von Vektor a in Richtung von Vektor b geht . Beachten Sie, dass dies eine vorzeichenbehaftete Größe ist. Ein negativer Wert würde bedeuten, dass der Winkel zwischen den beiden Vektoren größer als 90 Grad ist, wie eine alternative Definition für den Projektionsoperator zeigt:neinbeinichbichicheinbeinb

einprÖj=|ein|cos(θ)b

wobei der Winkel zwischen den beiden Vektoren ist.θ

Also, einen Vektor gegeben und eine Reihe von Basisvektoren b i , kann man finden „ wie viel von einer “ in jedem der Richtungen von jedem der Basisvektoren geht. Typischerweise sind diese Basisvektoren alle zueinander orthogonal. In Ihrem Fall ist die SVD eine orthogonale Zerlegung, daher sollte diese Bedingung erfüllt sein. Um das zu erreichen, was Sie beschreiben, nehmen Sie die Matrix der Eigenvektoren U und berechnen das innere Produkt des Kandidatenvektors y mit jeder Spalte der Matrix:einbicheinUy

pich=yuich

Der Skalarwert , den Sie von jedem inneren Produkt erhalten, gibt an, wie gut der Vektor y mit dem i- ten Eigenvektor "ausgerichtet" ist. Da die Eigenvektoren orthonormal sind , können Sie den ursprünglichen Vektor y folgendermaßen rekonstruieren :pichyichy

y=ich=1npichuich

Sie haben gefragt, ob diese Darstellung eindeutig ist. Ich weiß nicht genau, was Sie meinen, aber es ist nicht eindeutig in dem Sinne, dass ein gegebener Vektor durch Projektion auf eine beliebige Anzahl von orthonormalen Basen zerlegt werden könnte. Die in der Matrix U enthaltenen Eigenvektoren sind ein solches Beispiel, Sie können jedoch eine beliebige Anzahl anderer verwenden. Zum Beispiel kann die Berechnung der diskreten Fourier-Transformation von y als Projektion auf eine orthonormale Basis komplexer Exponentialvektoren unterschiedlicher Frequenz angesehen werden.yUy

Jason R
quelle
y
yy