神经网络时间序列预测(N点前瞻预测)大规模迭代训练

alp*_*per 13 machine-learning time-series prediction neural-network supervised-learning

(N = 90)使用神经网络进行预测:

我想提前3分钟预测,即提前180分.因为我将时间序列数据压缩为将每2个点的平均值作为一个,我必须预测(N = 90)步进预测.

我的时间序列数据以秒为单位给出.值在30-90之间.它们通常从30到90和90到30移动,如下例所示.

在此输入图像描述

我的数据可以从以下网址获取:https://www.dropbox.com/s/uq4uix8067ti4i3/17HourTrace.mat

我在实现神经网络以预测N点方面遇到了麻烦.我唯一的功能是以前的时间.我使用了elman递归神经网络和newff.

在我的场景中,我需要预测90分.首先我如何手动分离我的输入和目标数据:例如:

data_in = [1,2,3,4,5,6,7,8,9,10]; //imagine 1:10 only defines the array index values.
N = 90; %predicted second ahead.
P(:, :)         T(:)     it could also be(2 theta time)  P(:, :)         T(:) 
[1,2,3,4,5]    [5+N]              |                     [1,3,5,7,9]     [9+N]
[2,3,4,5,6]    [6+N]              |                     [2,4,6,8,10]    [10+N]
...
Run Code Online (Sandbox Code Playgroud)

直到它到达数据的末尾

我在Elman递归神经网络中有100个输入点和90个输出点.什么是最有效的隐藏节点大小?

input_layer_size = 90;  
NodeNum1 =90;

 net = newelm(threshold,[NodeNum1 ,prediction_ahead],{'tansig', 'purelin'});
net.trainParam.lr       = 0.1; 
net.trainParam.goal     = 1e-3; 
Run Code Online (Sandbox Code Playgroud)

//在我的训练开始时,我用kalman过滤它,归一化到[0,1]范围内,之后我将数据混洗.1)我无法训练完整的数据.首先,我尝试训练完整的M数据,大约900,000,这没有给我一个解决方案.

2)其次我尝试了迭代训练.但是在每次迭代中,新添加的数据与已经训练的数据合并.在20,000个训练数据之后,准确度开始降低.首次训练的1000个数据非常适合训练.但是当我开始迭代合并新数据并继续训练之后,训练精度非常快地下降90到20.例如.

P = P_test(1:1000) T = T_test(1:1000) counter = 1;
     while(1)
      net = train(net,P,T, [], [] );%until it reaches to minimum error I train it.
      [normTrainOutput]    = sim(net,P,         [], [] );

      P = [ P P(counter*1000:counter*2000)]%iteratively new training portion of the data added. 
    counter = counter + 1; end
Run Code Online (Sandbox Code Playgroud)

这种方法非常缓慢,经过一段时间后它不会给出任何好的结果.

我的第三种方法是迭代训练; 它类似于以前的训练,但在每次迭代中,我只训练1000部分数据,而不与之前训练过的数据进行任何合并.例如,当我训练前1000个数据直到达到> 95%的最小误差时准确性.在训练之后,当我对第二个1000部分的数据做了相同的操作;它覆盖了权重,预测器主要表现为数据的最新列车部分.

> P = P_test(1:1000) T = T_test(1:1000) counter = 1; 
      while(1)
>       net            = train(net,P,T, [], [] ); % I did also use adapt()
>       [normTrainOutput]    = sim(net,P,         [], [] );
>    
>       P = [ P(counter*1000:counter*2000)]%iteratively only 1000 portion of the data is added.
>     counter = counter + 1; 
end
Run Code Online (Sandbox Code Playgroud)

训练有素的数据:此图是来自我训练过的训练集的快照,蓝线是原始时间序列,红线是训练好的神经网络的预测值.MSE约为50.

在此输入图像描述

经过测试的数据:在下面的图片中,您可以看到我对神经网络的测试数据的预测,神经网络训练有20,000个输入点,同时保持训练数据集的MSE误差<50.它能够捕捉到很少的模式,但大多数情况下我没有给出真正的良好准确性.

在此输入图像描述

我无法成功采用任何一种方法.在每次迭代中,我还观察到alpha上的轻微变化完全覆盖已经训练过的数据,并且更多地关注当前训练的数据部分.我无法想出这个问题的解决方案.在迭代训练中,我应该保持较小的学习速率和较小的时期数.

我无法找到一种有效的方法来预测时间序列中的90分.有任何建议,我应该怎么做才能预测N点,任何教程或信息链接.

迭代培训的最佳方法是什么?在我的第二种方法中,当我达到15 000个训练数据时,训练大小突然开始下降.我应该在运行时改变alpha吗?

==========

任何建议或我做错的事情都将非常感激.

我还实现了递归神经网络.但是在大数据培训方面,我遇到了同样的问题.是否有可能在(newelm)的回归神经网络中进行自适应学习(在线学习)?重量不会自我更新,我没有看到任何改善.

如果是的话,我怎么可能,我应该使用哪些功能?

net = newelm(threshold,[6, 8, 90],{'tansig','tansig', 'purelin'});
net.trainFcn               = 'trains';
batch_size                 = 10;
while(1)
       net = train(net,Pt(:, k:k+batch_size ) , Tt(:, k:k+batch_size)   );
end
Run Code Online (Sandbox Code Playgroud)

tom*_*mas 4

查看Echo State Networks (ESN) 或其他形式的储层计算。它们非常适合时间序列预测,非常易于使用并且收敛速度快。您根本不需要担心网络的结构(中间层中的每个神经元都有不会改变的随机权重)。您仅了解输出权重。

如果我正确理解了这个问题,那么使用 Echo State Networks,我只需训练网络来预测下一个点以及未来 90 个点。这可以通过简单地在输出神经元中强制输出所需的输出,然后执行岭回归来学习输出权重来完成。

训练网络后运行网络时,在每一步n,它都会输出下一个点 ( n+1 ),您可以将其反馈给网络作为输入(以继续迭代),以及前面 90 个点 ( n+ 90),你可以用它做任何你想做的事 - 即:你也可以将它反馈到网络,以便它影响下一个输出。

抱歉,如果答案不是很清楚。很难用简短的答案来解释存储库计算是如何工作的,但是如果你阅读链接中的文章,你会发现它的原理很容易理解。

如果您决定使用 ESN,另请阅读本文以了解 ESN 最重要的属性,并真正了解您在做什么。

编辑:根据您的系统的“可预测性”程度,预测未来 90 分可能仍然非常困难。例如,如果您尝试预测一个混沌系统,那么如果您预测得比较远,噪声就会引入非常大的误差。

  • 使用这些公式只是因为我们可以轻松计算所需的输出并且便于测试。您当然可以插入自己的数据。在本文(http://neuron-ai.tuke.sk/bundzel/diploma_theses_students/2006/Martin%20Sramko-%20Echo%20State%20NN%20in%20Prediction/STMEchoStatesTechRep.pdf)论文的第7章中,有一个训练示例用于生成文本的 ESN。在每一步 n 中,您插入第 n 个字母作为输入,将第 n+1 个字母作为输出,以便它学习预测下一个字母。这里没有延迟,但了解如何插入自己的数据可能会有所帮助。 (2认同)