主要内容
该程序实现多输入单输出预测,通过融合正余弦和柯西变异改进麻雀搜索算法,对CNN-BiLSTM的学习率、正则化参数以及BiLSTM隐含层神经元个数等进行优化,并对比了该改进算法和粒子群、灰狼算法在优化方面的优势。该程序数据选用的是一段风速数据,数据较为简单,方便同学进行替换学习。程序对比了优化前和优化后的效果,注释清晰,方便学习,建议采用高版本matlab运行。
部分代码
%% 导入数据 data = xlsread('data.xls','B:B'); [h1,l1]=data_process(data,8); %步长为8,采用前8天的价格与预测第9天 data = [h1,l1]; [m,n]=size(data); input = data(:,1:n); output = data(:,n); numTimeStepsTrain = floor(0.7*numel(data(:,1))); %取70%的数据作为训练集 XTrain = input(1:numTimeStepsTrain,:); YTrain = output(1:numTimeStepsTrain,:); XTest = input(numTimeStepsTrain+1:end,:); YTest = output(numTimeStepsTrain+1:end,:); x = XTrain; y = YTrain; [xnorm,xopt] = mapminmax(x',0,1); [ynorm,yopt] = mapminmax(y',0,1); % 转换成2-D image for i = 1:length(ynorm) Train_xNorm{i} = reshape(xnorm(:,i),n,1,1); Train_yNorm(:,i) = ynorm(:,i); Train_y(i,:) = y(i,:); end Train_yNorm= Train_yNorm'; xtest = XTest; ytest = YTest; [xtestnorm] = mapminmax('apply', xtest',xopt); [ytestnorm] = mapminmax('apply',ytest',yopt); xtest = xtest'; for i = 1:length(ytestnorm) Test_xNorm{i} = reshape(xtestnorm(:,i),n,1,1); Test_yNorm(:,i) = ytestnorm(:,i); Test_y(i,:) = ytest(i,:); end Test_yNorm = Test_yNorm'; %% 优化算法优化前,构建优化前的CNN-BILSTM模型 inputSize = n; outputSize = 1; %数据输出y的维度 layers0 = [ ... sequenceInputLayer([inputSize,1,1],'name','input') %输入层设置 sequenceFoldingLayer('name','fold') %使用序列折叠层对图像序列的时间步长进行独立的卷积运算。 convolution2dLayer([2,1],10,'Stride',[1,1],'name','conv1') %添加卷积层,2,1表示过滤器大小,10过滤器个数,Stride是垂直和水平过滤的步长 batchNormalizationLayer('name','batchnorm1') % BN层,用于加速训练过程,防止梯度消失或梯度爆炸 reluLayer('name','relu1') % ReLU激活层,用于保持输出的非线性性及修正梯度的问题 convolution2dLayer([1,1],10,'Stride',[1,1],'name','conv2') %添加卷积层,2,1表示过滤器大小,10过滤器个数,Stride是垂直和水平过滤的步长 batchNormalizationLayer('name','batchnorm2') % BN层,用于加速训练过程,防止梯度消失或梯度爆炸 reluLayer('name','relu2') % ReLU激活层,用于保持输出的非线性性及修正梯度的问题