%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
%% 导入数据(时间序列的单列数据)
result = xlsread('data.xlsx');
%% 数据分析
num_samples = length(result); % 样本个数
kim = 15; % 延时步长(kim个历史数据作为自变量)
zim = 1; % 跨zim个时间点进行预测
%% 划分数据集
for i = 1: num_samples - kim - zim + 1
res(i, :) = [reshape(result(i: i + kim - 1), 1, kim), 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);
%% 划分训练集和测试集
M = size(P_train, 2);
N = size(P_test, 2);
%% 数据平铺
% 将数据平铺成1维数据只是一种处理方式
% 也可以平铺成2维数据,以及3维数据,需要修改对应模型结构
% 但是应该始终和输入层数据结构保持一致
P_train = double(reshape(P_train,f_, 1, 1, M));
P_test = double(reshape(P_test ,f_, 1, 1, N));
t_train = t_train';
t_test = t_test' ;
%% 数据格式转换
for i = 1 : M
p_train{i, 1} = P_train(:, :, 1, i);
end
for i = 1 : N
p_test{i, 1} = P_test( :, :, 1, i);
end
%% 优化函数
fobj = @(x)fical(x);
%% 优化算法参数设置
pop = 5; % 数量
Max_iter = 8; % 最大迭代次数
dim = 3; % 优化参数个数
lb = [1e-3, 32, 1e-3]; % 参数取值下界(学习率,批大小,正则化系数)
ub = [1e-2, 64, 1e-1]; % 参数取值上界(学习率,批大小,正则化系数)
%% 优化
[Best_score,Best_pos, curve] = PSO(pop, Max_iter, lb, ub, dim, fobj);
%% 记录最佳参数
Best_pos(2)=round(Best_pos(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, 'OutputMode', 'last') % LSTM层
reluLayer % Relu激活层
dropoutLayer(0.2) % Dropout层
fullyConnectedLayer(1) % 全连接层
regressionLayer]; % 回归层
%% 参数设置
% ---------------------- 修改模型参数时需对应修改fical.m中的模型参数 --------------------------
options = trainingOptions('adam', ... % Adam 梯度下降算法
'MaxEpochs', 100, ... % 最大训练次数 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', false);
%% 训练模型
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(1)
plot(1 : length(curve), curve,'linewidth',1.5);
title('PSO-LSTM', 'FontSize', 10);
xlabel('迭代次数', 'FontSize', 10);
ylabel('适应度值', 'FontSize', 10);
grid off
%% 均方根误差 RMSE
error1 = sqrt(sum((T_sim1 - T_train).^2)./M);
error2 = sqrt(sum((T_test - T_sim2).^2)./N);
%%
%决定系数
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(1:M,T_train,'r-*',1:M,T_sim1,'b-o','LineWidth',1)
plot(1:M,T_train,'r-*',1:M,T_sim1,'b-o','LineWidth',1.5)
legend('真实值','PSO-LSTM预测值')
xlabel('预测样本')
ylabel('预测结果')
string={'训练集预测结果对比';['(R^2 =' num2str(R1) ' RMSE= ' num2str(error1) ' MSE= ' num2str(mse1) ' RPD= ' num2str(RPD1) ')' ]};
title(string)
%% 预测集绘图
figure
plot(1:N,T_test,'r-*',1:N,T_sim2,'b-o','LineWidth',1.5)
legend('真实值','PSO-LSTM预测值')
xlabel('预测样本')
ylabel('预测结果')
string={'测试集预测结果对比';['(R^2 =' num2str(R2) ' RMSE= ' num2str(error2) ' MSE= ' num2str(mse2) ' RPD= ' num2str(RPD2) ')']};
title(string)
%% 测试集误差图
figure
ERROR3=T_test-T_sim2;
plot(T_test-T_sim2,'b-*','LineWidth',1.5)
xlabel('测试集样本编号')
ylabel('预测误差')
title('测试集预测误差')
grid on;
legend('PSO-LSTM预测值预测输出误差')
%% 打印出评价指标
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
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Matlab基于PSO-LSTM粒子群算法优化长短期记忆网络的时间序列预测,PSO-LSTM时间序列预测(完整程序和数据) 优化参数为学习率,隐藏层节点个数,正则化参数,要求2018b及以上版本,matlab代码。 评价指标包括:R2、MAE、MSE、RMSE和MAPE等,代码质量极高,方便学习和替换数据。
资源推荐
资源详情
资源评论
收起资源包目录
时序预测:PSO-LSTM.zip (10个子文件)
PSO-LSTMTS3.png 48KB
PSO-LSTMTS4.png 20KB
PSO-LSTMTS.zip 20KB
PSO-LSTMTS1.png 42KB
PSO-LSTMTS
fical.m 2KB
initialization.m 427B
main.m 6KB
PSO.m 2KB
data.xlsx 18KB
PSO-LSTMTS2.png 46KB
共 10 条
- 1
机器学习之心
- 粉丝: 2w+
- 资源: 1089
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- HTML5实现好看的房屋格局设计公司网页源码.zip
- HTML5实现好看的非主流美发时尚网站源码.zip
- HTML5实现好看的粉红色装修企业网站源码.zip
- HTML5实现好看的粉红色大气办公网站源码.zip
- HTML5实现好看的风能工业设备公司网站源码.zip
- HTML5实现好看的粉色响应式瑜伽网站源码.zip
- HTML5实现好看的风力发电站电能网站源码.zip
- HTML5实现好看的高端酒店装修网站源码.zip
- HTML5实现好看的服装鞋帽购物商城网站源码.zip
- HTML5实现好看的干净的报纸杂志网页源码.zip
- HTML5实现好看的个性的个人相册网页源码.zip
- HTML5实现好看的高端桑拿会所响应式网页源码.zip
- HTML5实现好看的高尔夫球运动网站源码.zip
- HTML5实现好看的工业信息化网站源码.zip
- HTML5实现好看的工业建筑响应式网页源码.zip
- HTML5实现好看的工业制造业门户网站源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页