1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > matlab PCA(Principal Component Analysis)主成分分析作图 2D|3D带有参数指向 案例

matlab PCA(Principal Component Analysis)主成分分析作图 2D|3D带有参数指向 案例

时间:2019-11-17 17:51:37

相关推荐

matlab PCA(Principal Component Analysis)主成分分析作图 2D|3D带有参数指向 案例

先看看我处理的数据的格式:

第一列是序号,第二列为分类的(数值代号),第一行表头就是具体测得的参数(我这里只做27个参数),所以我的读取范围设定的是3-29列。如果你处理数据的格式和我不一样,在matlab脚本里稍微修改一下读取范围就行了

PCA普通作图:

需要注意的点:

categories:表头(参数)的设定-它的数量和你读取的列数是一样的,否者图中无法显示参数名称。其实表头的属性是cell格式,定义内容时记得是用{},而不是用[];

预处理:我这里使用了标准差进行预处理(避免参数由于分布区间尺度不同对主成分分析照成影响),可以根据自己的需要调整。

%author:foddcus %%这个为仪器handy叶绿素荧光仪定制的2D版本PCA程序%这个版本是五种处理的对比,可以根据自己的需要进行修改%输入:样本的表格数据%输出:PCA数据:%coeff:参数的PCA坐标(第一成分坐标在第一列,以此类推)%mu:对应参数的影响占比 单位%%score:每个样本的PCA坐标数据(第一成分坐标在第一列,以此类推)close allclear all%stdr:数据的标准差categories={'Fo''Fj''Fi''Fm''Fv''Vj''Vi''Fm/Fo''Fv/Fo''Fv/Fm''Mo''Area''Fix Area''HACH Area''Sm''Ss''N''Phi_Po''Psi_o''Phi_Eo''Phi_Do''Phi_Pav''Pi_Abs''ABS/RC''TRo/RC''ETo/RC''DIo/RC'};%categories=char(categories);% 这个为参数头% 每个参数位长要相等%文件序列从上到下进行分类data=xlsread("C:\Users\Desktop\2月PCA.xlsx")%要PCA的excel文件路径data=data(:,1:27);%参数的范围[ynum,xnum]=size(data);%num值对应你每种类别的数量,依照表格从上到下num1=60num2=60num3=60num4=60num5=60stdr =std(data); %计算标准差,计算每一列的标准差averageD=mean(data,1)for i=1:ynumdata2(i,:)=data(i,:)-averageD(1,:);endsr =data2./repmat(stdr,size(data,1),1);%sr是预处理后的数据,使原始数据每个参数除于其标准差%% PCA[coeff1,score1,latent1,tsquare1,explained1,mu1]= pca(data);[coeff2,score2,latent2,tsquare2,explained2,mu2]= pca(sr);%%下面设置使用的数据源:score1为未预处理的数据,score2是预处理后的数据,其他数据一样score=score2;latent=latent2;% 通过latent,可以知道提取前几个主成分就可以了..% 通过看图可以看出前七个主成分可以表示出原始数据的90%.% 所以在90%的意义下只需提取前七个主成分即可,进而达到主成分提取的目的.% figure;percent_explained= 100*latent/sum(latent); %cumsum(latent)./sum(latent)pareto(percent_explained);xlabel('PrincipalComponent');ylabel('VarianceExplained (%)');%% Visualizing theResults% 横坐标和纵坐标分别表示第一主成分和第二主成分figure;hold onscatter(score(1:num1,1),score(1:num1,2),'k','filled')hold on;scatter(score(num1+1:num1+num2,1),score(num1+1:num1+num2,2),'g','filled')hold on;scatter(score(num1+num2+1:num1+num2+num3,1),score(num1+num2+1:num1+num2+num3,2),'r','filled')hold onscatter(score(num1+num2+num3+1:num1+num2+num3+num4+1,1),score(num1+num2+num3+1:num1+num2+num3+num4+1,2),'b','filled')hold on;scatter(score(num1+num2+num3+num4+1:end,1),score(num1+num2+num3+num4+1:end,2),'m','filled')hold onbiplot(coeff2(:,1:2)*50,'varlabels',categories);%这个显示成分位置legend('normal','X','F','M','H');%你的种类(处理)名称xlabel('Component (1)','FontSize',11,'fontname','Arial');ylabel('Component (2)','FontSize',11,'fontname','Arial');%这里修改你需要的标题set(gca,'FontSize',12,'fontname','Arial'); %设置坐标系set(gca,'tickdir','out')

输出图像:

PCA的3D作图:

与2DPCA基本一致,主要运用了scatter3这个函数

%author:foddcus Fafu %这个版本是五种处理的对比,可以根据自己的需要进行修改%输入:样本的表格数据%输出:PCA数据:%coeff:参数的PCA坐标(第一成分坐标在第一列,以此类推)%mu:对应参数的影响占比 单位%%score:每个样本的PCA坐标数据(第一成分坐标在第一列,以此类推)close allclear all%stdr:数据的标准差categories={'Fo''Fj''Fi''Fm''Fv''Vj''Vi''Fm/Fo''Fv/Fo''Fv/Fm''Mo''Area''Fix Area''HACH Area''Sm''Ss''N''Phi_Po''Psi_o''Phi_Eo''Phi_Do''Phi_Pav''Pi_Abs''ABS/RC''TRo/RC''ETo/RC''DIo/RC'};%categories=char(categories);% 这个为参数头% 每个参数位长要相等%文件序列从上到下进行分类data=xlsread("C:\Users\Desktop\2月PCA.xlsx")%要PCA的excel文件路径data=data(:,3:27);%参数的范围[ynum,xnum]=size(data);%num值对应你每种类别的数量,依照表格从上到下num1=60num2=60num3=60num4=60num5=60stdr =std(data); %计算标准差,计算每一列的标准差averageD=mean(data,1)for i=1:ynumdata2(i,:)=data(i,:)-averageD(1,:);endsr =data2./repmat(stdr,size(data,1),1);%sr是预处理后的数据,使原始数据每个参数除于其标准差%% PCA[coeff1,score1,latent1,tsquare1,explained1,mu1]= pca(data);[coeff2,score2,latent2,tsquare2,explained2,mu2]= pca(sr);%%下面设置使用的数据源:score1为未预处理的数据,score2是预处理后的数据,其他数据一样score=score2;latent=latent2;% 通过看图可以看出前七个主成分可以表示出原始数据的90%.% 所以在90%的意义下只需提取前七个主成分即可,进而达到主成分提取的目的.% figure;percent_explained= 100*latent/sum(latent); %cumsum(latent)./sum(latent)pareto(percent_explained);xlabel('PrincipalComponent');ylabel('VarianceExplained (%)');%% Visualizing the Results% 横坐标和纵坐标分别表示第一主成分和第二主成分,z坐标为第三主成分figure;hold onscatter3(score(1:num1,1),score(1:num1,2),score(1:num1,3),'k','filled')hold on;scatter3(score(num1+1:num1+num2,1),score(num1+1:num1+num2,2),score(num1+1:num1+num2,3),'g','filled')hold on;scatter3(score(num1+num2+1:num1+num2+num3,1),score(num1+num2+1:num1+num2+num3,2),score(num1+num2+1:num1+num2+num3,3),'r','filled')hold onscatter3(score(num1+num2+num3+1:num1+num2+num3+num4+1,1),score(num1+num2+num3+1:num1+num2+num3+num4+1,2),score(num1+num2+num3+1:num1+num2+num3+num4+1,3),'b','filled')hold on;scatter3(score(num1+num2+num3+num4+1:end,1),score(num1+num2+num3+num4+1:end,2),score(num1+num2+num3+num4+1:end,3),'m','filled')hold onbiplot(coeff2(:,1:3)*50,'varlabels',categories);%这个显示成分方向legend('normal','X','F','M','H');%你的种类(处理)名称xlabel('Component (1)','FontSize',11,'fontname','Arial');ylabel('Component (2)','FontSize',11,'fontname','Arial');zlabel('Component (3)','FontSize',11,'fontname','Arial')%这里修改你需要的标题%颜色代号注释% 红r% 绿g% 蓝b% 青绿c% 洋红m% 黄y% 黑k% 白w

输出作图:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。