上一篇文章主要写了主成分分析的原理,现在通过matlab实现其功能。
主成分分析的实现步骤如下。
1 .输入样例矩阵
假定样本x1、x2、xN,总共n个样本,每个样本被表示为列向量,每个样本有m维。
X=[x1x2. xN]MxN。
2 .计算样本中一维的均值,计算观察值与均值的偏差,计算协方差矩阵
基于协方差函数
首先,求出每一维的平均值,然后计算观察值和平均值的偏差,计算协方差矩阵
3 .计算协方差矩阵的特征值和特征向量矩阵
根据协方差矩阵求出特征值和特征值,可以按降序对特征值进行排序,相应地
还应当根据特征值的秩来调整特征向量,这主要是提取下一步骤的少量特征
值得准备。
4 .计算总能量,选取贡献率最大的特征值
总能量的计算是所有特征值的和,贡献率是使用前p个特征值去除所有特征值
和如果前面p个特征值之和为全部特征值之和的90%以上,则提取前面的p个特征值和前面的p个特征值
与特征值对应的特征向量。 这将减少维数。
5 .计算前p个特征值对应的本征向量组成的矩阵,计算降维样本矩阵
根据前一步得到的新特征向量,用原协方差矩阵乘以由该新特征向量组成的新矩阵,
得到降维的样本矩阵
打开30行8列数据的txt文件
%%
第一步:输入样品矩阵
filename='src.txt ';
FID=fopen(filename,' r ' );
vector=FSCANF(FID,“%g”,[ 30,8 ] ); 输入具有%8维30个样本的矩阵
%将此减少pca维度
%%
(步骤2 )计算样本中各维的平均值,计算观察值和平均值的偏差,计算协方差矩阵
s=sum(vector,1 ); %计算各列的平均值
[nSmp,nfea]=size(vector );
vector=vector-repmat (mean (vector ),nSmp,1 ); 将每个%一维的平均值复制到nSmp*nFea矩阵,并计算偏差
w=Zeros(nFea,NFEA ); 创建nFea*nFea的零矩阵
W=W vector'*vector;
w=w/(nsmp-1 ); 根据%协方差公式计算协方差,得到协方差矩阵w
%%
(步骤3 )计算协方差矩阵的特征值和特征值向量矩阵
fprintf(1,' calculatinggeneralizedeigenvectorsandeigenvalues .n ' );
[eigvectors,EIGvalues]=EIG(w ); %eigvectors是由特征向量构成的矩阵,是由eigvalues特征值构成的对角矩阵
frintf(1,' sortingeigenvectorsaccordingtoeigenvalues .n ';
D1=Diag(Eigvalues ); %返回对角矩阵的值
[D2index]=sort(D1 ); %是升序,d2是数组后的值,索引是索引值
cols=size(Eigvectors,2 ); %特征向量矩阵的列数
for i=1:cols
vsort(3360,I )=EIG vectors (:index ) cols-I1 ); % vsort为M*col (注:col一般为m )阶矩阵,保存按降序排列的特征向量,按列构成特征向量
dsort(I )=D1 ) index ) cols-I1 ); % dsort保持按降序排列的特征值,是1维的行向量
end %降序排序完成
%%
(步骤4 )计算总能量,选择贡献率最大的特征值
dsum=sum(dsort; %合计所有特征值
dsum_extract=0; 求%前几个特征值之和,如果当前几个特征值之和大于90%,则认为这些特征值可以表示当前矩阵
p=0;
while(dsum_extract/dsum0.9 )。
p=p 1;
dum_extract=sum(dsort(1:p ) );
结束
p=5时,贡献率为0.9095,因此可以选择5个特征值表示当前矩阵
%%
(步骤5 )计算与最初的p个特征值相对应的由特征值构成的矩阵,计算降维的样本矩阵
vsort=vsort(3360、1:p ); %提取前的p个特征生成8*p矩阵
frintf(1,' featureextractionandcalculatingnewdata .n ' );
newvector=vector*vsort; 生成nSmp行p列的矩阵,达到降维效果