[Numpy-discussion] confusion about eigenvector
Sat Mar 1 11:50:48 CST 2008
On Sat, Mar 1, 2008 at 8:27 AM, firstname.lastname@example.org <email@example.com> wrote:
> > This example assumes that facearray is an ndarray.(like you described
> > in original post ;-) ) It looks like you are using a matrix.
> hi Arnar
> thanks ..
> a few doubts however
> 1.when i use say 10 images of 4X3 each
> u, s, vt = linalg.svd(facearray, 0)
> i will get vt of shape (10,12)
> can't i take this as facespace?
Yes, you may
> why do i need to get the transpose?
You dont need to. I did because then it would put the eigenvectors
that span your column space as columns of the facespace array. I
figured that would be easier for you, as that would be compatible with
the use of eig (eigh) and matlab
> then i can take as eigface_image0= vt.reshape(imgwdth,imght)
> 2.this way (svd) is diff from covariance matrix method.
No it is not. You may be fooled by the scaling though. I see from the
post above, that there may be some confusion here about svd and eig on
a crossproduct matrix :-)
Essentially, if X is a column centered array of size (num_images, num_pixels):
u, s, vt = linalg.svd(X),
Then, the columns of u span the space of dot(X, X.T), the rows of vt
span the space of dot(X.T, X) and s is a vector of scaling
coefficients. Another way of seeing this is that u spans the column
space of X, and vt spans the row space of X. So, for a third view, the
columns of u are the eigenvectors of dot(X, X.T) and the rows of vt
contains the eigenvectors of dot(X.T, X).
Now, in your, `covariance method` you use eigh(dot(X, X.T)), where the
eigenvectors would be exactly the same as u(the array) from an svd on
X. In order to recover the facespace you use facespace=dot(X.T, u).
This facespace is the same as s*vt.T, where s and vt are from the svd.
In my example, the eigenvectors spanning the column space were scaled.
I called this for scores: (u*s)
In your computation the facespace gets scaled implicit. Where to put
the scale is different from application to application and has no
I dont know if this made anything any clearer. However, a simple
example may be clearer:
# X is (a ndarray, *not* matrix) column centered with vectorized images in rows
# method 1:
XX = dot(X, X.T)
s, u = linalg.eigh(XX)
reorder = s.argsort()[::-1]
facespace = dot(X.T, u[:,reorder])
# method 2:
u, s, vt = svd(X, 0)
facespace2 = s*vt.T
This gives identical result.
Please remember that eigenvector signs are arbitrary when comparing.
> if i am to do
> it using the later ,how can i get the eigenface image data?
Just like I described before
More information about the Numpy-discussion