Pas gambar baru dari perhitungan SVD / PCA

16

Saya mencoba meniru ide-ide dari halaman Eigenface di wikipedia. Dari seratus sampel gambar yang diwakili oleh matriks data X (di mana setiap gambar diratakan ke vektor dengan panjang n , dengan demikian X adalah matriks 100 by n ), saya telah menghitung dekomposisi SVD:

X=UΣVT

karenanya:

XXT=UΣ2UT

Dengan mengambil subset dari eigenmodes terbesar q, saya dapat mendekati matriks (misalkan σ1σ2 ):

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

Sekarang diberikan vektor baru y , yang mewakili gambar tidak di X , bagaimana cara menentukan bobot dari q vektor eigen U untuk terbaik mewakili citra baru saya y ? Kecuali untuk kasus-kasus patologis, apakah representasi ini unik?

Singkatnya, yang ingin saya lakukan adalah ini (dari halaman wiki):

Wajah eigen ini sekarang dapat digunakan untuk mewakili wajah yang ada dan yang baru : kita dapat memproyeksikan gambar baru (dikurangi rata-rata) pada wajah eigen dan dengan demikian merekam bagaimana wajah baru berbeda dari wajah rata-rata.

Bagaimana saya melakukan proyeksi itu?

Doyan
sumber
1
Pembaca yang akan datang mungkin menganggap implementasi ini berharga.
Emre

Jawaban:

11

"Proyeksi" yang dimaksud adalah proyeksi vektor . Untuk menghitung proyeksi vektor ke vektor b , Anda menggunakan produk dalam dari dua vektor:Sebuahb

SebuahhalrHaij=Sebuah,bb

dalam hal ini adalah komponen vektor dari sebuah yang terletak pada arah yang sama b . Dalam ruang Euclidean, operator produk dalam didefinisikan sebagaiproduk titikmereka:SebuahhalrHaijSebuahb

Sebuah,b=Sebuahb=saya=1nSebuahsayabsaya

di mana adalah jumlah komponen dalam vektor a dan b dan a i dan b i adalah sebagai i komponen -th vektor a dan b masing-masing. Secara intuitif, dengan menghitung produk dalam dari dua vektor, Anda menemukan "berapa banyak" vektor a berjalan ke arah vektor b . Perhatikan bahwa ini adalah jumlah yang ditandatangani, jadi nilai negatif akan berarti bahwa sudut antara dua vektor lebih besar dari 90 derajat, seperti yang diilustrasikan oleh definisi alternatif untuk operator proyeksi:nSebuahbSebuahsayabsayasayaSebuahbSebuahb

SebuahhalrHaij=|Sebuah|cos(θ)b

di mana adalah sudut antara dua vektor.θ

Jadi, diberi vektor dan sekelompok basis vektor b i , satu dapat menemukan "berapa banyak yang " berjalan di masing-masing arah dari masing-masing basis vektor. Biasanya, vektor-vektor dasar itu semuanya akan saling orthogonal. Dalam kasus Anda, SVD adalah dekomposisi ortogonal, sehingga kondisi ini harus dipenuhi. Jadi, untuk mencapai apa yang Anda gambarkan, Anda akan mengambil matriks vektor eigen U dan menghitung produk dalam vektor kandidat y dengan masing-masing kolom matriks:SebuahbsayaSebuahUy

halsaya=ykamusaya

Nilai skalar yang Anda dapatkan dari setiap produk dalam menggambarkan seberapa baik vektor y "berbaris" dengan vektor eigen ke- i . Karena vektor eigen adalah ortonormal , Anda dapat merekonstruksi vektor asli y sebagai berikut:halsayaysayay

y=saya=1nhalsayakamusaya

Anda bertanya apakah representasi ini unik; Saya tidak yakin persis apa yang Anda maksudkan, tetapi tidak unik dalam arti bahwa vektor dapat diuraikan dengan proyeksi ke sejumlah basis ortonormal. Vektor eigen yang terkandung dalam matriks U adalah salah satu contohnya, tetapi Anda bisa menggunakan sejumlah lainnya. Misalnya, menghitung diskrit Fourier transform dari y dapat dilihat sebagai memproyeksikan itu ke basis ortonormal dari vektor eksponensial kompleks dari berbagai frekuensi.yUy

Jason R
sumber
y
yy