Matlab:使用神经网络进行预测

时间:2013-02-02 10:34:10

标签: matlab neural-network prediction

我创建了一个神经网络来模拟某个(简单的)输入 - 输出关系。当我使用nntrain gui查看时间序列响应图时,预测似乎相当充分,但是,当我尝试进行样本预测时,结果与模拟的函数无关。

我已经广泛搜索了这个问题并且弄乱了我的代码无济于事,我真的很感激我对我做错了什么有点了解。

我在下面提供了一个最小的工作示例。

 A = 1:1000;  B = 10000*sin(A); C = A.^2  +B;
 Set = [A' B' C'];
 input = Set(:,1:end-1);
 target = Set(:,end);
 inputSeries = tonndata(input(1:700,:),false,false);
 targetSeries = tonndata(target(1:700,:),false,false);

 inputSeriesVal = tonndata(input(701:end,:),false,false);
 targetSeriesVal = tonndata(target(701:end,:),false,false);

 inputDelays = 1:2;
 feedbackDelays = 1:2;
 hiddenLayerSize = 5;
 net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);

[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
net.divideFcn = 'divideblock';  % Divide data in blocks
net.divideMode = 'time';  % Divide up every value

 % Train the Network
[net,tr] = train(net,inputs,targets,inputStates,layerStates);
Y = net(inputs,inputStates,layerStates); 

 % Prediction Attempt
delay=length(inputDelays); N=300;
inputSeriesPred  = [inputSeries(end-delay+1:end),inputSeriesVal];
targetSeriesPred = [targetSeries(end-delay+1:end), con2seq(nan(1,N))];
netc = closeloop(net);
[Xs,Xi,Ai,Ts] = preparets(netc,inputSeriesPred,{},targetSeriesPred);
yPred = netc(Xs,Xi,Ai);
perf = perform(net,yPred,targetSeriesVal);

 figure;
plot([cell2mat(targetSeries),nan(1,N);
      nan(1,length(targetSeries)),cell2mat(yPred);
      nan(1,length(targetSeries)),cell2mat(targetSeriesVal)]')
legend('Original Targets','Network Predictions','Expected Outputs')
  end 

我认识到具有时间延迟的narx网对于这类问题可能有点过分,但我打算将此示例作为未来更复杂的时间序列问题的基础。

亲切的问候,詹姆斯

3 个答案:

答案 0 :(得分:0)

从训练数据到新数据的不一致推广的最可能原因是:(1)没有足够的训练数据来表征问题,或者(2)神经网络具有比所需更多的神经元和延迟问题是它过度拟合了数据(即它很容易记住这些例子,而不必弄清楚它们是如何相关的。

(1)的修正通常是更多数据。 (2)的修正是减少抽头延迟和/或神经元的数量。

希望这有帮助!

答案 1 :(得分:0)

我不确定你是否解决了这个问题。但至少还有一个解决方案可以解决您的问题。

由于您正在处理时间序列,因此设置net.divideFcn =' dividerand'会更好(至少在这种情况下)。分隔块'只会使用时间序列的第一部分进行培训,这可能会导致有关长期趋势的信息丢失。

答案 2 :(得分:0)

按如下所示增加inputdelay,feedbackdelay和hiddenlayersize:

 inputDelays = 1:30;
 feedbackDelays = 1:3;
 hiddenLayerSize = 30;

还将功能更改为

net.divideFcn = 'dividerand';

即使网络需要时间,此更改对我来说仍然有效