针对Math老师提到的《MATLAB时间序列神经网络训练好以后怎么预测》
MATLAB时间序列神经网络训练好以后怎么预测 – MATLAB中文论坛 (ilovematlab.cn)https://www.ilovematlab.cn/thread-132940-1-1.html通过仔细的探索终于把所有东西都理清楚了,在这里自我记录和分享给大家。另外我需要把我之前的博客全部整理了一下,该删的删。因为一些理论之前是错的,而且也很乱。首先引用一下math老师对于时间序列神经网络预测的方法,分为两种:循环预测和一次性预测。其实这两种方法本质上是一样的。网上基本没有关于预测的代码,因此放出来了,若有需要数据集和训练和预测和结果对比完整过程的朋友请移步帖子最后面的链接直接下载。(觉得好用,有帮助的麻烦资源收藏+关注)
目录
一、循环预测(不常用)
二、一次性预测(官方指定方法)
三、代码实现
一、循环预测(不常用)
循环预测的原理即是利用开环网络(open-loop)在循环中进行多步预测。开环网络的特点就是一次只能预测出一个,训练的时候就是用的开环网络。可以发现在训练的时候,其输出的performance都特别的好,误差也很小。至于训练神经网络的代码,利用工具箱或者网上各种教程,特别多了。开环网络如图:
下面是循环预测的代码:每一步只能预测出一个,然后手动编写代码将其输出y(t)添加到输入中,不断更新输入,然后就能实现多步预测(multi-step prediction)。其中force_raw是延迟delay,(在工具箱中显示为d,在代码段中显示为feedbackDelays),其含义为输入向量的个数,是用多少个数去预测下一个。一般来说,输出其下一个时间步的值结果最为准确。
for j=1:31
force_prediction(j)=net(force_raw);
force_raw=[force_raw(2:end);force_prediction(j)];
end
需要注意的是,这里的j=1:31,31在这里即指代的是预测范围(prediction horizon),由于该神经网络本身的结构原因(通过上述代码可以更加清晰地发现),其预测误差是随着预测范围的增加不断累积的,然而我们是无法规避这种误差的,除非更换更加适合长序列预测的神经网络,在后面会提到,我会用到一种长短时记忆时序预测网络(LSTM, Long-short term Memory),它能够解决该神经网络在预测上的一些问题。
二、一次性预测(官方指定方法)
一次性预测的原理即是利用了闭环网络(close-loop)。它能够通过nar_net_closed = closeloop(net)这段代码将开环网络变成闭环的。闭环网络的特点是它代替了我们上述编写代码的步骤 ,即它自己在内部就会不断迭代反馈循环,然后能够实现一次性预测。
nar_net_closed = closeloop(net)
[p1,Pi1,Ai1,t1] = preparets(nar_net_closed,{},{},y1);
pred = nar_net_closed(p1,Pi1,Ai1);
p1、Pi1均为空矩阵(因为nar没有输入矩阵,那么p1和Pi1也就不存在),然后p1这个空矩阵的维度直接决定了预测的长度(至于空矩阵为什么还有维度,应该跟计算机里面的线性存储和数据划分方式有关),只有Ai1是有实际意义的,其矩阵的形式为——列长度方面:层与层之间最长延迟向量为长度,因此为30(可以看到图中为1:30)。行长度方面:分为两个部分,蓝色所示部分跟隐藏层层数有关,该部分数值全部为零,该网络只有一个隐藏层,因此只有一个维度,同时每个维度中还内含维度,回馈层维度中的数值就是延迟向量(为1),维度数为每层的节点数为20。Ai1数据结构如下图所示:
其中t1为扣除了delay个(这里是新的设定,delay=5)之后的数据,T为目标输出值。
三、代码实现
1.NAR-RNN网络预测
clc
clear
load data.mat;
load net.mat
%% 解释输入输出,这里输入不需要时间,只有事件发生的先后顺序
%% NAR网络不用归一化
ooutput=data(2000:3000,8); %这里选用2000:3000的来验证
%% 预测
nar_net_closed = closeloop(net);
%% 迭代循环
%% 准备数据
T = tonndata(ooutput,false,false);
[p1,Pi1,Ai1,t1] = preparets(nar_net_closed,{},{},T);
%% 多步预测
data_pred = nar_net_closed(p1,Pi1,Ai1);
e = gsubtract(t1,data_pred);
performance = perform(nar_net_closed,t1,data_pred);
Pred=cell2mat(data_pred);
Observed=cell2mat(t1);
%% 显示图的预测对比
plot(Pred)
hold on;
plot(Observed)
图 1‑1 NAR-RNN时间序列预测效果
2.NARX-RNN网络预测
clc
clear
load data.mat;
load net.mat
%% 解释输入输出,这里输入不需要时间,只有事件发生的先后顺序
%% NARX网络不用归一化
iinput=data(2000:3000,2:7); %这里选用2000:3000的来验证
ooutput=data(2000:3000,8); %这里选用2000:3000的来验证
%% 预测
narx_net_closed = closeloop(net);
%% 迭代循环
%% 准备数据
X = tonndata(iinput,false,false);
T = tonndata(ooutput,false,false); %如果原始样本定向为列,则为True;如果为行,则为false
[p1,Pi1,Ai1,t1] = preparets(narx_net_closed,X,{},T);
%% 多步预测
data_pred = narx_net_closed(p1,Pi1,Ai1);
e = gsubtract(t1,data_pred);
performance = perform(narx_net_closed,t1,data_pred);
Pred=cell2mat(data_pred);
Observed=cell2mat(t1);
%% 显示图的预测对比
plot(Pred)
hold on;
plot(Observed)
图 1‑2 NARX-RNN时间序列预测效果