数学建模: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);
相关推荐
go54631584657 小时前
中文语音识别与偏误检测系统开发
开发语言·人工智能·学习·生成对抗网络·数学建模·语音识别
shenghaide_jiahu10 小时前
数学建模——线性规划类题目(运筹优化类)
线性代数·数学建模
pk_xz1234561 天前
光电二极管探测器电流信号处理与指令输出系统
人工智能·深度学习·数学建模·数据挖掘·信号处理·超分辨率重建
Better Rose1 天前
2025年“创新杯”(原钉钉杯) A题 建模思路
人工智能·数学建模·钉钉
RS_数模加油站1 天前
2025创新杯(钉钉杯)数学建模 AB赛题已出
数学建模·钉钉杯·创新杯
行然梦实2 天前
论文阅读:《针对多目标优化和应用的 NSGA-II 综述》一些关于优化算法的简介
论文阅读·算法·数学建模
行然梦实3 天前
论文阅读:《无约束多目标优化的遗传算法,群体和进化计算》
论文阅读·算法·数学建模
您好啊数模君4 天前
30天打牢数模基础-决策树讲解
决策树·数学建模·2025数学建模国赛
仟濹4 天前
【数学建模|Matlab】Matlab「基础知识」和「基础操作」
数学建模·matlab
pk_xz1234564 天前
厌氧菌数据挖掘可行性评估报告
人工智能·深度学习·神经网络·数学建模·数据挖掘·超分辨率重建