pca算法的实现

        按照pca的处理步骤,终于用matlab把pca的算法写好了,本来想用C++写的,中间遇到了一个问题:就是在求特征值和特征向量的时候比较麻烦,需要QR迭代算法。自己就投机取巧,matlab里只需要调用一个函数就可以了。想着用matlab把功能实现了先看看效果。

        PCA的处理步骤:

        1,均值化

        2,求协方差矩阵(我知道的有两种方法,这是第一种,按部就班的求,第二种是:(A*A‘/(N-1)))

        3,求协方差的特征值和特征向量

        4,将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵

        5,将样本点投影到选取的特征向量上

matlab实现源代码

%PCA算法,matlab实现
function F=pcad(A,n)%A是M*N
%测试实例A=[2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1;2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]
%结果F=[0.8280,-1.7776,0.9922,0.2742,1.6758,0.9129,-0.0991,-1.1446,-0.4380,-1.2238]
%PCA第一步:均值化
X=A-repmat(mean(A,2),1,size(A,2))%去均值
%PCA第二步:求特征协方差矩阵
B=COV(X')%求协方差
%PCA第三步:求特征协方差矩阵的特征值和特征向量
[v,d]=eig(B)%求特征值和特征向量
%PCA第四步:将特征值按照从大到小的顺序排序
d1=diag(d);%取出对角矩阵,也就是把特征值提出来组成一个新的M*1的d1矩阵
[d2 index]=sort(d1); %特征值以升序排序 d2是排序后的结果 index是数排序以前的排名位置
cols=size(v,2);% 特征向量矩阵的列数
for i=1:cols   %对特征向量做相反位置的调整 是个降序排列。这个过程把特征值和特征向量同时做相应的降序排列
    vsort(:,i) = v(:,index(cols-i+1) ); % vsort 是一个M*col(注:col一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量
    %vsort保存的是协方差矩阵降序后的特征向量,为M*M阶
    dsort(i) = d1(index(cols-i+1));  % dsort 保存的是按降序排列的特征值,是一维行向量,1*M
end  %完成降序排列
M=vsort(:,1:n)%提取主成分量
%PCA第五步:将样本点投影到选取的特征向量上
F=(X'*M)'%最终的投影

运行结果:

>> A=[2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1;2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]

A =

  Columns 1 through 7

    2.5000    0.5000    2.2000    1.9000    3.1000    2.3000    2.0000
    2.4000    0.7000    2.9000    2.2000    3.0000    2.7000    1.6000

  Columns 8 through 10

    1.0000    1.5000    1.1000
    1.1000    1.6000    0.9000

>> F=pcad(A,1)

F =

  Columns 1 through 7

    0.8280   -1.7776    0.9922    0.2742    1.6758    0.9129   -0.0991

  Columns 8 through 10

   -1.1446   -0.4380   -1.2238

>> 

      算法终于写好了,网上查了下别人写的代码,发现最后还要有一步:计算白化矩阵,一直不知道为什么要白化矩阵。看来还是自己了解的太少,算法肯定需要改进。

你可能感兴趣的:(Machine,Learning)