一、簡述
1.循環神經網絡
循環神經網絡(RNN)是一種用于處理序列數據的神經網絡。不同于傳統的前饋神經網絡,RNN在隱藏層中加入了自反饋連接,使得網絡能夠對序列中的每個元素執行相同的操作,同時保持一個“記憶”狀態,這個狀態會隨著序列的推進而更新。
循環神經網絡由輸入層、隱藏層、輸出層組成。輸入層接受傳入數據;隱藏層既接收當前時刻的輸入,也接收上一時刻隱藏層的狀態作為額外輸入,這種結構允許RNN對序列中的每個元素執行相同的操作,同時保持一個“記憶”狀態,這個狀態會隨著序列的推進而更新;輸出層基于隱藏層的狀態生成輸出。
訓練過程使用隨時間反向傳播的方法,按照標準的反向傳播算法進行權重更新,并對每個時間步都執行誤差反傳和權重更新。
2.長短期記憶網絡
長短期記憶網絡是循環神經網絡的一種特殊形式,用于解決傳統循環神經網絡在處理長時間依賴時遇到的梯度消失或爆炸問題。
通過引入細胞狀態和門控機制來控制信息的流動:輸入門決定哪些值將被更新到細胞狀態;遺忘門決定從細胞狀態中丟棄哪些信息;輸出門決定下一個隱藏狀態的內容。這樣的設計使LSTM能夠在長時間跨度內保留重要的信息,同時也能夠選擇性地忘記不相關的信息。
二、應用
1.預測一個數據
clear
clc%設置時間序列,代表數據中的每個時間點
time = 1:20;
%設置目標預測時間點
target_time = 21;%初始化數據數組,包含20個時間點的數據值
data = [0.845, 2.673, 0.215, 1.456, 2.987, 1.322, 0.653, 2.134, 1.567, 0.954, 2.456, 0.342, 1.789, 2.235, 0.789, 1.123, 2.567, 0.456, 1.890, 2.034];%用layrecnet函數創建一個循環神經網絡,第一個參數是輸入層數,第二個參數是隱藏層大小,即神經元的數量
net = layrecnet(1,10);%將data轉換成序列格式以便于循環神經網絡處理
%用con2seq函數將普通數值數組轉換為cell數組格式
input_seq = con2seq(data');%目標序列與輸入序列相同,用之前的數據點來預測下一個數據點
target_seq = con2seq(data');%用train函數訓練循環神經網絡
%輸入參數為循環神經網絡模型、輸入序列和目標序列,返回訓練后的網絡模型
net = train(net, input_seq, target_seq);%用sim函數使用訓練好的模型對輸入序列進行預測,返回預測結果的序列形式
sim_y = sim(net, input_seq);%用cell2mat函數將預測結果由cell數組格式轉換為普通數值數組
sim_Y = cell2mat(sim_y);%繪圖
figure;
%在同一圖中繪制多個曲線
hold on;%繪制原始訓練數據的折線圖
%LineWidth設置線條寬度,MarkerSize設置標記大小,DisplayName顯示圖例名稱
plot(time, data, 'o-', 'LineWidth', 1.5, 'MarkerSize', 8, 'DisplayName', '訓練數據');%繪制預測結果
%使用'sim_Y(end)'獲取最后一個預測值
plot(target_time, sim_Y(end), 'ro', 'MarkerSize', 10, 'DisplayName', '預測結果');xlabel('時間');ylabel('結果');% 添加圖例,'Location', 'best'讓MATLAB自動選擇圖例的最佳位置。
legend('Location', 'best');% 設置圖表標題。
title('預測');
hold off;
?
2.預測多個數據
clear
clc%設置時間序列,代表數據中的每個時間點
time = 1:20;%設置目標預測時間點
target_time = 21 :25;%初始化數據數組,包含了20個時間點的數據值
data = [0.845, 2.673, 0.215, 1.456, 2.987, 1.322, 0.653, 2.134, 1.567, 0.954, 2.456, 0.342, 1.789, 2.235, 0.789, 1.123, 2.567, 0.456, 1.890, 2.034];%輸入序列X是原始數據中除了最后一個元素的所有元素,長度比原始序列少一個元素
X = data(1 : end-1);%目標序列Y是原始數據中除了第一個元素的所有元素,與輸入序列相對應,用于監督學習
Y = data(2:end);%將輸入和目標數據轉換為序列格式
%'con2seq'函數將數值向量轉換為cell數組
X = con2seq(X);
Y = con2seq(Y);%創建循環神經網絡模型
%設置隱藏層神經元的數量
hiddenUnits = 10; %創建具有1個輸入層和指定數量隱藏單元的遞歸神經網絡。
net = layrecnet(1, hiddenUnits);%配置訓練參數
%顯示訓練進度窗口
net.trainParam.showWindow = true;
%設置最大迭代次數為100
net.trainParam.epochs = 100;%訓練RNN模型
[net,tr] = train(net, X, Y);%將最后一個數據點轉換為cell類型,用于初始化預測過程
lastInput = num2cell(data(end));%初始化存儲預測結果和誤差的變量
predicted_data = [];
errors = []; % 存儲誤差值%對于每一個目標預測時間點,執行預測過程。
for i = 1:numel(target_time)%使用訓練好的模型進行預測,結果保留三位有效數字prediction = round(cell2mat(sim(net, lastInput)), 3, 'significant');%計算誤差error = abs(prediction - cell2mat(lastInput));%將當前預測結果和誤差拼接到相應的列表中predicted_data = [predicted_data, prediction];errors = [errors, error];%更新lastInput為新的預測值,用于下一次循環預測lastInput = {prediction};
end%繪圖
%繪制訓練集和預測結果,藍色表示訓練數據,紅色表示預測數據
figure
hold on
%繪制訓練數據
plot(time, data, 'b')
%繪制預測數據
plot(target_time, predicted_data, 'r')
xlabel('年份')
ylabel('溫度')
legend('訓練數據', '預測數據')%用mean函數計算平均絕對誤差
MAE = mean(errors);
?