[Numpy-discussion] confusion about eigenvector
Arnar Flatberg
arnar.flatberg at gmail.com
Thu Feb 28 08:37:00 EST 2008
On Thu, Feb 28, 2008 at 8:17 AM, devnew at gmail.com <devnew at gmail.com> wrote:
> i all
> I am learning PCA method by reading up Turk&Petland papers etc
> while trying out PCA on a set of greyscale images using python, and
> numpy I tried to create eigenvectors and facespace.
>
> i have
> facesarray--- an NXP numpy.ndarray that contains data of images
> N=numof images,P=pixels in an image
> avgarray --1XP array containing avg value for each pixel
> adjustedfaces=facesarray-avgarray
> adjustedmatrix=matrix(adjustedfaces)
> adjustedmatrix_trans=adjustedmatrix.transpose()
> covariancematrix =adjustedmatrix*adjustedmatrix_trans
> evalues,evect=eigh(covariancematrix)
>
> after sorting such that most significant eigenvectors are selected.
> evectmatrix is now my eigenvectors matrix
>
> here is a sample using 4X3 greyscale images
>
> evalues
> [ -1.85852801e-13 6.31143639e+02 3.31182765e+03 5.29077871e+03]
> evect
> [[ 0.5 -0.06727772 0.6496399 -0.56871936]
> [ 0.5 -0.77317718 -0.37697426 0.10043632]
> [ 0.5 0.27108233 0.31014514 0.76179023]
> [ 0.5 0.56937257 -0.58281078 -0.29350719]]
>
> evectmatrix (sorted according to largest evalue first)
> [[-0.56871936 0.6496399 -0.06727772 0.5 ]
> [ 0.10043632 -0.37697426 -0.77317718 0.5 ]
> [ 0.76179023 0.31014514 0.27108233 0.5 ]
> [-0.29350719 -0.58281078 0.56937257 0.5 ]]
>
> then i can create facespace by
> facespace=evectmat*adjustedfaces
>
> till now i 've been following the steps as mentioned in the PCA
> tutorial(by Lindsay smith & others)
> what i want to know is that in the above evectmatrix is each row
> ([-0.56871936 0.6496399 -0.06727772 0.5 ] etc) an eigenvector?
> or does a column in the above matrix represent an eigenvector?
The eigenvectors are in columns. To ensure yourself, look at the last
constant column (of 0.5's) corresponding to the zero-eigenvalue. This
id due to the initial column centering.
> to put it differently,
> should i represent an eigenvector by
> evectmatrix[i] or by
> (get_column_i_of(evectmatrix)).transpose()
>
> if someone can make this clear please do
> D
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>
BTW:
If your data is not extreme these simple steps would also result in
what you want (Not tested):
-------------
from scipy import linalg
facearray-=facearray.mean(0) #mean centering
u, s, vt = linalg.svd(facearray, 0)
scores = u*s
facespace = vt.T
# reconstruction: facearray ~= dot(scores, facespace.T)
explained_variance = 100*s.cumsum()/s.sum()
# here is how to reconstruct an `eigen-image` from the first component
# You may want to ensure this as it depends on how you created the facearray
face_image0 = facespace[:,0].reshape(4,3)
-----------
In case you have a large dataset (many pixels *and* many images) you
may look into using the arpack eigensolver for efficiency (located in
scikits and appearing in the upcomming release of scipy, 0.7)
Arnar
More information about the NumPy-Discussion
mailing list