PCA 是常用的数据降维方法,关于其数学原理,没有那一篇讲的比这个更好了:
http://blog.codinglabs.org/articles/pca-tutorial.html
在此感谢作者写如此详尽的教程!
纸上得来终觉浅,绝知此事要躬行!用MATLAB写了几行程序,体验PCA的原理,参悟数学之奥妙!
function PCATest()
[X,N,M,u] =DataGen(8,10,4);
% X=[-1 -1 0 2 0;-2 0 0 1 1] %教程上的例子
% N=2;M=5;
fprintf('协方差矩阵:\n')
C=1/M.*X*X.' %得到协方差矩阵
fprintf('协方差矩阵的特征值及特征向量:\n')
[p,v]=eig(C);
%generate P normalizated:
lambda=v*ones(N,1); %#ok<NASGU>
abs_column=sqrt(sum(p.^2,1));
t=repmat(abs_column,[N,1]);
p=t.*p;
p=p.';
y=norm(p(1,:),2)
fprintf('X 被降维后:')
X_reducation=p*X %#ok<NASGU> %there are zeros vector of N-p rows
end
function [X,N,M,p]=DataGen(N,M,p)
%IN:
% N:数据维数
% M:数据数目
% p:无关列数目
%OUT
%return X: a column in X represent a record.
F=rand(p,M); %使用随机数生成p行线性无关的向量,每一列表示一条记录
fi=zeros(N-p,M);%剩余的N-p行随机由线性无关属性组合得来
for i=1:N-p
x=rand(p,1); %生成组合系数
xx=repmat(x,[1,M]);
fi(i,:)=sum( xx.*F,1);% 线性组合出一行来
end
X=[F;fi];
X=X- repmat(mean(X,2),[1,M]);%处理均值
end