NARX神经网络预测?

时间:2015-06-24 10:12:57

标签: matlab neural-network autoregressive-models

我正在尝试使用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个样本。但是,我真的在预测吗?

以下是图表的一部分:

enter image description here

提前致谢!

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

1 个答案:

答案 0 :(得分:2)

右移

您的图表显示1(不是2!)时间步长的时移。这并不理想,但是当严重选择导致这种延迟模式的延迟时会发生这种情况。 (有关进一步的解释,请参阅MATLAB CENTRAL上的this question。实际上,Greg Heath在人工神经网络上发布了很多的材料,非常值得一读,尽管它有时候有点短暂。立即理解,特别是初学者。)因此,为了避免这种情况,你必须研究数据的相关模式。

Removedelay()

现在,我假设你想通过删除网络的延迟来纠正这种行为。不幸的是,这是 removedelay()的含义:

This example使用timedelaynet,但也可以用于NAR和NARX网络,我发现这些描述非常有用。结合removedelay's documentation

的引用
  

结果是一个行为相同的网络,但输出是在n个步骤后生成的。

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

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

net = removedelay(net,n);

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

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

错误

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

结论

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

建议

如果您只想拥有一个未知数据集,并将有效输入值传递到您的网络进行模拟,那么您也可以使用{{{测试集将其作为测试集的一部分传递出来1}}或divideblock选项。

如果您想通过divideint进行早期预测或者一般需要预测,因为您的输入有漏洞或由于其他原因而不可靠,您应该考虑使用闭环模拟未知集合。如果它的表现太糟糕,你也可以从一开始就训练一个闭环网络。