Domanda

I used the following code to compute PCA :

    function [signals,PC,V] = pca2(data) 
    [M,N] = size(data); 
    % subtract off the mean for each dimension 
    mn = mean(data,2); 
    data = data - repmat(mn,1,N); 
    % construct the matrix Y 
    Y = data’ / sqrt(N-1); 
    % SVD does it all 
    [u,S,PC] = svd(Y); 
    % calculate the variances 
    S = diag(S); 
    V = S .* S; 
    % project the original data 
    signals = PC’ * data;

I want to keep the principal components with the maximum variance , say maybe the first 10 principal components which contribute to the maximum variance. How do i go about this?

È stato utile?

Soluzione

function [signals,V] = pca2(data) 
    [M,N] = size(data); 
    data = reshape(data, M*N,1);
    % subtract off the mean for each dimension 
    mn = mean(data,2); 
    data = bsxfun(@minus, data, mean(data,1));     
    % construct the matrix Y 
    Y = data'*data / (M*N-1); 
    [V D] = eigs(Y, 10);   % reduce to 10 dimension
    % project the original data 
    signals = data * V;

Altri suggerimenti

I guess svds can do the job for you.

In the doc, it says:

s = svds(A,k) computes the k largest singular values and associated singular vectors of matrix A.

Which is essentially the k largest eigenvalues and eigenvectors. These are sorted by eigenvalues in descending order.

So for 10 principal components, just use [eigvec eigval] = svds(Y, 10);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top