Pergunta

I want to compute a general PCA matrix for a dataset, and I will use it to reduce dimensions of sift descriptors. I have already found some algorithms to compute it, but I couldn't find a way to compute it by using MATLAB.

Can someone help me?

Foi útil?

Solução

[coeff, score] = princomp(X) 

is the right thing to do, but knowing how to use it is a little tricky.


My understanding is that you did something like:

sift_image = sift_fun(img)

which gives you a binary image: sift_feature? (Even if not binary, this still works.)

Inputs, formulating X:

To use princomp/pca formulate X so that each column is a numel(sift_image) x 1 vector
(i.e. sift_image(:))
Do this for all your images and line them up as columns in X.
So X will be numel(sift_image) x num_images.

If your images aren't the same size (e.g. pixel dimensions different, more or less of a scene in the images), then you'll need to bring them into some common space, which is a whole different problem.

Unless your stuff is binary, you'll probably want to de-mean/normalize X, both in the column direction (i.e. normalizing each individual image) and row direction (de-meaning the whole dataset).

Outputs

score is the set of eigen vectors: it will be num_pixels * num_images. To get, say the first eigen vector back into an image shape, do:

first_component = reshape(score(:,1),size(im));

And so on for the rest of the components. There are as many components as input images.

Each row of coeff is the num_images (equal to num_components) set of weights that can be applied to generate each input image. i.e.

input_image_1 = reshape(score * coeff(:,1) , size(original_im));

where input_image_1 is the correct, original shape
coeff(1,:) is a vector (num_images x 1)
score is pixels x num_images
(Disclaimer: I may have the columns/rows mixed up, but the descriptions are correct.)

Does that help?

Outras dicas

If you have access to Statistics Toolbox, you can use the command princomp, or in recent versions the command pca.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top