NARX 神经网络预测?

NARX Neural network prediction?

我正在尝试使用 Matlab 提供的 NARX 神经网络解决方案来解决时间序列问题。我试图了解如何预测实际值,但我得到的结果几乎是完美的!错误是如此之小,以至于我不确定我是否真的在预测。我只是想确保我做的一切都是正确的!

基本上我使用 GUI 解决方案用一些样本训练网络。然后我使用以下脚本用新样本测试神经网络:

      X = num2cell(open2(1:end))'; % input
      T = num2cell(close2(1:end))'; % this is the output I should get

      net = removedelay(net);
      [Xs,Xi,Ai,Ts] = preparets(net,X,{},T);

      Y = net(Xs,Xi,Ai);

      plotresponse(Ts,Y)
      view(net)

      Y = cell2mat(Y);
      T = cell2mat(T);

      sizey = length(Y);
      sizet = length(T);

      T = T(1:sizey);

      figure
      plot(1:sizey,T,1:sizey,Y)

我得到的图表与原始目标时间序列函数几乎相同。误差非常小,唯一的区别是图形 (Y) 向左移动了 2 个样本。但是,我真的在预测吗?

这是图表的一部分:

提前致谢!

更新:实际预测图向右移动而不是向左移动。 preparets 函数(蓝色)提供的目标发生在之前!所以它并没有表明它实际上是在预测。

右移

您的图表 显示时间偏移为 1(不是 2!)个时间步长。这并不理想,但是当延迟选择不当导致这种延迟模式时可能会发生。 (有关进一步的解释,请查看 MATLAB CENTRAL 上的 this question。事实上,Greg Heath 在 ANN 上发布了 lot of material,非常值得一读,尽管它有时有点短,无法立即理解,尤其是对于初学者。)因此,为避免这种情况,您必须查看数据的相关模式。

移除延迟()

现在,我假设您想通过移除网络延迟来纠正此行为。不幸的是,不是 removedelay() 的意思:

This example uses a timedelaynet, but can be adopted for NAR and NARX networks as well, and I found the description very helpful. In combination with a quote from removedelay's documentation

The result is a network which behaves identically, except that outputs are produced n timesteps later.

很明显您没有更改网络,而只是更改了 y 值的时间依赖性,因此您的网络将尝试提前预测一个时间步长。您可以在 T 和 Y 向量的最后看到这种行为,其中 Y 将具有 附加值 而 T 将此 space 填充为 NaN (因为您显然不能突然生成更多目标)。

removedelay()应该结合闭环设计使用,这样你就可以及早获得预测值,作为下一步的直接输入。在这种情况下,将输出延迟增加不止一个也是有意义的,这就是为什么你可以传递一个额外的参数 n:

net = removedelay(net,n);

为了证明没有使用额外的时间步长,您可以使用经过训练的网络模拟所需的数据集,然后使用 removedelay() 模拟相同的数据集。除了 Y 曲线的最后一个值(参见图 1)外,它们将完全相同。

图图 1:两个图均基于使用 MATLAB 热交换器示例的前 3500 个数据点训练的同一个网络。显示的是训练过程中 未使用 的最后 500 个值的模拟结果。除了左侧使用 removedelay() 的附加值外,结果是相同的。

错误

如果您使用的是代表性训练集,您的错误 必须非常小。因此,对类似新数据的预测会很好,因为您的网络没有过度拟合。

结论

那么,你在预测吗?不,你在模拟。模拟您的网络行为是基于您以前未知的数据集的输入,而不是目标(它们只需要传递以允许性能评估)。因此,无论是否使用 removedelay() 将新数据传递到您的网络都是模拟,因为它基于提供的输入。消除延迟对这些结果没有影响。
另一方面,预测不需要输入数据,因为它实际上只是继续网络到目前为止已经学习的模式,而不考虑新的输入。

建议

如果您只想将具有有效输入值的未知数据集传递到您的网络进行模拟,您也可以将其作为测试集的一部分传递通过使用 divideblockdivideint 选项。

如果你想利用 removedelay() 的早期预测,或者因为你的输入有漏洞或由于其他原因不可靠而需要一般预测,你应该考虑用闭环模拟你的未知集。如果它的性能太糟糕,你也可以从一开始就训练一个闭环网络。