机器学习之MATLAB代码--IWOA_BILSTM基于改进鲸鱼算法优化的BiLSTM预测算法(十六)

  • 代码
    • 数据
      • 结果

代码

1、

%% 基于改进鲸鱼算法优化的BiLSTM预测算法
clear;close all;
clc
rng('default')
%% 读取负荷数据
load('QLD1.mat')
data = QLD1(1:2000);
%序列的前 90% 用于训练,后 10% 用于测试
numTimeStepsTrain = floor(0.9*numel(data));
dataTrain = data(1:numTimeStepsTrain+1)';
dataTest = data(numTimeStepsTrain+1:end)';
%数据预处理,将训练数据标准化为具有零均值和单位方差。
mu = mean(dataTrain);
sig = std(dataTrain);
dataTrainStandardized = (dataTrain - mu) / sig;
%输入BiLSTM的时间序列交替一个时间步
XTrain = dataTrainStandardized(1:end-1);
YTrain = dataTrainStandardized(2:end);
%数据预处理,将测试数据标准化为具有零均值和单位方差。
mu = mean(dataTest);
sig = std(dataTest);dataTestStandardized = (dataTest - mu) / sig;
XTest = dataTestStandardized(1:end-1);
YTest = dataTestStandardized(2:end);
%%
%创建BiLSTM回归网络,指定BiLSTM层的隐含单元个数96*3
%序列预测,因此,输入一维,输出一维
numFeatures = 1;
numResponses = 1;
%% 定义改进鲸鱼算法优化参数
pop=5; %种群数量
Max_iteration=10; %  设定最大迭代次数
dim = 4;%维度,即BiLSTM网路包含的隐藏单元数目,最大训练周期,初始学习率,L2参数
lb = [20,50,10E-5,10E-6];%下边界
ub = [200,300,0.1,0.1];%上边界
fobj = @(x) fun(x,numFeatures,numResponses,XTrain,YTrain,XTest,YTest);[Best_score,Best_pos,IWOA_curve,netIWOA,pos_curve]=IWOA(pop,Max_iteration,lb,ub,dim,fobj); %开始优化figure
plot(IWOA_curve,'linewidth',1.5);
grid on
xlabel('迭代次数')
ylabel('适应度函数')
title('IWOA-BiLSTM适应度值曲线')figure
subplot(221)
plot(pos_curve(:,1),'linewidth',1.5);
grid on
xlabel('迭代次数')
ylabel('隐藏单元数目')
title('隐藏单元数目迭代曲线')
subplot(222)
plot(pos_curve(:,2),'linewidth',1.5);
grid on
xlabel('迭代次数')
ylabel('训练周期')
title('训练周期迭代曲线')
subplot(223)
plot(pos_curve(:,3),'linewidth',1.5);
grid on
xlabel('迭代次数')
ylabel('学习率')
title('学习率迭代曲线')
subplot(224)
plot(pos_curve(:,4),'linewidth',1.5);
grid on
xlabel('迭代次数')
ylabel('L2参数')
title('L2参数迭代曲线')
%训练集测试
PredictTrainIWOA = predict(netIWOA,XTrain, 'ExecutionEnvironment','gpu');
%测试集测试
PredictTestIWOA = predict(netIWOA,XTest, 'ExecutionEnvironment','gpu');
%训练集mse
mseTrainIWOA= mse(YTrain-PredictTrainIWOA);
%测试集mse
mseTestIWOA = mse(YTest-PredictTestIWOA);
%% IWOA-BiLSTM优化参数
numHiddenUnits = round(Best_pos(1));%BiLSTM网路包含的隐藏单元数目
maxEpochs = round(Best_pos(2));%最大训练周期
InitialLearnRate = Best_pos(3);%初始学习率
L2Regularization = Best_pos(4);%L2参数
%设置网络
layers = [ ...sequenceInputLayer(numFeatures)bilstmLayer(numHiddenUnits)fullyConnectedLayer(numResponses)regressionLayer];
%指定训练选项
options = trainingOptions('adam', ...'MaxEpochs',maxEpochs, ...'ExecutionEnvironment' ,'gpu',...'InitialLearnRate',InitialLearnRate,...'GradientThreshold',1, ...'L2Regularization',L2Regularization, ...'Plots','training-progress',...'Verbose',0);
%训练BiLSTM
[net,info] = trainNetwork(XTrain,YTrain,layers,options);
%% 训练过程识别准确度曲线
figure;
plot(info.TrainingRMSE,'Color',[0 0.5 1] );
ylabel('TrainingRMSE')
xlabel('Training Step');
title(['训练集均方根值']);
%% 训练过程损失值曲线
figure;
plot(info.TrainingLoss,'Color',[1 0.5 0] );
ylabel('Training Loss')
xlabel('Training Step');
title(['损失函数值' ]);
%% 基础BiLSTM测试
numHiddenUnits = 50;
layers = [ ...sequenceInputLayer(numFeatures)bilstmLayer(numHiddenUnits)fullyConnectedLayer(numResponses)regressionLayer];
%指定训练选项
options = trainingOptions('adam', ...'MaxEpochs',50, ...'ExecutionEnvironment' ,'gpu',...'GradientThreshold',1, ...'InitialLearnRate',0.001, ...'L2Regularization',0.0001,...'Plots','training-progress',...'Verbose',1);
%训练BiLSTM
net = trainNetwork(XTrain,YTrain,layers,options);
%训练集测试
PredictTrain = predict(net,XTrain, 'ExecutionEnvironment','gpu');
%测试集测试
PredictTest = predict(net,XTest, 'ExecutionEnvironment','gpu');
%训练集mse
mseTrain = mse(YTrain-PredictTrain);
%测试集mse
mseTest = mse(YTest-PredictTest);disp('-------------------------------------------------------------')
disp('IWOA-BiLSTM优化得到的最优参数为:')
disp(['IWOA-BiLSTM优化得到的隐藏单元数目为:',num2str(round(Best_pos(1)))]);
disp(['IWOA-BiLSTM优化得到的最大训练周期为:',num2str(round(Best_pos(2)))]);
disp(['IWOA-BiLSTM优化得到的InitialLearnRate为:',num2str((Best_pos(3)))]);
disp(['IWOA-BiLSTM优化得到的L2Regularization为:',num2str((Best_pos(4)))]);
disp('-------------------------------------------------------------')
disp('IWOA-BiLSTM结果:')
disp(['IWOA-BiLSTM训练集MSE:',num2str(mseTrainIWOA)]);
disp(['IWOA-BiLSTM测试集MSE:',num2str(mseTestIWOA)]);
disp('BiLSTM结果:')
disp(['BiLSTM训练集MSE:',num2str(mseTrain)]);
disp(['BiLSTM测试集MSE:',num2str(mseTest)]);%% 训练集结果绘图
errors=YTrain-PredictTrain;
errorsIWOA=YTrain-PredictTrainIWOA;MSE=mean(errors.^2);
RMSE=sqrt(MSE);
MSEIWOA=mean(errorsIWOA.^2);
RMSEIWOA=sqrt(MSEIWOA);error_mean=mean(errors);
error_std=std(errors);error_meanIWOA=mean(errorsIWOA);
error_stdIWOA=std(errorsIWOA);figure;
plot(YTrain,'k');
hold on;
plot(PredictTrain,'b');
plot(PredictTrainIWOA,'r');
legend('Target','BiLSTM','IWOA-BiLSTM');
title('训练集结果');
xlabel('Sample Index');
grid on;figure;
plot(errors);
hold on
plot(errorsIWOA);
legend('BiLSTM-Error','IWOA-BiLSTM-Eoor');
title({'训练集预测误差对比';['MSE = ' num2str(MSE), ', IWOA-MSE = ' num2str(MSEIWOA)]});
grid on;figure;
histfit(errorsIWOA, 50);
title(['Error Mean = ' num2str(error_mean), ', Error St.D. = ' num2str(error_std)]);
%% 测试集结果绘图
errors=YTest-PredictTest;
errorsIWOA=YTest-PredictTestIWOA;MSE=mean(errors.^2);
RMSE=sqrt(MSE);
MSEIWOA=mean(errorsIWOA.^2);
RMSEIWOA=sqrt(MSEIWOA);error_mean=mean(errors);
error_std=std(errors);error_meanIWOA=mean(errorsIWOA);
error_stdIWOA=std(errorsIWOA);figure;
plot(YTest,'k');
hold on;
plot(PredictTest,'b');
plot(PredictTestIWOA,'r');
legend('Target','BiLSTM','IWOA-BiLSTM');
title('测试集结果');
xlabel('Sample Index');
grid on;figure;
plot(errors);
hold on
plot(errorsIWOA);
legend('BiLSTM-Error','IWOA-BiLSTM-Eoor');
title({'测试集预测误差对比';['MSE = ' num2str(MSE), ', IWOA-MSE = ' num2str(MSEIWOA)]});
grid on;figure;
histfit(errorsIWOA, 50);
title(['Error Mean = ' num2str(error_mean) ', Error St.D. = ' num2str(error_std)]);

2、

%% [1]武泽权,牟永敏.一种改进的鲸鱼优化算法[J].计算机应用研究,2020,37(12):3618-3621.
function [Leader_score,Leader_pos,Convergence_curve,BestNet,pos_curve]=IWOA(SearchAgents_no,Max_iter,lb,ub,dim,fobj)
% initialize position vector and score for the leader
net = {};
Leader_pos=zeros(1,dim);
Leader_score=inf; %change this to -inf for maximization problems
%% 改进点:准反向初始化
Positions=initializationNew(SearchAgents_no,dim,ub,lb,fobj);
Convergence_curve=zeros(1,Max_iter);
t=0;% Loop counter
% Main loop
while t<Max_iterfor i=1:size(Positions,1)% Return back the search agents that go beyond the boundaries of the search spaceFlag4ub=Positions(i,:)>ub;Flag4lb=Positions(i,:)<lb;Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;% Calculate objective function for each search agent%         fitness=fobj(Positions(i,:));[fitness,net] =  fobj(Positions(i,:));% Update the leaderif fitness<Leader_score % Change this to > for maximization problemLeader_score=fitness; % Update alphaLeader_pos=Positions(i,:);endendBestNet = net;%% 改进点:非线性收敛因子a=2 - sin(t*pi/(2*Max_iter) + 0);% a2 linearly dicreases from -1 to -2 to calculate t in Eq. (3.12)a2=-1+t*((-1)/Max_iter);%% 改进点:自适应权重w = 1 - (exp(t/Max_iter) - 1)/(exp(1) -1);% Update the Position of search agentsfor i=1:size(Positions,1)r1=rand(); % r1 is a random number in [0,1]r2=rand(); % r2 is a random number in [0,1]A=2*a*r1-a;  % Eq. (2.3) in the paperC=2*r2;      % Eq. (2.4) in the paperb=1;               %  parameters in Eq. (2.5)l=(a2-1)*rand+1;   %  parameters in Eq. (2.5)p = rand();        % p in Eq. (2.6)for j=1:size(Positions,2)if p<0.5if abs(A)>=1rand_leader_index = floor(SearchAgents_no*rand()+1);X_rand = Positions(rand_leader_index, :);D_X_rand=abs(C*X_rand(j)-Positions(i,j)); % Eq. (2.7)Positions(i,j)=w*X_rand(j)-A*D_X_rand;      % 引入权重elseif abs(A)<1D_Leader=abs(C*Leader_pos(j)-Positions(i,j)); % Eq. (2.1)Positions(i,j)=w*Leader_pos(j)-A*D_Leader;       % 引入权重endelseif p>=0.5distance2Leader=abs(Leader_pos(j)-Positions(i,j));% Eq. (2.5)Positions(i,j)=distance2Leader*exp(b.*l).*cos(l.*2*pi)+w*Leader_pos(j);  % 引入权重endend%边界处理Flag4ub=Positions(i,:)>ub;Flag4lb=Positions(i,:)<lb;Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;%% 改进点:随机差分变异Rindex = randi(SearchAgents_no);%随机选择一个个体r1 = rand; r2 = rand;Temp = r1.*(Leader_pos - Positions(i,:)) + r2.*(Positions(Rindex,:) -  Positions(i,:));Flag4ub=Temp>ub;Flag4lb=Temp<lb;Temp=(Temp.*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;if fobj(Temp) < fobj(Positions(i,:))Positions(i,:) = Temp;endendt=t+1;Convergence_curve(t)=Leader_score;pos_curve(t,:)=Leader_pos;fprintf(1,'%g\n',t);
end

3、

%% 基于准反向策略的种群初始化
function Positions=initializationNew(SearchAgents_no,dim,ub,lb,fun)
Boundary_no= size(ub,2); % numnber of boundaries
BackPositions = zeros(SearchAgents_no,dim);
if Boundary_no==1PositionsF=rand(SearchAgents_no,dim).*(ub-lb)+lb;%求取反向种群BackPositions = ub + lb - PositionsF;
end% If each variable has a different lb and ub
if Boundary_no>1for i=1:dimub_i=ub(i);lb_i=lb(i);PositionsF(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;%求取反向种群BackPositions(:,i) =  (ub_i+lb_i) - PositionsF(:,i);end
end
%% 准反向操作
for i = 1:SearchAgents_nofor j = 1:dimif Boundary_no==1if (ub + lb)/2 <BackPositions(i,j)Lb = (ub + lb)/2;Ub = BackPositions(i,j);PBackPositions(i,j) = (Ub - Lb)*rand + Lb;elseLb = BackPositions(i,j);Ub =  (ub + lb)/2;PBackPositions(i,j) = (Ub - Lb)*rand + Lb;endelseif (ub(j) + lb(j))/2 <BackPositions(i,j)Lb = (ub(j) + lb(j))/2;Ub = BackPositions(i,j);PBackPositions(i,j) = (Ub - Lb)*rand + Lb;elseLb = BackPositions(i,j);Ub = (ub(j) + lb(j))/2;PBackPositions(i,j) = (Ub - Lb)*rand + Lb;endendend
end
%合并种群
AllPositionsTemp = [PositionsF;PBackPositions];
AllPositions = AllPositionsTemp;
for i = 1:size(AllPositionsTemp,1)%    fitness(i) = fun(AllPositionsTemp(i,:));[fitness(i),net{i}] =  fun(AllPositionsTemp(i,:));fprintf(1,'%g\n',i);
end
[fitness, index]= sort(fitness);%排序
for i = 1:2*SearchAgents_noAllPositions(i,:) = AllPositionsTemp(index(i),:);
end
%取适应度排名靠前的作为种群的初始化
Positions = AllPositions(1:SearchAgents_no,:);end

4、

%适应度函数
%mse作为适应度值
function [fitness,net] = fun(x,numFeatures,numResponses,XTrain,YTrain,XTest,YTest)disp('进行一次训练中....')
%% 获取优化参数
numHiddenUnits = round(x(1));%BiLSTM网路包含的隐藏单元数目
maxEpochs = round(x(2));%最大训练周期
InitialLearnRate = x(3);%初始学习率
L2Regularization = x(4);%L2参数%设置网络
layers = [ ...sequenceInputLayer(numFeatures)bilstmLayer(numHiddenUnits)fullyConnectedLayer(numResponses)regressionLayer];%指定训练选项,采用cpu训练, 这里用cpu是为了保证能直接运行,如果需要gpu训练,改成gpu就行了,且保证cuda有安装
options = trainingOptions('adam', ...'MaxEpochs',maxEpochs, ...'ExecutionEnvironment' ,'gpu',...'InitialLearnRate',InitialLearnRate,...'GradientThreshold',1, ...'L2Regularization',L2Regularization, ...'Verbose',0);
%'Plots','training-progress'
%训练LSTM
net = trainNetwork(XTrain,YTrain,layers,options);
%训练集测试
PredictTrain = predict(net,XTrain, 'ExecutionEnvironment','gpu');
%测试集测试
PredictTest = predict(net,XTest, 'ExecutionEnvironment','gpu');%训练集mse
mseTrain = mse(YTrain-PredictTrain);
%测试集mse
mseTest = mse(YTest-PredictTest);%% 测试集准确率fitness =mseTrain+mseTest;
disp('训练结束....')
end

数据

结果











机器学习之MATLAB代码--IWOA_BILSTM(基于改进鲸鱼算法优化的BiLSTM预测算法)(十六)相关推荐

  1. MATLAB代码:基于多时间尺度滚动优化的多能源微网双层调度模型

    MATLAB代码:基于多时间尺度滚动优化的多能源微网双层调度模型 关键词:多能源微网 多时间尺度 滚动优化 微网双层模型 调度 主要内容:代码主要是一个多能源微网的优化调度问题,首先对于下层多能源微网 ...

  2. 【Matlab代码】基于遗传算法和蚂蚁优化算法的路径优化问题

    目录 1 概述 2 Matlab代码 3 运行结果 1 概述 在1959年,Dantzing 和 Ramser在经过实验和思考后,首次提出配送车辆路径优化问题.在物流运输中配送是重要的环节,准确选择配 ...

  3. 机器学习之MATLAB代码--CEEMDAN+EEMD+EMD+VMD+IMF重构络(十八)

    机器学习之MATLAB代码--CEEMDAN+EEMD+EMD+VMD+IMF重构络(十八) 压缩分量的EEMD代码 压缩分量的EEMD数据 压缩分量的EEMD结果 CEEMDAN代码 CEEMDAN ...

  4. 基于改进鲸鱼优化算法的WSN覆盖优化

    文章目录 一.理论基础 1.WSN节点覆盖模型 2.基本鲸鱼算法 3.改进鲸鱼优化算法 (1)量子位Bloch球面初始化 (2)改进搜索猎物过程 (3)莱维飞行扰动策略 二.算法流程 三.仿真实验与分 ...

  5. MATLAB代码:基于二阶锥优化及OLTC档位选择的配电网优化调度

    MATLAB代码:基于二阶锥优化及OLTC档位选择的配电网优化调度 关键词:OLTC档位选择 二阶锥优化 动态优化 最优潮流 参考文档:<主动配电网最优潮流研究及其应用实例>仅参考部分模型 ...

  6. MATLAB代码:基于多目标灰狼算法的冷热电综合三联供微网低碳经济调度

    MATLAB代码:基于多目标灰狼算法的冷热电综合三联供微网低碳经济调度 关键词:微网优化调度 灰狼算法 多目标 低碳调度 参考文档:<基于改进多目标灰狼算法的冷热电联供型微电网运行优化_戚艳&g ...

  7. MATLAB代码:基于非对称纳什谈判的多微网电能共享运行优化策略

    MATLAB代码:基于非对称纳什谈判的多微网电能共享运行优化策略 关键词:纳什谈判 合作博弈 微网 电转气-碳捕集 P2P电能交易交易 参考文档:加好友 仿真平台:MATLAB CPLEX+MOSEK ...

  8. 开源机器学习之MATLAB代码--LSTM-SVRNN(五)

    机器学习之MATLAB代码--LSTM-SVRNN(五) 代码 数据 结果 代码 1.cdmnn.m文件 %% 组合模型 %% %% 数据导入 clc;clear;warning off; data= ...

  9. MATLAB代码:基于粒子群算法的电动汽车充电站最优选址和定容

    MATLAB代码:基于粒子群算法的电动汽车充电站最优选址和定容 关键词:选址定容 电动汽车 充电站位置 仿真平台:MATLAB 主要内容:代码主要做的是一个电动汽车充电站的选址定容问题,提出了能够计及 ...

最新文章

  1. vs2017引入mysql_windows+vs2017+C语言 引入mysql.h对MYSQL数据库的操作
  2. 活着不容易!几度被扼杀又雄起的NLP简史
  3. 提高安全意识,保护自身安全
  4. java 面向组件_Java 面向对象
  5. 在微型计算机系统中 下列叙述正确的是,全国2011年10月高等教育自学考试计算机应用基础试题及答案...
  6. 生成Treeview树 递归方法
  7. 终于给cs来了一次小整容
  8. Qt_QTableWidget用法 添加、删除、添加控件、获取控件在表格中位置
  9. linux英特尔蓝牙驱动,IntelBluetoothFirmware 英特尔蓝牙驱动
  10. 阿里矢量图iconfont的两种使用方法
  11. 电子设计教程21:晶体管差分放大电路
  12. 解决macOS idea启动web服务dock回自动打开Java图标
  13. 项目经验介绍的STAR法则--面试
  14. java对人物画像分级_绘制用户画像——根据用户行为计算标签权重介绍及实现...
  15. php 对账单系统,PHP实现微信对账单处理
  16. bing输入法linux,必应Bing输入法特殊符号输入方法图文教程
  17. java中是什么意思_java中@什么意思
  18. 百度用AI“唤醒”历史,中国文化名片与科技名片相互成就
  19. 离谱的 CSS!从表盘刻度到剪纸艺术
  20. 【干货】彻底理解Windows认证-议题解读

热门文章

  1. Xmind序列号/版本: XMind 8 Update 9 (R3.7.9.201912052356)
  2. 基本固件框架的追踪研读之SETUP命令的处理2
  3. 去视频、图片水印免费工具/软件
  4. 1.2 电容 CAP Capacitance
  5. 微信二手交易小程序源码开发设计方案
  6. wps怎样录制宏?教程分享
  7. linux OBM分析
  8. 调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。
  9. JSP页面跳转的几种实现方法
  10. MySQL:一个简单insert语句的大概流程