我正在尝试使用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个样本。但是,我真的在预测吗?
以下是图表的一部分:
提前致谢!
更新:实际预测图向右移动而不是向左移动。由准备功能(蓝色)提供的目标发生在之前!所以它并没有表明它实际上在预测。
答案 0 :(得分:2)
您的图表显示1(不是2!)时间步长的时移。这并不理想,但是当严重选择导致这种延迟模式的延迟时会发生这种情况。 (有关进一步的解释,请参阅MATLAB CENTRAL上的this question。实际上,Greg Heath在人工神经网络上发布了很多的材料,非常值得一读,尽管它有时候有点短暂。立即理解,特别是初学者。)因此,为了避免这种情况,你必须研究数据的相关模式。
现在,我假设你想通过删除网络的延迟来纠正这种行为。不幸的是,这是不 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()
的情况下将新数据传递到您的网络都是模拟,因为它基于提供的输入。消除延迟对这些结果没有影响
另一方面,预测不需要输入数据,因为它实际上只是延续了网络到目前为止所学到的模式,而没有考虑新的输入。
如果您只想拥有一个未知数据集,并将有效输入值传递到您的网络进行模拟,那么您也可以使用{{{测试集将其作为测试集的一部分传递出来1}}或divideblock
选项。
如果您想通过divideint
进行早期预测或者一般需要预测,因为您的输入有漏洞或由于其他原因而不可靠,您应该考虑使用闭环模拟未知集合。如果它的表现太糟糕,你也可以从一开始就训练一个闭环网络。