PCA-MATLAB 实现

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值