matlab 趋势面分析 记录

1. 利用matlab进行趋势面分析并绘图

%% 方法1 仅二次趋势面模型

clc;clear;

num = xlsread("G:\Data\灾损曲线\趋势面分析-数据.xlsx",'B21:N37');

volume = num(:,1);

magnitude = num(:,3);

pop = num(:,8);

gdp = num(:,13);

% 绘制三维散点图

scatter3(volume, magnitude, gdp,'filled')

hold on;

% 估计模型,得到估计参数

v2 = volume.^2;

m2 = magnitude.^2;

vm = volume.*magnitude;

X = [ones(length(volume),1) volume magnitude v2 vm m2];

[b,bint,r,rint,stats] = regress(gdp,X,95);

% 生成格点经纬度,计算预测值

xfit = min(volume):0.1:max(volume);

yfit = min(magnitude):0.1:max(magnitude);

[XFIT,YFIT]= meshgrid (xfit,yfit);

ZFIT = b(1) + b(2) * XFIT + b(3) * YFIT + b(4) * XFIT.^2 + b(5) * XFIT .* YFIT + b(6) * YFIT.^2;

% 绘制拟合曲面

mesh(XFIT,YFIT,ZFIT);

clc;clear;
num = xlsread("G:\Data\灾损曲线\趋势面分析-数据.xlsx",'B21:N37');
volume = num(:,1);
magnitude = num(:,3);
pop = num(:,8);
gdp = num(:,13);

% 绘制三维散点图
scatter3(volume, magnitude, gdp,'filled')
hold on;
% 估计模型,得到估计参数
v2 = volume.^2;
m2 = magnitude.^2;
vm = volume.*magnitude;
X = [ones(length(volume),1) volume magnitude v2 vm m2];
[b,bint,r,rint,stats] = regress(gdp,X,95);
% 生成格点经纬度,计算预测值
xfit = min(volume):0.1:max(volume);
yfit = min(magnitude):0.1:max(magnitude);
[XFIT,YFIT]= meshgrid (xfit,yfit);
ZFIT = b(1) + b(2) * XFIT + b(3) * YFIT  + b(4) * XFIT.^2 + b(5) * XFIT .* YFIT + b(6) * YFIT.^2;
% 绘制拟合曲面
mesh(XFIT,YFIT,ZFIT);

%% 方法2  一次、二次及三次趋势面模型

% 文件信息读入

clc;clear;

num = xlsread("G:\Data\灾损曲线\趋势面分析-数据.xlsx",'B21:N37');

volume = num(:,1);

magnitude = num(:,3);

pop = num(:,8);

gdp = num(:,13);

opoX=num(:,1);

opoY=num(:,3);

oPH=num(:,13);

% oOM=info(:,4);

% oTN=info(:,5);

%{

% 2S法计算异常值

mPH=mean(oPH);

sPH=std(oPH);

num2=find(oPH>(mPH+2*sPH)|oPH<(mPH-2*sPH));

% 异常值剔除

PH=oPH;

for i=1:length(num2)

n=num2(i,1);

PH(n,:)=[0];

end

PH(all(PH==0,2),:)=[];

poX=opoX;

for i=1:length(num2)

n=num2(i,1);

poX(n,:)=[0];

end

poX(all(poX==0,2),:)=[];

poY=opoY;

for i=1:length(num2)

n=num2(i,1);

poY(n,:)=[0];

end

poY(all(poY==0,2),:)=[];

%}

cpoX = opoX;

cpoY = opoY;

cPH = oPH;

% 最小二乘法求解预处理

inva1=[ones(size(cpoX)),cpoX,cpoY]; %一次拟合求解

inva2=[ones(size(cpoX)),cpoX.^2,cpoY.^2,cpoX.*cpoY,cpoX,cpoY]; % 二次拟合求解

inva3=[ones(size(cpoX)),cpoX.^3,cpoY.^3,(cpoX.^2).*cpoY,cpoX.*(cpoY.^2),cpoX.^2,cpoY.^2,cpoX.*cpoY,cpoX,cpoY]; % 三次拟合求解

% 最小二乘法求解

[coef1,bint1,r1,rint1,stats1]=regress(cPH,inva1);

[coef2,bint2,r2,rint2,stats2]=regress(cPH,inva2);

[coef3,bint3,r3,rint3,stats3]=regress(cPH,inva3);

% 趋势面法效果图绘制准备

npoX=min(cpoX):0.1:max(cpoX);

npoY=min(cpoY):0.1:max(cpoY);

[mnpX,mnpY]=meshgrid(npoX,npoY);

% 趋势面法插值

pPH1=coef1(1,:)+coef1(2,:)*mnpX+coef1(3,:)*mnpY;

pPH2=coef2(1,:)+coef2(2,:)*mnpX.^2+coef2(3,:)*mnpY.^2+coef2(4,:)*mnpX.*mnpY+coef2(5,:)*mnpX+coef2(6,:)*mnpY;

pPH3=coef3(1,:)+coef3(2,:)*mnpX.^3+coef3(3,:)*mnpY.^3+coef3(4,:)*(mnpX.^2).*mnpY+coef3(5,:)*mnpX.*(mnpY.^2)+coef3(6,:)*mnpX.^2+coef3(7,:)*mnpY.^2+coef3(8,:)*mnpX.*mnpY+coef3(9,:)*mnpX+coef3(10,:)*mnpY;

% 趋势面法效果图绘制

figure();

subplot(1,3,1);

scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');

hold on;

mesh(mnpX,mnpY,pPH1);

colormap(jet);

colorbar;

xlabel('暴雨量(mm)'); % 为X轴加标签

ylabel('暴雨强度(mm/d)'); % 为Y轴加标签

zlabel('直接经济损失(亿元)'); % 为z轴加标签

title('一次趋势面模型');

subplot(1,3,2);

scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');

hold on;

mesh(mnpX,mnpY,pPH2);

colormap(jet);

colorbar;

xlabel('暴雨量(mm)'); % 为X轴加标签

ylabel('暴雨强度(mm/d)'); % 为Y轴加标签

zlabel('直接经济损失(亿元)'); % 为z轴加标签

title('二次趋势面模型');

subplot(1,3,3);

scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');

colormap(jet);

colorbar;

hold on;

mesh(mnpX,mnpY,pPH3);

colormap(jet);

colorbar;

xlabel('暴雨量(mm)'); % 为X轴加标签

ylabel('暴雨强度(mm/d)'); % 为Y轴加标签

zlabel('直接经济损失(亿元)'); % 为z轴加标签

title('三次趋势面模型');

clc;clear;
num = xlsread("G:\Data\灾损曲线\趋势面分析-数据.xlsx",'B21:N37');
volume = num(:,1);
magnitude = num(:,3);
pop = num(:,8);
gdp = num(:,13);

opoX=num(:,1);
opoY=num(:,3);
oPH=num(:,8);
% oOM=info(:,4);
% oTN=info(:,5);

%{
% 2S法计算异常值
mPH=mean(oPH);
sPH=std(oPH);
num2=find(oPH>(mPH+2*sPH)|oPH<(mPH-2*sPH));

% 异常值剔除
PH=oPH;
for i=1:length(num2)
    n=num2(i,1);
    PH(n,:)=[0];
end
PH(all(PH==0,2),:)=[];
poX=opoX;
for i=1:length(num2)
    n=num2(i,1);
    poX(n,:)=[0];
end
poX(all(poX==0,2),:)=[];
poY=opoY;
for i=1:length(num2)
    n=num2(i,1);
    poY(n,:)=[0];
end
poY(all(poY==0,2),:)=[];
%}

cpoX = opoX;
cpoY = opoY;
cPH = oPH;
% 最小二乘法求解预处理
inva1=[ones(size(cpoX)),cpoX,cpoY]; %一次拟合求解
inva2=[ones(size(cpoX)),cpoX.^2,cpoY.^2,cpoX.*cpoY,cpoX,cpoY]; % 二次拟合求解
inva3=[ones(size(cpoX)),cpoX.^3,cpoY.^3,(cpoX.^2).*cpoY,cpoX.*(cpoY.^2),cpoX.^2,cpoY.^2,cpoX.*cpoY,cpoX,cpoY]; % 三次拟合求解

% 最小二乘法求解
[coef1,bint1,r1,rint1,stats1]=regress(cPH,inva1);
[coef2,bint2,r2,rint2,stats2]=regress(cPH,inva2);
[coef3,bint3,r3,rint3,stats3]=regress(cPH,inva3);

% 趋势面法效果图绘制准备
npoX=min(cpoX):0.1:max(cpoX);
npoY=min(cpoY):0.1:max(cpoY);
[mnpX,mnpY]=meshgrid(npoX,npoY);

% 趋势面法插值
pPH1=coef1(1,:)+coef1(2,:)*mnpX+coef1(3,:)*mnpY;
pPH2=coef2(1,:)+coef2(2,:)*mnpX.^2+coef2(3,:)*mnpY.^2+coef2(4,:)*mnpX.*mnpY+coef2(5,:)*mnpX+coef2(6,:)*mnpY;
pPH3=coef3(1,:)+coef3(2,:)*mnpX.^3+coef3(3,:)*mnpY.^3+coef3(4,:)*(mnpX.^2).*mnpY+coef3(5,:)*mnpX.*(mnpY.^2)+coef3(6,:)*mnpX.^2+coef3(7,:)*mnpY.^2+coef3(8,:)*mnpX.*mnpY+coef3(9,:)*mnpX+coef3(10,:)*mnpY;

% 趋势面法效果图绘制
figure();
subplot(1,3,1);
scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');
hold on;
mesh(mnpX,mnpY,pPH1);
colormap(jet);
colorbar;
xlabel('暴雨量(mm)');  % 为X轴加标签
ylabel('暴雨强度(mm/d)');  % 为Y轴加标签
zlabel('受灾人口(万人)');  % 为z轴加标签
title('一次趋势面模型');

subplot(1,3,2);
scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');
hold on;
mesh(mnpX,mnpY,pPH2);
colormap(jet);
colorbar;
xlabel('暴雨量(mm)');  % 为X轴加标签
ylabel('暴雨强度(mm/d)');  % 为Y轴加标签
zlabel('受灾人口(万人)');  % 为z轴加标签
title('二次趋势面模型');

subplot(1,3,3);
scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');
colormap(jet);
colorbar;
hold on;
mesh(mnpX,mnpY,pPH3);
colormap(jet);
colorbar;
xlabel('暴雨量(mm)');  % 为X轴加标签
ylabel('暴雨强度(mm/d)');  % 为Y轴加标签
zlabel('受灾人口(万人)');  % 为z轴加标签
title('三次趋势面模型');

2. 三种模型精度检验

% 验证集筛选

PH = oPH;

poX = opoX;

poY = opoY;

very=[randperm(length(PH),floor(length(PH)*0.2))]';

% 验证集剔除

cPH=PH;

vPH=zeros(length(very),1);

vpoX=vPH;

vpoY=vPH;

for i=1:length(very)

m=very(i,1);

vPH(i,:)=cPH(m,:);

cPH(m,:)=[0];

end

cPH(all(cPH==0,2),:)=[];

cpoX=poX;

for i=1:length(very)

m=very(i,1);

vpoX(i,:)=cpoX(m,:);

cpoX(m,:)=[0];

end

cpoX(all(cpoX==0,2),:)=[];

cpoY=poY;

for i=1:length(very)

m=very(i,1);

vpoY(i,:)=cpoY(m,:);

cpoY(m,:)=[0];

end

cpoY(all(cpoY==0,2),:)=[];

% 趋势面法精度对比

vpPH1=coef1(1,:)+coef1(2,:)*vpoX+coef1(3,:)*vpoY;

MEERan1=mean(vPH-vpPH1);

MEERan11=mean(abs(vpPH1-vPH));

RMSEan1=sqrt(sum(vpPH1-vPH).^2/length(vPH));

COCOan1=corrcoef(vpPH1,vPH);

vpPH2=coef2(1,:)+coef2(2,:)*vpoX.^2+coef2(3,:)*vpoY.^2+coef2(4,:)*vpoX.*vpoY+coef2(5,:)*vpoX+coef2(6,:)*vpoY;

MEERan2=mean(vPH-vpPH2);

MEERan21=mean(abs(vpPH2-vPH));

RMSEan2=sqrt(sum(vpPH2-vPH).^2/length(vPH));

COCOan2=corrcoef(vpPH2,vPH);

vpPH3=coef3(1,:)+coef3(2,:)*vpoX.^3+coef3(3,:)*vpoY.^3+coef3(4,:)*(vpoX.^2).*vpoY+coef3(5,:)*vpoX.*(vpoY.^2)+coef3(6,:)*vpoX.^2+coef3(7,:)*vpoY.^2+coef3(8,:)*vpoX.*vpoY+coef3(9,:)*vpoX+coef3(10,:)*vpoY;

MEERan3=mean(vPH-vpPH3);

MEERan31=mean(abs(vpPH3-vPH));

RMSEan3=sqrt(sum(vpPH3-vPH).^2/length(vPH));

COCOan3=corrcoef(vpPH3,vPH);

% 验证集筛选
PH = oPH;
poX = opoX;
poY = opoY;
very=[randperm(length(PH),floor(length(PH)*0.2))]';
% 验证集剔除
cPH=PH;
vPH=zeros(length(very),1);
vpoX=vPH;
vpoY=vPH;
for i=1:length(very)
    m=very(i,1);
    vPH(i,:)=cPH(m,:);
    cPH(m,:)=[0];
end
cPH(all(cPH==0,2),:)=[];
cpoX=poX;
for i=1:length(very)
    m=very(i,1);
    vpoX(i,:)=cpoX(m,:);
    cpoX(m,:)=[0];
end
cpoX(all(cpoX==0,2),:)=[];
cpoY=poY;
for i=1:length(very)
    m=very(i,1);
    vpoY(i,:)=cpoY(m,:);
    cpoY(m,:)=[0];
end
cpoY(all(cpoY==0,2),:)=[];


% 趋势面法精度对比
vpPH1=coef1(1,:)+coef1(2,:)*vpoX+coef1(3,:)*vpoY;
MEERan1=mean(vPH-vpPH1);
MEERan11=mean(abs(vpPH1-vPH));
RMSEan1=sqrt(sum(vpPH1-vPH).^2/length(vPH));
COCOan1=corrcoef(vpPH1,vPH);
vpPH2=coef2(1,:)+coef2(2,:)*vpoX.^2+coef2(3,:)*vpoY.^2+coef2(4,:)*vpoX.*vpoY+coef2(5,:)*vpoX+coef2(6,:)*vpoY;
MEERan2=mean(vPH-vpPH2);
MEERan21=mean(abs(vpPH2-vPH));
RMSEan2=sqrt(sum(vpPH2-vPH).^2/length(vPH));
COCOan2=corrcoef(vpPH2,vPH);
vpPH3=coef3(1,:)+coef3(2,:)*vpoX.^3+coef3(3,:)*vpoY.^3+coef3(4,:)*(vpoX.^2).*vpoY+coef3(5,:)*vpoX.*(vpoY.^2)+coef3(6,:)*vpoX.^2+coef3(7,:)*vpoY.^2+coef3(8,:)*vpoX.*vpoY+coef3(9,:)*vpoX+coef3(10,:)*vpoY;
MEERan3=mean(vPH-vpPH3);
MEERan31=mean(abs(vpPH3-vPH));
RMSEan3=sqrt(sum(vpPH3-vPH).^2/length(vPH));
COCOan3=corrcoef(vpPH3,vPH);

3.  储存趋势面结果

% 趋势面法导出ASCII

save G:\Data\灾损曲线\liner_shp.txt pPH1 -ASCII;

save G:\Data\灾损曲线\Quadratic_shp.txt pPH2 -ASCII;

save G:\Data\灾损曲线\Cubic_shp.txt pPH3 -ASCII;

4. 结果记录

(1)直接经济损失拟合

RMSEan1=37.10  % 一次模型

MEERan11=21.5907

RMSEan2=34.80   % 二次模型

MEERan21=20.0930

RMSEan3=63.77    % 三次模型

MEERan31=36.8192

回归系数:

一次:coef1 = [-88.5130 2.1612 0.2825]

y = A+Bx+Cy

二次:coef2 = [2241.2  0.034084  1.7247  0.064554  -3.7023  -124.28]

y = A+Bx2+Cy2+Dxy+Ex+Fy

三次:coef3=[66267  -0.0042412  -1.8165  0.054876  0.18461  -1.16  185.76  -19.209  403.54  -6147.9]

y = A+Bx3+Cy3+Dx2y+Exy2+Fx2+Gy2+Hxy+Ix+Jy

 

(2)受灾人口拟合

RMSEan1=13.7724  % 一次模型

MEERan11=49.6338

RMSEan2=2.4228   % 二次模型

MEERan21=21.2086

RMSEan3=6.5534    % 三次模型

MEERan31=8.5753

回归系数:

一次:coef1 = [-74.208  2.6432  0.97359]

y = A+Bx+Cy

二次:coef2 = [1038  0.11192  1.1631  -0.44552  6.6042  -63.551]

y = A+Bx2+Cy2+Dxy+Ex+Fy

三次:coef3=[-32935  0.0021481  -0.77281  -0.11804  1.6544  3.98  20.577  -105.1  1650.5  1173.7]

y = A+Bx3+Cy3+Dx2y+Exy2+Fx2+Gy2+Hxy+Ix+Jy

 

(3)农作物受灾面积拟合

RMSEan1=15.2809  % 一次模型

MEERan11=14.2062

RMSEan2=13.5684   % 二次模型

MEERan21=7.8337

RMSEan3=6.5534    % 三次模型

MEERan31=3.8697

回归系数:

一次:coef1 = [-93.278  1.2344  1.9453]

y = A+Bx+Cy

二次:coef2 = [1842.9  0.028401  1.5173  -0.017423  -1.0754  -104.62]

y = A+Bx2+Cy2+Dxy+Ex+Fy

三次:coef3=[-20685  -0.0012011  0.24522  -0.012544  0.27819  0.66217  -35.113  -18.195  283.95  1525.8]

y = A+Bx3+Cy3+Dx2y+Exy2+Fx2+Gy2+Hxy+Ix+Jy

 

二次拟合模型最好

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值