黏菌优化算法优化CNN-BiLSTM的时序预测

文摘   2024-06-06 20:09   贵州  

    今天给大家分享黏菌优化算法优化CNN-BiLSTM的时序预测,主要从算法原理和代码实战展开。需要了解更多算法代码的,可以点击文章左下角的阅读全文,进行获取哦~需要了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦,下一期分享的内容就是你想了解的内容~


一、算法原理

黏菌算法(Slime mould algorithm,SMA)是模拟黏菌捕食行为的一种仿生算法。黏菌根据气味识别到食物后,通过细胞质的流动形成多个叶脉,同时向多个食物进行移动,当叶脉接近食物源时,黏菌的生物振荡器产生一种传播 波,增加细胞质流动速度,细胞质流动越快,叶脉就越厚。这种正反馈机制,使得黏菌能以一种较优的方式建立连接食物的路径。SMA具有收敛速度快,寻优能力强的优点。
借鉴黏菌的生物行为,可以抽象出三个规则:
寻找食物:黏菌通过空气中的气味接近食物,黏菌接近食物时呈圆形与扇形结构运动。
包围食物:黏菌静脉接触的食物浓度越高,生物振荡器产生的传播波越强,细胞质流动越快。
抓取食物:黏菌在食物浓度低时更慢地接近食物,找到优质食物时更快地接近食物。
1 寻找食物阶段
        寻找食物阶段模型可公式(1)定义
           (1)
       式中为  当前发现的气味浓度最高的黏菌个体位置,  和   为从黏菌中随机选择的2个个体,  为权重。  为[-m,m]之间振荡的向量,   为[-a,a]之间振荡的向量。   的公式(2):
                                                          (2)
         式中  为   的适应度,   为在所有迭代中获得的最佳适应度。
    其中,权重   的公式(3)-(4)所示
                                                                                              (3)
                                                         (4)
        式中,  为黏菌排名前半部分的群体的适应度,  为区间[0,1]内的随机值,   为当前最佳适应度,  为当前最差适应度值,  为适应度的排序序列。
包围食物阶段
        当食物浓度较高时, 该区域附近的权重较大;当食物浓度较低时,该区域附近的权重较小,从而转向探索其他区域。修正公式为
                (5)
振荡阶段
        利用  、   和   参数模拟生物振荡器来产生传播波实 现叶脉宽度的变化,以提高黏菌选择最佳食物来源的效率。  在[-a,a]之间随机振荡,并逐渐趋近于零,  的振荡过程模拟了黏菌的状态,决定是接近食物源还是寻找其 他食物源。   的值在[-1,1]之间振荡,最终趋于零。2个变量的振荡趋势如图1所示。  和   之间的协同作用模拟了黏菌的选择性行为。

二、CNN-BiLSTM

2.1 CNN原理 

    卷积神经网络具有局部连接、权值共享和空间相关等特性。卷积神经网络结构包含卷积层、激活层和池化层。

    (a)二维卷积层将滑动卷积滤波器应用于输入。该层通过沿输入垂直和水平方向 移动滤波器对输入进行卷积,并计算权重与输入的点积,然后加入一个偏置项。具体表达式为:

    卷积层的功能是对输入数据进行特征提取。其内部包含多个卷积核,也称为 感受野。将输入图像和卷积核做卷积运算,可以增强原始信号特征的同时降低噪声。卷积运算的具体过程如图1所示。

    

图1 卷积运算的具体过程

(2)激活函数

     在卷积神经网络中,常用的激活函数包括 Sigmoid 函数、Tanh 函数、Swish 函数和 Relu 函数。Relu 函数解决了 Sigmoid 函数和 Tanh 函数梯度消失的问题, 提高了模型收敛的速度,受到的广泛学者的欢迎。

(3)池化

     池化层又称为下采样层,池化层分为平均池化层和最大池化层。其中,最大池化层通过将输入分为矩形池化区域,并计算每个区域的最大值来执行下采样, 而平均池化层则是计算池化区域的平均值来执行下采样。池化层的池化过程如图2所示。

池化过程示意图

2.2 LSTM原理 

    LSTM采用循环神经网络( Recurrent Neural Network,RNN )架构,它是专门为从序列中学习长期依赖关系而设计的。LSTM可以使用4个组件:输入门、输出门、遗忘门和具有自循环连接的单元来移除或添加块状态的信息。其神经元结构如图3所示。

图3  LSTM网络结构

       设输入序列共有 k 个时间步,LSTM 门控机制 结构为遗忘门、输入门和输出门,xt携带网络输入值 作为向量引入系统,ht 通过隐含层对 LSTM 细胞进 行输出,ct携带着 LSTM 细胞状态进行运算。LSTM 运算规则如下:

      计算后保留 ct与 ht,用于下一时间步的计算;最后一步计算完成后,将隐藏层向量 hk作为输出与本组序列对应的预测值对比,得出损失函数值,依据梯度下降算法,优化权重和偏置参数,以此训练出迭代次数范围内最精确的网络参数。

2.3 BiLSTM原理 

    BiLSTM 是对LSTM 的改进,其隐藏层由前向LSTM 与后向 LSTM 共同构成。其结构如图3所示, BiLSTM 记忆网络有两个方向的传输层,前传层沿前向 训练时间序列,后传层沿后向训练时间序列,前传和后传层都与输出层连接。

图3  BiLSTM 网络结构

2.4 CNN-BiLSTM框架

    以时序预测为例,本次分享的CNN-BiLSTM的框架如图4所示。

图4 CNN-LSTM框架

三、代码实战

%% SMA-CNN-LSTM负荷预测% 数据集(列为特征,行为样本数目clcclearload('Train.mat')%Train(1,:) =[];y = Train.demand;x = Train{:,3:end};[xnorm,xopt] = mapminmax(x',0,1);[ynorm,yopt] = mapminmax(y',0,1);x = x';
k = 24; % 滞后长度
% 转换成2-D imagefor i = 1:length(ynorm)-k
Train_xNorm{i} = reshape(xnorm(:,i:i+k-1),6,1,1,k); Train_yNorm(i) = ynorm(i+k-1); Test_x(i) = y(i+k-1);endTrain_yNorm= Train_yNorm';
% % load('Test.mat')Test(1,:) =[];ytest = Test.demand;xtest = Test{:,3:end};[xtestnorm] = mapminmax('apply', xtest',xopt);[ytestnorm] = mapminmax('apply',ytest',yopt);xtest = xtest';for i = 1:length(ytestnorm)-k Test_xNorm{i} = reshape(xtestnorm(:,i:i+k-1),6,1,1,k); Test_yNorm(i) = ytestnorm(i+k-1); Test_y(i) = ytest(i+k-1);endTest_yNorm = Test_yNorm';
% LSTM 层设置,参数设置inputSize = size(Train_xNorm{1},1); %数据输入x的特征维度outputSize = 1; %数据输出y的维度 %%%% 优化算法参数设置SearchAgents_no = 10; % 数量Max_iteration = 10; % 最大迭代次数dim = 3; % 优化参数个数lb = [1e-4,10,10]; % 参数取值下界(学习率,隐藏层节点,正则化系数)ub = [1e-3, 200,200]; % 参数取值上界(学习率,隐藏层节点,正则化系数)
[Best_score,Best_pos,curve]=SMA(SearchAgents_no,Max_iteration,lb,ub,dim,fit)best_lr = Best_pos(1); % 最佳隐藏层节点数numhidden_units1 = round(Best_pos(2));% 最佳隐藏层节点数1numhidden_units2 = round(Best_pos(3));% 最佳隐藏层节点数2


%% lstm
layers = [ ... sequenceInputLayer([inputSize,1,1],'name','input') %输入层设置 sequenceFoldingLayer('name','fold') convolution2dLayer([2,1],10,'Stride',[1,1],'name','conv1') batchNormalizationLayer('name','batchnorm1') reluLayer('name','relu1') maxPooling2dLayer([1,3],'Stride',1,'Padding','same','name','maxpool') sequenceUnfoldingLayer('name','unfold') flattenLayer('name','flatten') bilstmLayer(numhidden_units1,'Outputmode','sequence','name','hidden1') dropoutLayer(0.3,'name','dropout_1') bilstmLayer(numhidden_units2,'Outputmode','last','name','hidden2') dropoutLayer(0.3,'name','drdiopout_2') fullyConnectedLayer(outputSize,'name','fullconnect') % 全连接层设置(影响输出维度)(cell层出来的输出层) % tanhLayer('name','softmax') regressionLayer('name','output')];
lgraph = layerGraph(layers)lgraph = connectLayers(lgraph,'fold/miniBatchSize','unfold/miniBatchSize');% plot(lgraph)%% 网络训练options = trainingOptions('adam', ... 'MaxEpochs',5, ... 'GradientThreshold',1,... 'ExecutionEnvironment','gpu',... 'InitialLearnRate',best_lr, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropPeriod',2, ... %2个epoch后学习率更新 'LearnRateDropFactor',0.5, ... 'Shuffle','once',... % 时间序列长度 'SequenceLength',k,... 'MiniBatchSize',24,... 'Plots', 'training-progress',... % 画出曲线 'Verbose',0);
%% 训练[net,traininfo] = trainNetwork(Train_xNorm, Train_yNorm, lgraph, options);
%% 预测t_sim1 = predict(net, Train_xNorm); t_sim2 = predict(net, Test_xNorm);
%% 数据反归一化T_sim1 = mapminmax('reverse', t_sim1',yopt);T_sim2 = mapminmax('reverse', t_sim2', yopt);
T_sim1 = double(T_sim1) ;T_sim2 = double(T_sim2) ;
%% 绘图M = size(T_sim1,2);N = size(T_sim2,2);figureplot(1 : length(curve), curve,'linewidth',1.5);title('SMA-CNN-LSTM', 'FontSize', 10);xlabel('迭代次数', 'FontSize', 10);ylabel('适应度值', 'FontSize', 10);grid off%% 均方根误差 RMSEerror1 = sqrt(sum((T_sim1 - Test_x').^2)./M);error2 = sqrt(sum((Test_yNorm' - T_sim2).^2)./N);

%% 显示网络结构analyzeNetwork(net)
%% 绘图figureplot(lgraph)title("CNN-BILSTM模型结构")
%% 绘图figureplot(T_sim1,'-','linewidth',1)hold on plot(Test_x,'-','linewidth',1)legend( 'SMA-CNN-LSTM拟合训练数据','实际分析数据','Location','NorthWest','FontName','华文宋体');title('SMA-CNN-LSTM模型预测结果及真实值','fontsize',12,'FontName','华文宋体')xlabel('样本','fontsize',12,'FontName','华文宋体');ylabel('数值','fontsize',12,'FontName','华文宋体');xlim([1 M])%-------------------------------------------------------------------------------------figureplot(T_sim2,'-','linewidth',1)hold on plot(Test_y,'-','linewidth',1)legend('SMA-CNN-LSTM预测测试数据','实际分析数据','Location','NorthWest','FontName','华文宋体');title('SMA-CNN-LSTM模型预测结果及真实值','fontsize',12,'FontName','华文宋体')xlabel('样本','fontsize',12,'FontName','华文宋体');ylabel('数值','fontsize',12,'FontName','华文宋体');xlim([1 N])%-------------------------------------------------------------------------------------
%% 相关指标计算% R2R1 = 1 - norm(Test_x - T_sim1)^2 / norm(Test_x - mean(Test_x))^2;R2 = 1 - norm(Test_y - T_sim2)^2 / norm(Test_y - mean(Test_y))^2;
disp(['训练集数据的R2为:', num2str(R1)])disp(['测试集数据的R2为:', num2str(R2)])
% MAEmae1 = sum(abs(T_sim1 - Test_x)) ./ M ;mae2 = sum(abs(T_sim2 - Test_y )) ./ N ;
disp(['训练集数据的MAE为:', num2str(mae1)])disp(['测试集数据的MAE为:', num2str(mae2)])
% MAPEmaep1 = sum(abs(T_sim1 - Test_x)./Test_x) ./ M ;maep2 = sum(abs(T_sim2 - Test_y)./Test_y) ./ N ;
disp(['训练集数据的MAPE为:', num2str(maep1)])disp(['测试集数据的MAPE为:', num2str(maep2)])
% RMSERMSE1 = sqrt(sumsqr(T_sim1 - Test_x)/M);RMSE2 = sqrt(sumsqr(T_sim2 - Test_y)/N);
disp(['训练集数据的RMSE为:', num2str(RMSE1)])disp(['测试集数据的RMSE为:', num2str(RMSE2)])
%% 保存训练模型save ('model')

仿真结果


    部分知识来源于网络,如有侵权请联系作者删除~


    今天的分享就到这里了,后续想了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦~希望大家多多转发点赞加收藏,你们的支持就是我源源不断的创作动力!


作 者 | 华 夏

编 辑 | 华 夏

校 对 | 华 夏


matlab学习之家
分享学习matlab建模知识和matlab编程知识
 最新文章