13

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

我试图预测提前 3 分钟,即提前 180 分。因为我将时间序列数据压缩为每 2 个点的平均值为 1,所以我必须预测 (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]
...

直到它到达数据的末尾

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

//在我的训练开始时,我用卡尔曼过滤它,归一化到[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 左右。

在此处输入图像描述

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

在此处输入图像描述

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

而且我找不到一种有效的方法来预测时间序列中提前 90 个点。任何关于我应该做什么以预测 N 点的建议,任何教程或信息链接。

迭代训练的最佳方式是什么?在我的第二种方法中,当我达到 15000 个训练数据时,训练规模突然开始下降。我应该迭代地更改运行时的 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
4

2 回答 2

4

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

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

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

对不起,如果答案不是很清楚。很难用简短的回答来解释水库计算的工作原理,但是如果您只是阅读链接中的文章,您会发现很容易理解其中的原理。

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

编辑:根据您的系统的“可预测性”,预测 90 分可能仍然非常困难。例如,如果你试图预测一个混沌系统,如果你预测的很远,噪声会引入非常大的错误。

于 2014-02-27T17:09:04.820 回答
-2

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

于 2014-01-25T20:40:30.653 回答