Adaptation de nouvelles images à partir d'un calcul SVD / PCA

16

J'essaie de reproduire les idées de la page Eigenface sur wikipedia. A partir d'une centaine d'échantillons d'images représentés par une matrice de données (où chaque image aplatie en un vecteur de longueur , donc est une matrice par ), j'ai calculé une décomposition SVD:XnX100n

X=UΣVT

Par conséquent:

XXT=UΣ2UT

En prenant un sous-ensemble des plus grands modes propres , je peux approximer la matrice (soit ):qσ1σ2

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

Maintenant, étant donné un nouveau vecteur , qui représente une image qui n'est pas dans , comment puis-je déterminer la pondération des vecteurs propres pour représenter au mieux ma nouvelle image ? À l'exception des cas pathologiques, cette représentation est-elle unique?yXqUy

En bref, ce que j'aimerais faire, c'est ceci (à partir de la page wiki):

Ces faces propres peuvent maintenant être utilisées pour représenter à la fois les faces existantes et nouvelles : nous pouvons projeter une nouvelle image (moyenne soustraite) sur les faces propres et ainsi enregistrer en quoi cette nouvelle face diffère de la face moyenne.

Comment faire cette projection?

Accroché
la source
1
Les futurs lecteurs pourraient trouver cette implémentation utile.
Emre

Réponses:

11

La "projection" à laquelle il est fait référence est une projection vectorielle . Pour calculer la projection du vecteur sur le vecteur b , vous utilisez le produit interne des deux vecteurs:ab

aproj=a,bb

dans ce cas est la composante vectorielle de a qui se trouve dans la même direction que b . Dans l'espace euclidien, l'opérateur de produit interne est défini comme leurproduit scalaire:aprojab

a,b=ab=i=1naibi

est le nombre de composants dans les vecteurs a et b et a i et b i sont respectivement le i- ème composant des vecteurs a et b . Intuitivement, en calculant le produit intérieur des deux vecteurs, vous trouvez "combien de" vecteur a va dans la direction du vecteur b . Notez qu'il s'agit d'une quantité signée, donc une valeur négative signifierait que l'angle entre les deux vecteurs est supérieur à 90 degrés, comme illustré par une autre définition pour l'opérateur de projection:nabaibiiabab

aproj=|a|cos(θ)b

est l'angle entre les deux vecteurs.θ

Donc, étant donné un vecteur et un tas de vecteurs de base b i , on peut trouver "combien de a " va dans chacune des directions de chacun des vecteurs de base. Typiquement, ces vecteurs de base seront tous mutuellement orthogonaux. Dans votre cas, la SVD est une décomposition orthogonale, donc cette condition doit être remplie. Donc, pour accomplir ce que vous décrivez, vous devez prendre la matrice des vecteurs propres U et calculer le produit interne du vecteur candidat y avec chacune des colonnes de la matrice:abiaUy

pi=yui

La valeur scalaire que vous obtenez de chaque produit intérieur représente la façon dont le vecteur y "s'est aligné" avec le i- ème vecteur propre. Étant donné que les vecteurs propres sont orthonormés , vous pouvez alors reconstruire le vecteur d'origine y comme suit:piyiy

y=i=1npiui

Vous avez demandé si cette représentation est unique; Je ne sais pas exactement ce que vous voulez dire, mais ce n'est pas unique dans le sens où un vecteur donné pourrait être décomposé par projection sur n'importe quel nombre de bases orthonormales. Les vecteurs propres contenus dans la matrice U en sont un exemple, mais vous pouvez en utiliser plusieurs autres. Par exemple, le calcul de la transformée de Fourier discrète de y peut être considéré comme la projetant sur une base orthonormée de vecteurs exponentiels complexes de fréquence variable.yUy

Jason R
la source
Grande réponse merci! Par "unique", je voulais dire unique au sens de la base donnée par le SVD. Je suppose que, étant donné une base orthonormée, alors le vous calculez doit être unique - mais si la base n'est pas orthonormée, ce n'est peut-être pas le cas (car s'ils n'étaient pas orthogonaux, nous pourrions trouver un ensemble de bases plus petit)? y
accroché
Vous ne savez toujours pas où vous en êtes. est le vecteur vers lequel vous avez distillé votre nouvelle image, il est donc aussi unique que l'image d'origine et le processus que vous utilisez pour déterminer le vecteur correspondant. Une base d'espace vectoriel par définition est constituée de vecteurs linéairement indépendants, ce qui force la propriété de l'orthogonalité mutuelle. Vous notez correctement que si vous projetez y sur un ensemble de vecteurs non orthogonaux, vous pourriez éventuellement arriver à une représentation plus compacte si l'espace couvert par les vecteurs avait une dimensionnalité sous-jacente moindre (une base plus petite). yy
Jason R