我创建了一个神经网络来模拟某种(简单的)输入输出关系。当我使用 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 net 对于此类问题可能有点矫枉过正,但我打算将此示例用作将来更复杂的时间序列问题的基础。
亲切的问候,詹姆斯
从训练数据到新数据泛化能力差的最可能原因是 (1) 没有足够的训练数据来描述问题,或者 (2) 神经网络的神经元和延迟多于问题所需所以它过度拟合数据(即它很容易记住示例,而不必弄清楚它们之间的关系。
(1) 的修复通常是更多数据。 (2) 的修复是减少抽头延迟和/或神经元的数量。
希望这有帮助!
我不确定你是否解决了问题。但是至少还有一种方法可以解决您的问题。
由于您正在处理时间序列,因此最好(至少在这种情况下)设置 net.divideFcn = 'dividerand'。 'divideblock' 只会使用时间序列的第一部分进行训练,这可能会导致丢失有关长期趋势的信息。
增加输入延迟、反馈延迟和隐藏层大小如下:
inputDelays = 1:30;
feedbackDelays = 1:3;
hiddenLayerSize = 30;
也将功能更改为
net.divideFcn = 'dividerand';
这改变了我的工作,即使网络需要时间