PCA相信大家都很熟悉,但是苦于网上的代码资料良莠不齐。我在自己写了,并且验证过代码的可行性之后,贴出来给大家分享。有什么问题可以大家交流一下。由于初次使用csdn,公式原理太复杂我就不打了(懒),大家可以自己看资料。实际上看了我的可视化之后,大家也能直观地了解PCA的思想了,直接上代码。
代码如下:
为防止乱码,下面贴入无注释版
|
PCA_test.m X_origin=randn(2000,2); figure(1); scatter(X_origin(:,1),X_origin(:,2),3); X=(X_origin+100*ones(2000,2))*[2 1;1 2]; figure(2); scatter(X(:,1),X(:,2),3); [X_PCA]=PCA_mainfunction(X,1); figure(3); scatter(X_PCA(:,1),X_PCA(:,2),3); |
|
function[X_PCA]=PCA_mainfunction(X,T) n=size(X,1); X_mean=1/n.*(X'*ones(n,1)); H=(eye(n)-(ones(n,n))); S=1/n.*X'*H*X; [V,D]=eig(S); for i=1:size(X,2) V(i)=V(i)/norm(V(i)); end X_PCA=(X-ones(n,1)*X_mean')*V(:,1:T)*V(:,1:T)'; end |
在用于实际任务时,X可直接用实际数据。这里用随机数据只为展示需要。另外,红色部分的*V(:,1:T)'也需要去掉。这个也是为了直观展示而进行的坐标转换,实际工程中不需要。
效果:
(1)原始随机数据(X_origin=randn(2000,2))
经过偏移以及转置后的数据(X=(X_origin+100*ones(2000,2))*[2 1;1 2];)
(2)经过降维后的数据,为直观展现效果用二维图像来表示
(3)如果保留所有的两个维度的话
直观来看,就是投影到了如图所示的两个方向
如果去掉上一幅图的坐标的投影,我们就可以得到这样一幅坐标变换后的散点图。实际上PCA的含义就是特征空间的重构,而这个重构的标准是使得重构后的样本具有最大的方差,直观来说,就是数据要尽量“散”地分布在特征空间里。可以看到,这一幅图是与最原始的随机数据样本是很相像的。当方差大了,样本点在特征空间里的距离也就越大,这很有利于我们对样本进行分类,这也是PCA的另外一个意义。