Ajustando novas imagens a partir de um cálculo SVD / PCA

16

Estou tentando replicar as idéias da página Eigenface na wikipedia. De centenas de imagens de amostra representadas por uma matriz de dados (onde cada imagem é achatada para um vetor de comprimento n , portanto X é uma matriz de 100 por n ), calculei uma decomposição SVD:XnX100n

X=UΣVT

conseqüentemente:

XXT=UΣ2UT

Ao pegar um subconjunto dos maiores modos próprios, posso aproximar a matriz (deixe σ 1σ 2 ):qσ1σ2

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

Agora, dado um novo vetor , que representa uma imagem que não está em X , como determino a ponderação dos q autovetores U para melhor representar minha nova imagem y ? Exceto nos casos patológicos, essa representação é única?yXqUy

Em resumo, o que eu gostaria de fazer é isso (na página da wiki):

Esses autofaces agora podem ser usadas para representar faces novas e existentes : podemos projetar uma nova imagem (subtraída pela média) nas autofaces e, assim, registrar como essa nova face difere da face média.

Como faço essa projeção?

Hooked
fonte
1
Os futuros leitores podem achar essa implementação valiosa.
Emre

Respostas:

11

A "projeção" a que se refere é uma projeção vetorial . Para calcular a projeção do vetor no vetor b , use o produto interno dos dois vetores:ab

aproj=a,bb

, nesse caso, é o componente vetorial de a que se encontra na mesma direção de b . No espaço euclidiano, o operador interno do produto é definido como seuproduto escalar:aprojab

a,b=ab=i=1naibi

onde é o número de componentes nos vectores de um e B e um i e b i são o i componente -ésimo de vectores de um e b , respectivamente. Intuitivamente, calculando o produto interno dos dois vetores, você encontra "quanto de" o vetor a vai na direção do vetor b . Observe que essa é uma quantidade assinada; portanto, um valor negativo significaria que o ângulo entre os dois vetores é maior que 90 graus, conforme ilustrado por uma definição alternativa para o operador de projeção:nabaibiiabab

aproj=|a|cos(θ)b

onde é o ângulo entre os dois vetores.θ

Assim, dado um vetor e um conjunto de vetores de base b i , pode-se encontrar "quanto de a " vai em cada uma das direções de cada um dos vetores de base. Normalmente, esses vetores de base serão todos mutuamente ortogonais. No seu caso, o SVD é uma decomposição ortogonal, portanto, essa condição deve ser satisfeita. Portanto, para realizar o que você descreve, você deve pegar a matriz dos vetores próprios U e calcular o produto interno do vetor candidato y com cada uma das colunas da matriz:abiaUy

pi=yui

O valor escalar que você recebe de cada produto interno representa o quão bem o vector y "alinhados" com o i -ésimo eigenvector. Como os autovetores são ortonormais , você pode reconstruir o vetor original y da seguinte maneira:piyiy

y=i=1npiui

Você perguntou se essa representação é única; Não sei exatamente o que você quer dizer, mas não é exclusivo no sentido de que um determinado vetor possa ser decomposto por projeção em qualquer número de bases ortonormais. Os vetores próprios contidos na matriz U são um exemplo, mas você pode usar qualquer número de outros. Por exemplo, calcular a transformada de Fourier discreta de y pode ser vista como projetando-a em uma base ortonormal de vetores exponenciais complexos de frequência variável.yUy

Jason R
fonte
y
yy