1

我正在尝试使用 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 函数(蓝色)提供的目标发生在之前!所以它并没有表明它实际上是在预测。

4

1 回答 1

2

右移

您的图表显示了 1 个(不是 2 个!)时间步长的时移。这并不理想,但是当延迟选择不当时会发生这种情况,从而导致这种延迟模式。(为了进一步解释,请查看 MATLAB CENTRAL 上的这个问题。事实上,Greg Heath 发布了很多关于 ANN 的材料,非常值得一读,即使它有时有点短而无法立即理解,尤其是对于初学者而言。)所以,为避免这种情况,您必须研究数据的相关模式。

删除延迟()

现在,我假设您想通过消除网络延迟来纠正这种行为。不幸的是,这不是为了removedelay()

这个例子使用了一个 timedelaynet,但也可以用于 NAR 和 NARX 网络,我发现这个描述很有帮助。结合removedelay文档中的引用

结果是一个行为相同的网络,除了输出是在 n 个时间步之后产生的。

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

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

net = removedelay(net,n);

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

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

错误

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

结论

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

建议

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

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

于 2015-06-26T03:36:13.377 回答