PCA.m
1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
function [eigenvalues, eigenvectors, meanVector, V]=PCA(X,varargin)
%function [eigenvalues, eigenvectors, meanVector, V]=PCA(X)
cnt = 1;
doVar = false;
doEigs = false;
if nargin < 2,
end
while cnt < length(varargin)
switch varargin{cnt}
case 'VarEnergy'
doVar = true;
varPercent = varargin{cnt+1};
case 'nEigs'
doEigs = true;
eigKeep = varargin{cnt+1};
otherwise
fprintf('Error, unknown argument %s\n',varargin{cnt});
return
end
cnt = cnt + 2;
end
[Row Column]=size(X);
%Mean center X
meanVector = mean(X,2); meanVector = meanVector(:);
M=repmat(meanVector,1,Column);
X=X-M;
C=X'*X./Column;
[V,D]=eig(C);
eigenvalues=diag(D);
%Ordered by eigenvalues%
[eigenvalues,Index]=sort(eigenvalues,'descend');
V=V(:,Index) ; %V1 is the the eigenvectors got from X'X;
eigenvectors=X*V;%eigenvectors is the eigenvectors for XX';
%normalize%
NV=sum(eigenvectors.^2);
NV=NV.^(1/2);
%normalize eigenvectors
NM=repmat(NV,Row,1);
eigenvectors=eigenvectors./NM;
if doVar
d = cumsum(eigenvalues)/ sum(eigenvalues);
[a1 a2] = max(d > varPercent);
eigenvalues = eigenvalues(1:a2);
eigenvectors = eigenvectors(:,1:a2);
end
if doEigs
eigenvalues = eigenvalues(1:eigKeep);
eigenvectors = eigenvectors(:,1:eigKeep);
end
%normalize V1;
NN=repmat(NV,[Column,1]);
V=V./NN;
end