[区间预测]NRBO-CNN-BiLSTM-Attention-PDE单变量时序预测 (单输入单输出)
效果分析
基本介绍
[区间预测]NRBO-CNN-BiLSTM-Attention-PDE单变量时序预测 (单输入单输出)
直接替换Excel数据即可用!注释清晰,适合新手小白~
订阅专栏只能获取专栏内一份代码。
程序设计
%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
clc,clear
data = xlsread("数据1.xlsx");
%%
Fcst = data(:,1);
Real = data(:,2);
Step = (1:size(data,1))';
%%
z = [0.975;0.95;0.925;0.9;0.875;0.85;0.75]; %分位数
%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
error_test = Fcst-Real;
%%
for m = 1:7
[~,stats(:,m)]=INTERVAL_FUN(Step,error_test,z(m),3,150);
end
%%
for m = 1:7
Lower(:,m) = Fcst - stats(m).yfitci(:,1);
Upper(:,m) = Fcst + stats(m).yfitci(:,2);
end
%%
PlotProbability(Fcst,Real,numel(Step),Lower,Upper,1,150,...
'数据',[1 1 1],[0.8, 0, 0],[0.9 0 0],[0.8500 0.3250 0.0980]); %概率绘图
%%
% PINAW
[PINAW,mean_PINAW] = PINAW_FUN(Lower,Upper,Real);
%%
% PICP
[PICP,mean_PICP] = PICP_FUN(Lower,Upper,Real);
%%
% CWC
beta = [0.95;0.9;0.85;0.8;0.75;0.7;0.5]; %置信水平
eta = 50; %惩罚参数
[CWC,mean_CWC] = CWC_FUN(PINAW,PICP,eta,beta);
function [p,stats]=INTERVAL_FUN(x,y,tau,order,Nboot)
%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
warning off
if nargin<3
error('输入参数不足!');
end
if nargin<4, order=[]; end
if nargin<5, Nboot=200; end
if (tau<=0)|(tau>=1),
error('分位数必须介于0和1之间!')
end
if size(x,1)~=size(y,1)
error('样本点数量必须相同!');
end
if numel(y)~=size(y,1)
error('因变量序列必须为向量!')
end
if size(x,2)==1
if isempty(order)
order=1;
end
%建立范德蒙德矩阵
if order>0
x(:,order+1)=1;
else
order=abs(order);
end
x(:,order)=x(:,1);
for ii=order-1:-1:1
x(:,ii)=x(:,order).*x(:,ii+1);
end
elseif isempty(order)
order=1;
else
error('不能同时使用多列输入来指定回归阶数!');
end
pmean=x\y; %最小二乘
% if all(x(:,end)==1)
% r=y-x*pmean;
% pmean(end)=pmean(end)+prctile(r,tau*100);
% end
rho=@(r)sum(abs(r.*(tau-(r<0))));
p=fminsearch(@(p)rho(y-x*p),pmean);
function PlotProbability(TestOutputs,RealOutputs,Num_Fcst,Lower,Upper,llimit,rlimit,Name,FColor,IColor,RColor,TColor)
%% 区间估计
figure; %概率绘图
transparence = [0;0;0;0]; %图窗透明度
x = 1:Num_Fcst;
h = gca;
hp = patch([x(1),x(end),x(end),x(1)],...
[min(min(Lower)),min(min(Lower)),max(max(Upper)),max(max(Upper))],FColor,'FaceVertexAlphaData',transparence,'FaceAlpha',"interp");
uistack(hp,'bottom');
hold on
n = [0.2;0.21;0.22;0.23;0.3;0.5;0.6]; %区间透明度
for j = 1:7
window(j)=fill([x,fliplr(x)],[Lower(:,j)',fliplr(Upper(:,j)')],IColor,'FaceAlpha',n(j));
window(j).EdgeColor = 'none';
hold on
plot(Upper(:,j),'Marker',"none","LineStyle","none","Tag",'none',"Visible","off");
hold on
plot(Lower(:,j),'Marker',"none","LineStyle","none","Tag",'none',"Visible","off");
hold on
end
plot(RealOutputs,'*','MarkerSize',4,'Color',RColor);
hold on
plot(TestOutputs,'Color',TColor,'LineWidth',1.5);
hold on
xlim([llimit rlimit]);
ylim([min(min(Lower)) max(max(Upper))]);
xlabel('采样点',"FontSize",10,"FontWeight","bold");
ylabel('数据',"FontSize",10,"FontWeight","bold");
legend('','95%置信区间',"","",'90%置信区间',"","",'85%置信区间',"","",...
'80%置信区间',"","",'75%置信区间',"","",'70%置信区间',"","",...
'50%置信区间',"","",'真实值',strcat(Name,'预测值'),...
'Location','bestoutside');
grid on
end
%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function [PINAW,mean_PINAW] = PINAW_FUN(Lower,Upper,Real)
PINAW = sum(Upper-Lower)/(length(Real)*(max(Real)-min(Real)));
mean_PINAW = mean(PINAW);
end
%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考资料
[1] https://blog.csdn.net/m0_57362105/article/details/128364733?spm=1001.2014.3001.5501
[2] https://blog.csdn.net/m0_57362105/article/details/128327690?spm=1001.2014.3001.5502