%% 清空环境变量
%作者:程序小怪的小课堂
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
warning off
%随机数种子固定结果
rng(2222)
%% 导入数据
res = readmatrix('回归数据.xlsx');
%% 数据归一化 索引
innum = input('你的输入个数为:');
number = input('你的输出个数为:');
X = res(:,1:end-number);
Y = res(:,end-number+1:end);
[x,psin] = mapminmax(X', 0, 1);
%保留归一化后相关参数
[y, psout] = mapminmax(Y', 0, 1);
%% 划分训练集和测试集
num = size(res,1);%总样本数
k = input('是否打乱样本(是:1,否:0):');
if k == 0
state = 1:num; %不打乱样本
else
state = randperm(num); %打乱样本
end
ratio = 0.8; %训练集占比
train_num = floor(num*ratio);
test_num = num-train_num;
x_train0 = x(:,state(1: train_num));
y_train = y(:,state(1: train_num))';
x_test0 = x(:,state(train_num+1: end));
y_test = y(:,state(train_num+1: end))';
%% 适应格式 cell
for i = 1 : train_num
x_train{i, 1} = x_train0(:,i);
end
for i = 1 : num-train_num
x_test{i, 1} = x_test0(:,i);
end
%% 创建模型
layers = [
sequenceInputLayer(innum) % 建立输入层
bilstmLayer(4, 'OutputMode', 'last') %bilstm
reluLayer % Relu激活层
fullyConnectedLayer(number) % 全连接层
regressionLayer]; % 回归层
%% 参数设置
options = trainingOptions('adam', ... % Adam 梯度下降算法
'MaxEpochs', 1000, ... % 最大迭代次数
'InitialLearnRate', 0.01, ... % 初始学习率为 0.01
'LearnRateSchedule', 'piecewise', ... % 学习率下降
'LearnRateDropFactor', 0.1, ... % 学习率下降因子
'LearnRateDropPeriod', 800, ... % 经过 800 次训练后 学习率为 0.01 * 0.1
'Shuffle', 'every-epoch', ... % 每次训练打乱数据集
'Plots', 'training-progress', ... % 画出曲线
'Verbose',true); %观察进度
%% 训练模型
net = trainNetwork(x_train, y_train, layers, options);
%% 仿真预测
re1 = predict(net, x_train);
re2 = predict(net, x_test );
%% 数据反归一化
%实际值
Y_train = Y(state(1: train_num),:)';
Y_test = Y(state(train_num+1:end),:)';
%预测值
pre1 = mapminmax('reverse', re1', psout);
pre2 = mapminmax('reverse', re2', psout);
%% 循环分别计算y
for i=1:number
disp(' ')
disp(' ')
disp(['第',num2str(i),'个输出指标'])
p1 = pre1(i,:);
p2 = pre2(i,:);
Y_tr = Y_train(i,:);
Y_te = Y_test(i,:);
%% 均方根误差
error1 = sqrt(mean((p1 - Y_tr).^2));
error2 = sqrt(mean((p2 - Y_te).^2));
%% 相关指标计算
% R2
R1 = 1 - norm(Y_tr - p1)^2 / norm(Y_tr - mean(Y_tr))^2;
R2 = 1 - norm(Y_te - p2)^2 / norm(Y_te - mean(Y_te ))^2;
% MAE
mae1 = mean(abs(Y_tr - p1 ));
mae2 = mean(abs(p2 - Y_te ));
disp('训练集预测精度指标如下:')
disp(['训练集数据的R2为:', num2str(R1)])
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['训练集数据的RMSE为:', num2str(error1)])
disp('测试集预测精度指标如下:')
disp(['测试集数据的R2为:', num2str(R2)])
disp(['测试集数据的MAE为:', num2str(mae2)])
disp(['测试集数据的RMSE为:', num2str(error2)])
figure
plot(1: train_num, Y_tr, 'r-^', 1: train_num, p1, 'b-+', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('样本点')
ylabel('预测值')
title('训练集预测结果对比')
%%画图
figure
plot(1: test_num, Y_te, 'r-^', 1: test_num, p2, 'b-+', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('样本点')
ylabel('预测值')
title('测试集预测结果对比')
%% 训练集百分比误差图
figure
plot((p1 - Y_tr )./Y_tr, 'b-o', 'LineWidth', 1)
legend('百分比误差')
xlabel('样本点')
ylabel('误差')
title('训练集百分比误差曲线')
%% 测试集百分比误差图
figure
plot((p2 - Y_te )./Y_te, 'b-o', 'LineWidth', 1)
legend('百分比误差')
xlabel('样本点')
ylabel('误差')
title('测试集百分比误差曲线')
%% 拟合图
figure;
plotregression(Y_tr, p1, '训练集', ...
Y_te, p2, '测试集');
set(gcf,'Toolbar','figure');
end
%% 新数据预测
newdata = xlsread("新的多输入.xlsx");
newy = newpre(newdata,psin,psout,net);
%保存数据
xlswrite("新的输出.xlsx",newy')
function y = newpre(newdata,psin,psout,model)
%归一化
x= mapminmax('apply',newdata',psin);
%% 适应格式
for i = 1 : size(x,2)
x_new{i, 1} = x(:,i);
end
%预测
pre = predict(model,x_new);
%反归一化
y = mapminmax('reverse',pre',psout);
end
基于双向长短期记忆网络biLSTM的多输出回归预测(含新数据预测)
需积分: 0 116 浏览量
更新于2025-02-02
收藏 52KB ZIP 举报
神经网络作为人工智能领域中模拟人脑神经元结构的一种计算模型,已经在图像识别、自然语言处理、预测分析等多个领域取得了显著的成就。其中,双向长短期记忆网络(biLSTM)是一种特殊的循环神经网络(RNN),其结构设计允许信息在两个方向上流动,从而能够更好地捕捉序列数据中的时间依赖关系。多输出回归预测是指模型输出为多个连续值,每个输出对应于输入数据的不同预测目标。
在机器学习的应用场景中,多输出回归预测模型特别适用于需要同时预测多个连续变量的场合,例如金融市场中股票价格的波动、气候变化对作物生长周期的影响预测等。通过biLSTM网络的多输出预测,可以更全面地对复杂系统的行为进行建模和预测。
在利用biLSTM进行多输出回归预测时,首先需要对网络进行训练,这通常涉及以下几个步骤:数据预处理、模型设计、训练与优化、模型评估以及新数据的预测。数据预处理包括对输入数据进行归一化、去除噪声、划分训练集和测试集等操作,以确保模型能够从数据中学习到有效的信息。模型设计则需要确定合适的网络结构和参数,比如层数、隐藏单元数、激活函数等,以适应特定的预测任务。训练与优化阶段主要是利用训练数据来调整网络权重,常用的优化算法包括梯度下降及其变种。模型评估阶段则通过测试集对模型的预测性能进行检验,常用的评估指标有均方误差(MSE)、均方根误差(RMSE)等。
在模型训练完成后,即可利用其对新数据进行预测。由于biLSTM具有记忆以往信息的能力,即使在面对新的序列输入时,也能利用学到的历史信息对未来的趋势进行预测。这种预测对于决策支持系统、风险管理和预警机制等方面具有重要的应用价值。
值得注意的是,在使用biLSTM进行多输出回归预测时,应当注意避免过拟合现象的发生,这通常可以通过正则化技术、早停法(early stopping)和合理设置dropout比例等方法来实现。另外,模型的解释性也是实际应用中需要考虑的问题,尽管深度学习模型通常被认为是“黑箱”模型,但在一些要求高透明度的领域,如何解释模型的预测结果同样重要。
机器学习biLSTM预测方法已经广泛应用于各个领域,并且在处理具有时间序列特征的数据时表现出色。例如,在自然语言处理中,biLSTM能够捕捉到句子中长距离的依赖关系,因此在语言模型、情感分析、机器翻译等方面有着广泛的应用。在生物信息学中,biLSTM也被用来分析基因序列,预测蛋白质结构等。而在工业生产中,biLSTM可以用于设备的故障预测、产量预测等。
总结而言,基于双向长短期记忆网络biLSTM的多输出回归预测模型结合了深度学习在数据处理上的优势和RNN对时间序列数据的处理能力,为复杂系统的多目标预测提供了新的解决方案。通过对该技术的深入研究和实践应用,可以在更多领域实现有效的预测分析,为相关决策提供科学依据。


m0_46788769
- 粉丝: 0
最新资源
- 《计算机犯罪案件侦查》课程体系研究.docx
- 小型项目管理师试卷.doc
- 嵌入式计算机技术的应用发展.docx
- 基于云计算的数据库技术.docx
- 以培养职业能力为导向的大作业驱动的实践性教学项目设计-以《数据库原理及应用》课程为例.docx
- 以实践创新能力培养为核心的信管专业(医学)计算机实践类课程群建设的讨论.docx
- 使用SURFER软件绘制雨量等值线图.doc
- 单片机的出租车计费器的研究与设计开发.doc
- C#开发中webBrowser控件和窗体通信案例研究.docx
- 旅游管理系统软件设计规格说明书.doc
- 2017年软考网络工程师笔记.docx
- 基于Jfinal+Shiro框架的Web应用系统开发研究.docx
- 第一节腔肠动物扁形动物MicrosoftPowerPoint演示文稿.ppt
- 超声波自动化探伤在钢材检测中的应用.docx
- 计算机网络病毒的传播与防范措施.docx
- 很全的综合布线方案.doc