%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
%% 导入数据
result = xlsread('data.xlsx');
%% 数据分析
num_samples = length(result); % 样本个数
or_dim = size(result, 2); % 原始特征+输出数目
kim = 6; % 延时步长(kim个历史数据作为自变量)
zim = 1; % 跨zim个时间点进行预测
%% 划分数据集
for i = 1: num_samples - kim - zim + 1
res(i, :) = [reshape(result(i: i + kim - 1, :), 1, kim * or_dim), result(i + kim + zim - 1, :)];
end
%% 数据集分析
outdim = 1; % 最后一列为输出
num_size = 0.7; % 训练集占数据集比例
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim; % 输入特征维度
%% 划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);
%% 数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
%% 优化算法参数设置
SearchAgents_no = 5; % 种群数量
Max_iteration = 5; % 最大迭代次数
dim = 3; % 优化参数个数
lb = [1e-3, 10, 1e-3]; % 参数取值下界(学习率,隐藏层节点,正则化系数)
ub = [1e-2, 30, 1e-2]; % 参数取值上界(学习率,隐藏层节点,正则化系数)
fitness = @(x)fical(x,p_train,t_train,f_);
[Best_score,Best_pos,Convergence_curve]=GA(SearchAgents_no,Max_iteration,lb ,ub,dim,fitness)
%% 记录最佳参数
Best_pos(1, 2) = round(Best_pos(1, 2));
best_lr = Best_pos(1, 1);
best_hd = Best_pos(1, 2);
best_l2 = Best_pos(1, 3);
%% 建立模型
% ---------------------- 修改模型结构时需对应修改fical.m中的模型结构 --------------------------
layers = [
sequenceInputLayer(f_) % 输入层
lstmLayer(best_hd) % LSTM层
reluLayer % Relu激活层
fullyConnectedLayer(outdim) % 输出回归层
regressionLayer];
%% 参数设置
% ---------------------- 修改模型参数时需对应修改fical.m中的模型参数 --------------------------
options = trainingOptions('adam', ... % Adam 梯度下降算法
'MaxEpochs', 100, ... % 最大训练次数
'MiniBatchSize',128, ... % 批处理次数
'InitialLearnRate', best_lr, ... % 初始学习率 best_lr
'LearnRateSchedule', 'piecewise', ... % 学习率下降
'LearnRateDropFactor', 0.5, ... % 学习率下降因子 0.1
'LearnRateDropPeriod', 50, ... % 经过50次训练后 学习率为 best_lr * 0.5
'Shuffle', 'every-epoch', ... % 每次训练打乱数据集
'ValidationPatience', Inf, ... % 关闭验证
'L2Regularization', best_l2, ... % 正则化参数
'Plots', 'training-progress', ... % 画出曲线
'Verbose', 1);
%% 训练模型
net = trainNetwork(p_train, t_train, layers, options);
%% 仿真验证
t_sim1 = predict(net, p_train);
t_sim2 = predict(net, p_test );
%% 数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
T_sim1=double(T_sim1);
T_sim2=double(T_sim2);
%% 绘图
figure
plot(1 : length(Convergence_curve), Convergence_curve,'linewidth',1.5);
title('GA-LSTM', 'FontSize', 10);
xlabel('迭代次数', 'FontSize', 10);
ylabel('适应度值mse', 'FontSize', 10);
grid off
%% 测试集结果
% figure;
% plotregression(T_test,T_sim2,['回归图']);
% figure;
% ploterrhist(T_test-T_sim2,['误差直方图']);
%% 均方根误差 RMSE
error1 = sqrt(sum((T_sim1 - T_train).^2)./M);
error2 = sqrt(sum((T_test - T_sim2).^2)./N);
%%
% R2 决定系数
R1 = 1 - norm(T_train - T_sim1)^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test - T_sim2)^2 / norm(T_test - mean(T_test ))^2;
%%
%均方误差 MSE
mse1 = sum((T_sim1 - T_train).^2)./M;
mse2 = sum((T_sim2 - T_test).^2)./N;
%%
%RPD 剩余预测残差
SE1=std(T_sim1-T_train);
RPD1=std(T_train)/SE1;
SE=std(T_sim2-T_test);
RPD2=std(T_test)/SE;
%% 平均绝对误差MAE
MAE1 = mean(abs(T_train - T_sim1));
MAE2 = mean(abs(T_test - T_sim2));
%% 平均绝对百分比误差MAPE
MAPE1 = mean(abs((T_train - T_sim1)./T_train));
MAPE2 = mean(abs((T_test - T_sim2)./T_test));
%% 训练集绘图
figure
plot(T_sim1,'-','Color',[255 0 0]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[250 0 0]./255)
hold on
plot(T_train,'-','Color',[150 150 150]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[150 150 150]./255)
legend( 'GA-LSTM拟合训练数据','实际分析数据','Location','NorthWest','FontName','华文宋体');
xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
string={'训练集预测结果对比';['(R^2 =' num2str(R1) ' RMSE= ' num2str(error1) ' MSE= ' num2str(mse1) ' RPD= ' num2str(RPD1) ')' ]};
title(string)
xlim([1 M])
%-------------------------------------------------------------------------------------
figure
plot(T_sim2,'-','Color',[0 0 255]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[0 0 255]./255)
hold on
plot(T_test,'-','Color',[0 0 0]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[0 0 0]./255)
legend('GA-LSTM预测测试数据','实际分析数据','Location','NorthWest','FontName','华文宋体');
xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
string={'测试集预测结果对比';['(R^2 =' num2str(R2) ' RMSE= ' num2str(error2) ' MSE= ' num2str(mse2) ' RPD= ' num2str(RPD2) ')']};
title(string)
xlim([1 N])
%% 绘制线性拟合图
%% 训练集拟合效果图
figure
plot(T_train,T_sim1,'*r');
xlabel('真实值')
ylabel('预测值')
string = {'训练集效果图';['R^2_c=' num2str(R1) ' RMSEC=' num2str(error1) ]};
title(string)
hold on ;h=lsline;
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])
%% 预测集拟合效果图
figure
plot(T_test,T_sim2,'ob');
xlabel('真实值')
ylabel('预测值')
string1 = {'测试集效果图';['R^2_p=' num2str(R2) ' RMSEP=' num2str(error2) ]};
title(string1)
hold on ;h=lsline();
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])
%% 求平均
R3=(R1+R2)./2;
error3=(error1+error2)./2;
%% 总数据线性预测拟合图
tsim=[T_sim1,T_sim2]';
S=[T_train,T_test]';
figure
plot(S,tsim,'ob');
xlabel('真实值')
ylabel('预测值')
string1 = {'所有样本拟合预测图';['R^2_p=' num2str(R3) ' RMSEP=' num2str(error3) ]};
title(string1)
hold on ;h=lsline();
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])
%% 打印出评价指标
disp(['-----------------------误差计算--------------------------'])
disp(['评价结果如下所示:'])
disp(['平均绝对误差MAE为:',num2str(MAE2)])
disp(['均方误差MSE为: ',num2str(mse2)])
disp(['均方根误差RMSEP为: ',num2str(error2)])
disp(['决定系数R^2为: ',num2str(R2)])
disp(['剩余预测残差RPD为: ',num2str(RPD2)])
disp(['平均绝对百分比误差MAPE为: ',num2str(MAPE2)])
grid
前程算法屋
- 粉丝: 6147
- 资源: 834
最新资源
- 基于java+ssm+mysql+微信小程序的插画共享平台 源码+数据库+论文(高分毕设项目).zip
- 基于java+ssm+mysql+微信小程序的车视界小程序 源码+数据库+论文(高分毕设项目).zip
- 基于java+ssm+mysql+微信小程序的场地预约系统 源码+数据库+论文(高分毕设项目).zip
- 基于java+ssm+mysql+微信小程序的宠物店商城小程序 源码+数据库+论文(高分毕设项目).zip
- 基于java+ssm+mysql+微信小程序的答题小程序 源码+数据库+论文(高分毕设项目).zip
- 基于java+ssm+mysql+微信小程序的村游网站系统 源码+数据库+论文(高分毕设项目).zip
- 欧姆龙NJ NX系列利用POD映射扩展轴功能块与应用案例:多轴控制拓展至更高轴数(超越传统限制),欧姆龙NJ NX使用POD映射拓展轴功能块与应用案例,可以在原有轴数(8.16.32.64)基础上实现
- 基于java+ssm+mysql+微信小程序的宠物寄养平台 源码+数据库+论文(高分毕设项目).zip
- 基于java+ssm+mysql+微信小程序的打印室预约系统 源码+数据库+论文(高分毕设项目).zip
- 基于java+ssm+mysql+微信小程序的大学生社团活动管理系统 源码+数据库+论文(高分毕设项目).zip
- ESP32在Espressif-IDE中集成与使用Wokwi仿真技术详解
- 基于java+ssm+mysql+微信小程序的点餐系统 源码+数据库+论文(高分毕设项目).zip
- 基于Matlab Simulink的空气悬架模块化非线性建模:精细化仿真,整车动力学学习的好帮手,空气悬架建模 软件使用:Matlab Simulink 适用场景:采用模块化建模方法,搭建非线性空气悬
- 基于java+ssm+mysql+微信小程序的高校党费收缴系统 源码+数据库+论文(高分毕设项目).zip
- C# Windows窗体图书管理系统:远程操作,含文档,实现数据库增删查改与登录注册功能,支持图片上传,C#Windows窗体开发的图书管理系统,可远程,有文档,供学习参考使用,主要功能:涵盖数据库增
- 基于java+ssm+mysql+微信小程序的高校暑期社会实践小程序 源码+数据库+论文(高分毕设项目).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈