一、简述
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);