先看看我处理的数据的格式:
第一列是序号,第二列为分类的(数值代号),第一行表头就是具体测得的参数(我这里只做27个参数),所以我的读取范围设定的是3-29列。如果你处理数据的格式和我不一样,在matlab脚本里稍微修改一下读取范围就行了
需要注意的点:
categories:表头(参数)的设定-它的数量和你读取的列数是一样的,否者图中无法显示参数名称。其实表头的属性是cell格式,定义内容时记得是用{},而不是用[];
预处理:我这里使用了标准差进行预处理(避免参数由于分布区间尺度不同对主成分分析照成影响),可以根据自己的需要调整。
%author:foddcus
%%这个为仪器handy叶绿素荧光仪定制的2D版本PCA程序
%这个版本是五种处理的对比,可以根据自己的需要进行修改
%输入:样本的表格数据
%输出:PCA数据:
%coeff:参数的PCA坐标(第一成分坐标在第一列,以此类推)
%mu:对应参数的影响占比 单位%
%score:每个样本的PCA坐标数据(第一成分坐标在第一列,以此类推)
close all
clear 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=60
num2=60
num3=60
num4=60
num5=60
stdr =std(data); %计算标准差,计算每一列的标准差
averageD=mean(data,1)
for i=1:ynum
data2(i,:)=data(i,:)-averageD(1,:);
end
sr =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 on
scatter(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 on
scatter(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 on
biplot(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')
%author:foddcus Fafu
%这个版本是五种处理的对比,可以根据自己的需要进行修改
%输入:样本的表格数据
%输出:PCA数据:
%coeff:参数的PCA坐标(第一成分坐标在第一列,以此类推)
%mu:对应参数的影响占比 单位%
%score:每个样本的PCA坐标数据(第一成分坐标在第一列,以此类推)
close all
clear 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=60
num2=60
num3=60
num4=60
num5=60
stdr =std(data); %计算标准差,计算每一列的标准差
averageD=mean(data,1)
for i=1:ynum
data2(i,:)=data(i,:)-averageD(1,:);
end
sr =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 on
scatter3(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 on
scatter3(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 on
biplot(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
输出作图: