GA-BP遗传优化神经网络预测改动(新版本MATLAB中神经网络训练窗口的一些变化)

又经过几个月的学习

在之前发布的文章中可以改进一下

之前没有对收集的数据划分训练集和测试集

在BP神经网络算法模块中

训练时将所有输入数据和输出数据当成了训练集

因此,才在BP神经网络梯度训练设置了for循环

for循环很大程度上提高了网络中的训练集的性能

并存储了每次循环训练的误差和仿真预测结果

在for循环结束后

才根据最小误差索引到对应的仿真预测数据

☆☆☆

按道理来说神经网络应该自行划分了比例

所以,之前的模型应该是

将所有输入、输出数据当成了训练集来训练

然后网络又默认选取了35%比例的数据来验证

(显然没有意义了)

训练效果也挺好

经查阅资料

该模型是一种短时间内的时间序列预测模型

意思就是仅仅只是在数据拟合方面做得很好

在长时间上

数据的预测是没有依据性的

因为神经网络学习数据特征训练时

会忘记先前学习的特征

所以每次训练完预测的结果相差会很大

下面将按一定比例随机划分数据

以及仿真预测后

将训练出的数据和仿真预测的数据

运用索引的操作矩阵重组

从而与真实数据作一比较

↓↓↓↓↓

clear;
clc;
close all;
%% 实验数据导入及整理
data1=[1.87,2.07,2.25,2.4,2.5,2.64,2.7,2.9,3.1,3.25,3.4,3.72,3.95];%2009年~2021年的机动车数量/(亿辆)
data2=[41.19,42.05,45.33,47.49,50.96,52.88,56.18,60.86,65.12,67.34,69.33,70.44,70.94];%2009年~2021年的公共汽电车数量/(万辆)
data3=[25460,32237,35884,38243,41738,45052,48905,52789,56786,60590,65730,70643,75770];%2009年~2021年的公共汽电车线路数/(条)
data4=[28.92,63.37,67.29,71.46,74.89,81.78,89.43,98.12,106.9,119.9,133.6,148.21,159.38];%2009年~2021年的公共汽电车线路网里程/(万公里)
data5=[186.63,317.86,331.73,346.82,348.96,346.69,352.33,358.32,355.2,346.1,354.13,302.79,335.27];%2009年~2021年的公共汽电车运营里程/(亿公里)
data6=[742.91,670.12,715.79,749.8,771.17,781.88,765.4,745.23,722.87,697,691.76,442.36,489.16];%2009年~2021年的公共汽电车客流量/(亿人次)
newdata=[4.3;70.45;76550;170;340];%每个值分别为2022年的:机动车数量、公共汽电车数量、线路数、线路网里程、运营里程
x1=2009:1:2021;                      %定义实际值年份
x2=2009:1:2022;                      %定义预测值年份
P=[data1;data2;data3;data4;data5];   %特征数据
T=data6;                             %目标数据
nP=newdata;                          %预测特征数据

以上是和之前一样操作的数据整理操作

接下来会对整理好的数据按一定的比例随机划分

%% 输入数据和输出数据数据的比例划分
[~,g]=size(P);
randIndex=randperm(g);
k=ceil(0.75*g);                      %设置75%比例的数据作为训练数据
trainIndex=sort(randIndex(1:k));     %随机选出特征数据的75%比例作为训练数据(这里先选出数据的序号)
testIndex=sort(randIndex(k+1:g));    %将剩下的数据作为检验数据(这里先选出数据的序号)
inputData_train=P(:,trainIndex);     % 根据序号选出75%比例数据用于训练的输入
inputData_test=P(:,testIndex);       % 根据序号选出25%比例数据用于测试的输入
outputData_train=T(:,trainIndex);    % 根据序号选出75%比例数据用于训练的输出
outputData_test=T(:,testIndex);      % 根据序号选出25%比例数据用于测试的输出

有13组完整的数据

需要预测另1组中的1个数据

以上输入数据即特征数据

输出数据即目标数据

随机划分了13组数据中75%的比例作为训练集

(输入数据和输出数据各75%)

另外25%比例的数据作为测试集

这样就导致最后将测试数据代入网络

仿真预测出的结果只有25%比例的数据

所以最后还需要将划分的75%比例的数据

代入到网络中训练得到训练集训练出来的数据

另外也要将预测特征(输入)数据代入网络

得到预测的数据

因此,在测试数据代入仿真出结果

再计算误差后

就要将3组仿真的数据按一开始随机划分比例的顺序

排列成完整的输出数据(sim仿真后的)

↓↓↓↓↓

%调用trainlm算法训练网络
[net,tr]=train(net,inputdata_train_regular,outputdata_train_regular);
%放入到网络输出数据
outputData_train_regular=sim(net,inputdata_train_regular); %训练集的输出数据
outputData_test_regular=sim(net,inputdata_test_regular);   %测试集的输出数据
nT_regular=sim(net,nP_regular); %预测数据
for rr=i
   q1=figure(1);
   plotperform(tr);
   set(q1,'Position',[280 610 560 420])
   q2=figure(2);
   plottrainstate(tr);
   set(q2,'Position',[1080 610 560 420])
   drawnow update;
end
%将得到的数据反归一化
GA_BP_train=mapminmax('reverse',outputData_train_regular,PS2);
GA_BP_test=mapminmax('reverse',outputData_test_regular,PS2);
nT=mapminmax('reverse',nT_regular,PS2);
%训练集、测试集、预测的输出数据矩阵重组
GA_BP_data=ones(output_num,g);
GA_BP_data(:,trainIndex)=GA_BP_train;
GA_BP_data(:,testIndex)=GA_BP_test;
%计算每次实验误差
errors_nn=sum(abs(GA_BP_data-T)./(T))/length(T);
n_EcRMSE=sqrt(sum((errors_nn).^2)/length(errors_nn));

上面是重组后再计算整体训练的误差

其中的for循环次数是根据梯度训练次数i同步的

循环的内容是将神经网络每次训练的性能和状态窗口显示出来

GA-BP遗传优化神经网络预测改动(新版本MATLAB中神经网络训练窗口的一些变化)_第1张图片

GA-BP遗传优化神经网络预测改动(新版本MATLAB中神经网络训练窗口的一些变化)_第2张图片

 模型运行时可观察上面两个图

来判断训练是否过拟合

即训练数据上表现良好但在验证数据或测试数据上表现不佳

%设置训练参数
net.trainParam.lr=0.0001;               %学习率
net.trainparam.show=400;                %每训练400次展示一次结果
net.trainParam.goal=0.0001;             %目标误差
net.trainparam.epochs=15000;            %最大训练次数
net.trainParam.showWindow=1;            %BP训练窗口
net.divideParam.trainRatio=0.8;         % 用于训练的数据比例
net.divideParam.valRatio=0.2;           % 用于验证过拟合的数据比例
net.divideParam.testRatio=0;            % 注意要关掉测试数据占比

可以调试上面训练参数

来指导神经网络进行训练

防止神经网络训练时一直处于过拟合情况出现

因为一开始对数据划分过比例

所以要将测试数据占比给关掉

GA-BP遗传优化神经网络预测改动(新版本MATLAB中神经网络训练窗口的一些变化)_第3张图片

 这是新版本MATLAB2022b

神经网络训练窗口改成这样了

若打开的话,不建议再在神经网络算法模块中

添加for循环多次训练

因为新版本MATLAB的神经网络训练窗口

每循环一次都会关闭上一次的训练窗口

然后再打开该次的训练窗口

会花费比较久的时间

不会像之前版本的训练窗口每循环一次窗口数据更新一次

就起不到人为强制干涉神经网络训练次数的作用了

或者可以关闭神经网络训练窗口

GA-BP遗传优化神经网络预测改动(新版本MATLAB中神经网络训练窗口的一些变化)_第4张图片

这是新版本的神经网络结构图 

总之,新版版MATLAB

对于智能算法优化、数据运算方面运行快了很多

也有很多辅助检查分析的工具

据本人测试

好像是新版本MATLAB不需要对变量大小先前设置

设置前和设置后运行时间差不多

甚至设置变量大小后消耗时间还多一点点

但是不设置的话

目前新版本还是会警告提醒建议你设置变量迭代大小

附上源代码:(可结合之前发的一版对比看)

↓↓↓↓↓

clear;
clc;
close all;
%% 实验数据导入及整理
data1=[1.87,2.07,2.25,2.4,2.5,2.64,2.7,2.9,3.1,3.25,3.4,3.72,3.95];%2009年~2021年的机动车数量/(亿辆)
data2=[41.19,42.05,45.33,47.49,50.96,52.88,56.18,60.86,65.12,67.34,69.33,70.44,70.94];%2009年~2021年的公共汽电车数量/(万辆)
data3=[25460,32237,35884,38243,41738,45052,48905,52789,56786,60590,65730,70643,75770];%2009年~2021年的公共汽电车线路数/(条)
data4=[28.92,63.37,67.29,71.46,74.89,81.78,89.43,98.12,106.9,119.9,133.6,148.21,159.38];%2009年~2021年的公共汽电车线路网里程/(万公里)
data5=[186.63,317.86,331.73,346.82,348.96,346.69,352.33,358.32,355.2,346.1,354.13,302.79,335.27];%2009年~2021年的公共汽电车运营里程/(亿公里)
data6=[742.91,670.12,715.79,749.8,771.17,781.88,765.4,745.23,722.87,697,691.76,442.36,489.16];%2009年~2021年的公共汽电车客流量/(亿人次)
newdata=[4.3;70.45;76550;170;340];%每个值分别为2022年的:机动车数量、公共汽电车数量、线路数、线路网里程、运营里程
x1=2009:1:2021;                      %定义实际值年份
x2=2009:1:2022;                      %定义预测值年份
P=[data1;data2;data3;data4;data5];   %特征数据
T=data6;                             %目标数据
nP=newdata;                          %预测特征数据
%% 输入数据和输出数据数据的比例划分
[~,g]=size(P);
randIndex=randperm(g);
k=ceil(0.75*g);                      %设置75%比例的数据作为训练数据
trainIndex=sort(randIndex(1:k));     %随机选出特征数据的75%比例作为训练数据(这里先选出数据的序号)
testIndex=sort(randIndex(k+1:g));    %将剩下的数据作为检验数据(这里先选出数据的序号)
inputData_train=P(:,trainIndex);     % 根据序号选出75%比例数据用于训练的输入
inputData_test=P(:,testIndex);       % 根据序号选出25%比例数据用于测试的输入
outputData_train=T(:,trainIndex);    % 根据序号选出75%比例数据用于训练的输出
outputData_test=T(:,testIndex);      % 根据序号选出25%比例数据用于测试的输出
%% 实验数据归一化
[inputdata_train_regular,PS1]=mapminmax(inputData_train,-1,1);
[outputdata_train_regular,PS2]=mapminmax(outputData_train,-1,1);
inputdata_test_regular=mapminmax('apply',inputData_test,PS1);
nP_regular=mapminmax('apply',nP,PS1);
%% 实验参数初始化
input_num=size(inputData_train,1);       %输入特征个数
output_num=size(outputData_train,1);      %输出特征个数
hidden_num1=6;             %第一层隐藏层神经元个数
hidden_num2=5;             %第二层隐藏层神经元个数
group_num=500;             %种群规模
cross_pro=0.6;           %交叉概率
mutation_pro=0.04;         %变异概率,相对来说比较小
%这个优化的主要思想就是优化网络参数的初始选择,初始选择对于效果好坏是有较大影响的
num_all=input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num+output_num; %节点总数
lenchrom=ones(1,num_all);  %种群总长度
limit=[-1*ones(num_all,1) 1*ones(num_all,1)];    %初始参数给定范围
%% 实验参数设置
num_iter_all=35;   %GA-BP实验次数
iter_num=300;      %GA迭代循环次数
num=1;           %BP梯度下降训练循环次数
input_data=inputdata_train_regular;
output_data=outputdata_train_regular;
% 实验变量存储
TIME=ones(1,num_iter_all);
test=ones(num_iter_all,length(x2));
EMS_all=ones(1,num_iter_all);
%% 实验开始
titlestr='实验运行中,请稍等......';
mm=waitbar(0,titlestr);
set(mm,'Position',[280 376.8750 270 56.2500])
for NN=1:num_iter_all
    str=['实验运行第',num2str(NN),'次中,请稍等......'];
    waitbar(NN/num_iter_all,mm,str); %实验进度条
    t1=datetime('now');%每次实验开始的时间
    %% 基因编译
    %GA变量存储设置
    trace=ones(iter_num+1,2);
    initial_chrom=ones(group_num,num_all);
    fitness_group=ones(group_num,1);
    %GA种群初始化
    for i=1:group_num
        initial=rand(1,length(lenchrom));  %产生0-1的随机数
        initial_chrom(i,:)=limit(:,1)'+(limit(:,2)-limit(:,1))'.*initial;  %变成染色体的形式,一行为一条染色体
        fitness_value=fitness(initial_chrom(i,:),input_num,hidden_num1,hidden_num2,output_num,input_data,output_data);%计算初始适应度
        fitness_group(i)=fitness_value;
    end
    [bestfitness,bestindex]=min(fitness_group);
    bestchrom=initial_chrom(bestindex,:);  %最好的染色体
    avgfitness=sum(fitness_group)/group_num; %染色体的平均适应度
    trace(1,:)=[avgfitness bestfitness];  %记录每一代进化中最好的适应度和平均适应度
    %% 迭代过程
    input_chrom=initial_chrom;
    titlestr=('GA迭代中,请稍等......');
    kk=waitbar(0,titlestr);
    set(kk,'Position',[890 376.8750 270 56.2500])
    % 开始迭代
    for numa=1:iter_num
        str=['GA迭代第',num2str(numa),'次中,请稍等......',num2str(round(numa/iter_num*100)),'%'];
        waitbar(numa/iter_num,kk,str); %GA迭代进度条
        % 选择
        [new_chrom,new_fitness]=select(input_chrom,fitness_group,group_num);   %把表现好的挑出来,还是和种群数量一样
        % 交叉
        new_chrom=Cross(cross_pro,lenchrom,new_chrom,group_num,limit);
        % 变异
        new_chrom=Mutation(mutation_pro,lenchrom,new_chrom,group_num,numa,iter_num,limit);
        % 计算每次迭代后的适应度
        for j=1:group_num
            sgroup=new_chrom(j,:); %个体
            new_fitness(j)=fitness(sgroup,input_num,hidden_num1,hidden_num2,output_num,input_data,output_data);
        end
        %找到最小和最大适应度的染色体及它们在种群中的位置
        [newbestfitness,newbestindex]=min(new_fitness);
        [worestfitness,worestindex]=max(new_fitness);
        % 代替上一次进化中最好的染色体
        if  newbestfitnesscross_pro
        continue;
    end
    % 随机选择交叉位
    pick=rand;
    while pick==0
        pick=rand;
    end
    flag=0;
    while flag==0
        pos=ceil(pick*length(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同
        pick=rand; %交叉开始
        v1=input_chrom(index(1),pos);
        v2=input_chrom(index(2),pos);
        input_chrom(index(1),pos)=pick*v2+(1-pick)*v1;
        input_chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束

        %判断交叉后的两条染色体可不可行
        limit1=mean(limit);
        f11=isempty(find(input_chrom(index(1),:)>limit1(2), 1));
        f12=isempty(find(input_chrom(index(1),:)limit1(2), 1));
        f22=isempty(find(input_chrom(index(2),:)mutation_pro
        continue;
    end
    flag=0;
    while flag==0
        % 变异位置
        pick=rand;
        while pick==0
            pick=rand;
        end
        pos=ceil(pick*sum(lenchrom));  %随机选择了染色体变异的位置,即选择了第pos个变量进行变异
        pick=rand; %变异开始
        fg=(pick*(1-num/iter_num))^2;
        if pick>0.5
            input_chrom(index,pos)=input_chrom(index,pos)+(limit(pos,2)-input_chrom(index,pos))*fg;
        else
            input_chrom(index,pos)=input_chrom(index,pos)-(input_chrom(index,pos)-limit(pos,1))*fg;
        end   %变异结束

        limit1=mean(limit);
        f1=isempty(find(input_chrom(index,:)>limit1(2), 1));
        f2=isempty(find(input_chrom(index,:)

运行结果图

↓↓↓↓↓

GA-BP遗传优化神经网络预测改动(新版本MATLAB中神经网络训练窗口的一些变化)_第5张图片GA-BP遗传优化神经网络预测改动(新版本MATLAB中神经网络训练窗口的一些变化)_第6张图片

 

 

你可能感兴趣的:(神经网络,深度学习)