2017-05-25 78 views
0

我正在用連續3天的數據訓練我的神經網絡,並用第4天的數據測試它。這個例子中的值是隨機選擇的,與現實無關。我想要神經網絡學習電流,這取決於溫度和太陽輻射。級聯前向反向傳播網絡的多個訓練數據

%% initialize data for training 
Temperature_Day1 = [25 26 27 26 25]; 
Temperature_Day2 = [25 24 24 23 24]; 
Temperature_Day3 = [21 20 22 21 20]; 
SolarRadiation_Day1 = [990 944 970 999 962]; 
SolarRadiation_Day2 = [993 947 973 996 967]; 
SolarRadiation_Day3 = [993 948 973 998 965]; 
Current_Day1 = [0.11 0.44 0.44 0.45 0.56]; 
Current_Day2 = [0.41 0.34 0.43 0.55 0.75]; 
Current_Day3 = [0.34 0.98 0.34 0.76 0.71]; 
Day1 = [Temperature_Day1; SolarRadiation_Day1]; % 2-by-5 
Day2 = [Temperature_Day2; SolarRadiation_Day2]; % 2-by-5 
Day3 = [Temperature_Day3; SolarRadiation_Day3]; % 2-by-5 

%% training input and training target 
Training_Input = [Day1; Day2; Day3]; % 6-by-5 
Training_Target = [Current_Day1; Current_Day2; Current_Day3]; % 3-by-5 

%% training the network 
hiddenLayers= 2; 
net = newcf(Training_Input, Training_Target, hiddenLayers); 
y = sim(net, Training_Input); 
net.trainParam.epochs = 100; 
net = train(net, Training_Input, Training_Target); 

%% initialize data for prediction 
Temperature_Day4 = [45 23 22 11 24]; 
SolarRadiation_Day4 = [960 984 980 993 967]; 
Current_Day4 = [0.14 0.48 0.37 0.46 0.77]; 
Day4 = [Temperature_Day4; SolarRadiation_Day4]; % 2-by-5 
Test_Input = [Day4; Day4; Day4]; % same dimension as Training_Input; subject to question 

%% prediction 
Predicted_Target = sim(net, Test_Input); % yields 3-by-5 

我的問題是:我如何用3天的數據訓練,然後預測第4天的目標是什麼?由於培訓和測試輸入必須具有相同的維度,因此我如何測試僅一天?這是通過連接三個相同的測試輸入數據集來解決的。但是,這也會爲預測目標產生3個不同的數據集。

什麼是正確的做法?

順便說一句:我已經看過這種類型的問題多次,但答案永遠不會令人滿意,因爲他們總是建議改變測試輸入的尺寸而不考慮問題的性質(也就是說只有一個數據集是可用於測試)。所以請不要將其標記爲重複。

+0

我認爲溫度,太陽輻射和電流的數據是按照預定的時間間隔進行的,並且您希望將讀數的時間作爲特徵保持正確? – beaker

+0

是的,這是正確的。在我的原始代碼中,每天都有更多的樣本,但爲了簡單起見,我將其減少了。 –

回答

1

您的網絡的功能是TemperatureSolarRadiation,每個功能都在一天中的特定時間進行。讀取這些讀數的那一天是無關緊要的(否則在給定第1-3天的數據的情況下,您將無法預測第4天的產出)。

這意味着我們可以簡單地通過連接天分別通過每個觀察水平(以及類似地用於目標數據):

Training_Input = [Day1, Day2, Day3]; % 2-by-15 
Training_Target = [Current_Day1, Current_Day2, Current_Day3]; % 1-by-15 

將所得網絡會給你每觀察中的一個輸出(Current)在測試集,所以你不需要複製:

Day4 = [Temperature_Day4; SolarRadiation_Day4]; % 2-by-5 
Test_Input = [Day4]; % 2-by-5 

PredictedTarget現在將1×5顯示了預測Current爲每個測試觀察。


你可能會考慮增加第三個特徵作爲輸入到您的網代表在其採取的每項觀察的時間。假設你有哪些觀測的(因此,length(Temperature) == length(SolarRadiation) == t所有天)和觀察s是在每天的同一時間拍攝的每一天t時隙,您可以添加一個功能叫做TimeSlot

TimeSlot_Day1 = 1:numel(Temperature_Day1); 
TimeSlot_Day2 = 1:numel(Temperature_Day2); 
TimeSlot_Day3 = 1:numel(Temperature_Day3)]; 
Day1 = [Temperature_Day1; SolarRadiation_Day1; TimeSlot_Day1]; % 3-by-5 
Day2 = [Temperature_Day2; SolarRadiation_Day2; TimeSlot_Day2]; % 3-by-5 
Day3 = [Temperature_Day3; SolarRadiation_Day3; TimeSlot_Day3]; % 3-by-5