function [V,S,E]=princa(X) [m,n]=size(X); %计算矩阵的行m和列n %-------------第一步:标准化矩阵-----------------% mv=mean(X); %计算各变量的均值 st=std(X); %计算各变量的标准差 X=(X-repmat(mv,m,1))./repmat(st,m,1); %标准化矩阵X %-------------第二步:计算相关系数矩阵-----------------% % R1=X‘*X/(m-1); %方法一:协方差矩阵计算公式 % R2=cov(X); %方法二:协方差矩阵计算函数 R=corrcoef(X); %方法三:相关系数矩阵函数 %-------------第三步:计算特征向量和特征值-----------------% [V,D]=eig(R); %计算矩阵R的特征向量矩阵V和特征值矩阵D,特征值由小到大 V=(rot90(V))‘; %将特征向量矩阵V从大到小排序 D=rot90(rot90(D)); %将特征值矩阵由大到小排序 E=diag(D); %将特征值矩阵转换为特征值向量 %-------------第四步:计算贡献率和累计贡献率-----------------% ratio=0; %累计贡献率 for k=1:n r=E(k)/sum(E); %第k主成份贡献率 ratio=ratio+r; %累计贡献率 if(ratio>=0.9) %取累计贡献率大于等于90%的主成分 break; end end %-------------第五步:计算得分-----------------% S=X*V;
如果要求主成分分析,用matlab自带一个的函数(princomp)就行。Princomp调用如下:
[COEFF,SCORE,latent,tsquare] = princomp(zscore(X))
zscore(X)是对矩阵X进行标准化操作。
COEFF是X矩阵所对应的协方差阵的所有特征向量组成的矩阵,即变换矩阵或称投影矩阵,每列对应一个特征值的特征向量,列的排列顺序是按特征值的大小递减排序
相当于上面程序中的V,它表示的是主成分的系数。
SCORE是对主成分的打分,也就是说原X矩阵在主成分空间的表示。每行对应样本观测值,每列对应一个主成份(变量),它的行和列的数目和X的行列数目相同。(相当于上面程序中的S)
latent是一个向量,它是X所对应的协方差矩阵的特征值向量。 (相当于程序中的E)
特征值与分数之间的关系:latent=diag(cov(SCORE));
tsquare是表示对每个样本点Hotelling的T方统计量
计算PCA的时候,如果直接有现成的协方差阵,用函数pcacov来计算。
时间: 2024-12-24 07:52:30