2013-02-02 97 views
1

我創建了一個神經網絡來模擬某種(簡單)輸入輸出關係。當我使用nntrain gui查看時間序列響應圖時,預測看起來非常合適,但是,當我嘗試從樣本預測中完成時,結果無法與正在建模的函數接近。Matlab:使用神經網絡進行預測

我已經廣泛地使用了這個問題,並與我的代碼搞砸了無濟於事,我真的很感謝有一點了解我一直在做錯了什麼。

我已經在下面包含了一個最小工作示例。

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網絡延遲一段時間可能是這種類型的問題矯枉過正,但我​​打算使用這個例子作爲在未來更復雜的時序問題的基礎。

親切的問候,詹姆斯

+0

如果您在製作樣本外預測時遇到問題,可能是因爲過度配置。這是交叉驗證進入的地方。 –

回答

0

泛化差從訓練數據,新數據最可能的原因是:(1)沒有足夠的訓練數據來表徵問題,或(2)神經網絡有更多的神經元和延遲比問題所需要的更多,所以它過度擬合了數據(例如,它可以很容易地記住例子,而不必知道它們是如何相關的。)

(1)的修正是通常更多的數據,(2)的解決方案是減少抽頭延遲和/或神經元的數量。希望這有助於!

0

我不確定你是否解決了這個問題。但至少有一個解決方案可以解決您的問題。

由於您正在處理時間序列,因此設置net.divideFcn ='dividerand'更好(至少在這種情況下)。 '分隔塊'將僅使用時間序列的第一部分進行訓練,這可能會導致關於長期趨勢的信息丟失。