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

时间:2013-12-07 03:17:59

标签: machine-learning neural-network time-series prediction supervised-learning

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

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

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

enter image description here

我的数据可以从以下网址获取: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]
...

直到它到达数据的末尾

  

我在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; 

//在训练开始时,我用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

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

我的第三种方法是迭代训练;它类似于以前的训练,但是在每次迭代中,我只训练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

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

enter image description here

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

enter image description here

我无法成功采用任何一种方法。在每次迭代中,我还观察到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

2 个答案:

答案 0 :(得分:4)

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

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

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

很抱歉,如果答案不是很清楚。很难用简短的答案解释油藏计算的工作原理,但如果您只是阅读链接中的文章,您会发现很容易理解这些原理。

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

编辑:根据您的系统“可预测”的程度,提前预测90分可能仍然非常困难。例如,如果你想要预测一个混乱的系统,如果你预测的话,噪声会引入非常大的错误。

答案 1 :(得分:-2)

使用隶属函数模糊逻辑来预测未来数据。将是有效的方法。