数学建模:MATLAB循环神经网络

一、简述

1.循环神经网络

循环神经网络(RNN)是一种用于处理序列数据的神经网络。不同于传统的前馈神经网络,RNN在隐藏层中加入了自反馈连接 ,使得网络能够对序列中的每个元素执行相同的操作,同时保持一个"记忆"状态,这个状态会随着序列的推进而更新。

循环神经网络由输入层、隐藏层、输出层组成。输入层接受传入数据;隐藏层既接收当前时刻的输入,也接收上一时刻隐藏层的状态作为额外输入,这种结构允许RNN对序列中的每个元素执行相同的操作,同时保持一个"记忆"状态,这个状态会随着序列的推进而更新;输出层基于隐藏层的状态生成输出。

训练过程使用随时间反向传播的方法,按照标准的反向传播算法进行权重更新,并对每个时间步都执行误差反传和权重更新。

2.长短期记忆网络

长短期记忆网络是循环神经网络的一种特殊形式,用于解决传统循环神经网络在处理长时间依赖时遇到的梯度消失或爆炸问题。

通过引入细胞状态和门控机制来控制信息的流动:输入门决定哪些值将被更新到细胞状态;遗忘门决定从细胞状态中丢弃哪些信息;输出门决定下一个隐藏状态的内容。这样的设计使LSTM能够在长时间跨度内保留重要的信息,同时也能够选择性地忘记不相关的信息。

二、应用

1.预测一个数据

Matlab 复制代码
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.预测多个数据

Matlab 复制代码
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);
相关推荐
热心网友俣先生15 小时前
2025年深圳杯D题第一版本matlab代码 论文分享
人工智能·数学建模
How_doyou_do1 天前
项目实战-25年美赛MCM/ICM-基于数学建模与数据可视化的动态系统模型
python·数学建模·数据可视化
瑞雪兆丰年兮1 天前
数学实验(Matlab语言环境和线性代数实验)
算法·数学建模·matlab·数学实验
灏瀚星空2 天前
深度学习之LSTM时序预测:策略原理深度解析及可视化实现
python·深度学习·神经网络·算法·机器学习·数学建模·lstm
lynne2332 天前
计算广告-广告智能出价原理-出价的数学建模
数学建模
人大博士的交易之路2 天前
今日行情明日机会——20250507
大数据·数学建模·数据挖掘·缠论·缠中说禅·涨停回马枪
灏瀚星空2 天前
深度学习之LSTM时序预测入门指南:从原理到实战
人工智能·python·深度学习·神经网络·机器学习·数学建模·lstm
homelook3 天前
4电池_基于开关电容的均衡
数学建模
数据系的公考小白3 天前
2025五一杯数学建模C题代码分享
python·数学建模·pandas·五一杯
小文数模4 天前
2025深圳杯东三省数学建模竞赛B题完整分析论文(共27页)(含模型、可运行代码、求解结果)
python·数学建模·matlab