(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]
...
直到它到达数据的末尾
我在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%的最小误差时准确性 . 经过训练后,当我为第二部分数据做了相同的操作时,它会覆盖权重,而预测器主要表现为数据的最新列车部分 .
> 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
Trained DATA: 此图是我训练过的训练集的快照,蓝线是原始时间序列,红线是训练好的神经网络的预测值 . MSE约为50 .
Tested DATA: 在下图中,您可以看到我使用神经网络对我的测试数据的预测,该神经网络使用20,000个输入点进行训练,同时保持训练数据集的MSE误差<50 . 它能够捕捉到很少的模式,但大多数情况下我没有给出真正的良好准确性 .
我无法成功采用任何这种方法 . 在每次迭代中,我还观察到α上的微小变化完全覆盖已经训练过的数据,并且更多地关注当前训练的数据部分 . 我无法想出这个问题的解决方案 . 在迭代训练中,我应该保持学习率较小,时期数量较小 .
我无法找到一种有效的方法来预测时间序列中的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 回答
看看Echo State Networks(ESNs)或其他形式的油藏计算 . 它们非常适合时间序列预测,非常易于使用和快速收敛 . 您根本不需要担心网络结构(中间层的每个神经元都有随机权重,不会改变) . 您只学习输出权重 .
如果我正确理解问题,使用Echo State Networks,我会训练网络预测下一个点和前方90分 . 这可以通过简单地在输出神经元中强制所需输出然后执行岭回归来学习输出权重来完成 .
在训练后运行网络时,在每个步骤n,它将输出下一个点(n 1),您将作为输入反馈到网络(继续迭代),并提前90点(n 90) ,你可以做任何你想做的事情 - 即:你也可以将它反馈给网络,以便它影响下一个输出 .
对不起,如果答案不是很清楚 . 这很难解释储层计算如何在一个简短的答案中工作,但如果你只是阅读链接中的文章,你会发现很容易理解这些原理 .
如果您决定使用ESN,请阅读this论文以了解ESN最重要的属性,并且真正了解您正在做什么 .
编辑:根据你的系统“可预测”的程度,提前预测90分可能仍然非常困难 . 例如,如果你试图预测一个混乱的系统,如果你预测很远,噪声会引入非常大的错误 .
使用隶属函数的模糊逻辑来预测未来的数据 . 将是有效的方法 .