Main Content

多步神经网络预测

在开环模式下设置

具有反馈的动态网络,如 narxnetnarnet 神经网络,可以使用函数 openloopcloseloop 在开环和闭环模式之间变换。闭环网络进行多步预测。换句话说,它们在外部反馈缺失时继续通过使用内部反馈来进行预测。

此处,训练神经网络来对磁悬浮系统建模,并在默认开环模式下进行仿真。

[X,T] = maglev_dataset;
net = narxnet(1:2,1:2,10);
[x,xi,ai,t] = preparets(net,X,{},T);
net = train(net,x,t,xi,ai);
y = net(x,xi,ai);
view(net)

基于初始条件进行多步闭环预测

神经网络也可以仅以闭环形式进行仿真,这样,在给定外部输入序列和初始条件的情况下,神经网络执行的预测数与输入序列具有的时间步数一样多。

netc = closeloop(net);
view(netc)

此处,训练数据用于定义输入 x,以及初始输入和层延迟状态 xiai,但它们可以定义为对任何输入序列和初始状态进行多次预测。

[x,xi,ai,t] = preparets(netc,X,{},T);
yc = netc(x,xi,ai);

遵循已知序列的多步闭环预测

也可以在开环模式下用时间序列的所有已知值对经过训练的神经网络进行仿真,然后切换到闭环模式继续仿真,对将来进行所需次数的预测。

正如 openloopcloseloop 可用于开环和闭环神经网络之间的变换一样,它们可以转换开环和闭环网络的状态。以下是这些函数的完整接口。

[open_net,open_xi,open_ai] = openloop(closed_net,closed_xi,closed_ai);
[closed_net,closed_xi,closed_ai] = closeloop(open_net,open_xi,open_ai);

假设有以下情形:您可能有一个 20 个时间步的磁悬浮行为记录,并且您想要向前预测 20 个时间步。

首先,定义输入和目标的前 20 个时间步,表示已知输出由目标 t 定义的 20 个时间步。定义输入的接下来的 20 个时间步后,使用网络来预测 20 个输出,在其中使用其每个预测反馈来帮助网络执行下一个预测。

x1 = x(1:20);
t1 = t(1:20);
x2 = x(21:40);

然后基于此数据对开环神经网络进行仿真。

[x,xi,ai,t] = preparets(net,x1,{},t1);
[y1,xf,af] = net(x,xi,ai);

现在,网络返回的最终输入和层状态与网络一起转换为闭环形式。开环网络的最终输入状态 xf 和层状态 af 成为闭环网络的初始输入状态 xi 和层状态 ai

[netc,xi,ai] = closeloop(net,xf,af);

通常使用 preparets 来定义初始输入和层状态。由于这些已在开环仿真结束时获得,您不需要 preparets 继续进行闭环网络的 20 个时间步预测。

[y2,xf,af] = netc(x2,xi,ai);

请注意,您可以将 x2 设置为不同输入序列,以针对您要进行预测的不同时间步数测试不同的场景。例如,如果使用 10 个随机输入来预测磁悬浮系统的行为:

x2 = num2cell(rand(1,10));
[y2,xf,af] = netc(x2,xi,ai);

在闭环仿真后进行开环仿真

如果在仿真后网络处于闭环形式,可以从那里以开环形式继续仿真。此处,闭环状态转换回开环状态。(您不必将网络转换回开环形式,因为您已有原始开环网络。)

[~,xi,ai] = openloop(netc,xf,af);

现在,您可以定义外部输入和开环反馈的延拓,并仿真开环网络。

x3 = num2cell(rand(2,10));
y3 = net(x3,xi,ai);

这样,您就可以在开环和闭环方式之间切换仿真。这方面的一个应用是对传感器进行时间序列预测,其中最后一个传感器值通常是已知的,允许对下一时间步进行开环预测。但是,在某些情况下,传感器读数不可用或已知是错误的,需要一个闭环预测时间步。预测可以在开环和闭环形式之间交替进行,具体取决于最后一个时间步的传感器读数的可用性。