首页 > 编程知识 正文

pca算法对数据的要求,pca算法出现负值

时间:2023-05-06 08:47:28 阅读:167236 作者:2146

上一篇文章主要写了主成分分析的原理,现在通过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列的矩阵,达到降维效果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。