[区间预测]NRBO-CNN-BiLSTM-Attention-PDE单变量时序预测 (单输入单输出)

[区间预测]NRBO-CNN-BiLSTM-Attention-PDE单变量时序预测 (单输入单输出)

效果分析

1

基本介绍

[区间预测]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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前程算法屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值