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

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

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

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

PCA普通作图:

需要注意的点:

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')

输出图像:

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

PCA的3D作图:

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

%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

输出作图:

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

你可能感兴趣的:(试验数据分析,数学建模,机器学习,matlab,数据分析,机器学习)