国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)

這篇具有很好參考價(jià)值的文章主要介紹了GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本人畢業(yè)設(shè)計(jì)是

基于遺傳算法優(yōu)化的城市公交系統(tǒng)車站客流量預(yù)測(cè)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-426329.html

在學(xué)習(xí)過(guò)程中

不斷積累經(jīng)驗(yàn)并優(yōu)化改進(jìn)模型

學(xué)習(xí)完后

認(rèn)為遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)模型

可以在大多專業(yè)領(lǐng)域應(yīng)用實(shí)現(xiàn)預(yù)測(cè)效果

通俗地總結(jié)分享一下

自己最滿意的流程和方法供小白參考

有誤請(qǐng)指正和討論

(以下特征數(shù)據(jù)只是測(cè)試GABP算法的效果,結(jié)果是預(yù)測(cè)我國(guó)所有城市公交客流量總和而分析搜集的特征數(shù)據(jù),非本人論文預(yù)測(cè)項(xiàng)目,若要預(yù)測(cè)某個(gè)數(shù)據(jù),只要分析出影響該數(shù)據(jù)的特征并搜集其對(duì)應(yīng)特征的數(shù)據(jù),再多次調(diào)試參數(shù),即可實(shí)踐應(yīng)用實(shí)現(xiàn)出理想的預(yù)測(cè)效果)

目錄

導(dǎo)入特征數(shù)據(jù)和目標(biāo)數(shù)據(jù)

使用mapminmax函數(shù)對(duì)數(shù)據(jù)歸一化處理

提取數(shù)據(jù)特征數(shù)量

設(shè)置遺傳算法參數(shù)

設(shè)置兩層隱藏層的神經(jīng)元個(gè)數(shù)

計(jì)算整個(gè)網(wǎng)絡(luò)層的節(jié)點(diǎn)數(shù)之和

?設(shè)置種群長(zhǎng)度和初始參數(shù)范圍

流程框架

流程代碼

建模方法特點(diǎn)

適應(yīng)度計(jì)算函數(shù)

選擇操作函數(shù)

交叉操作函數(shù)

變異操作函數(shù)

神經(jīng)網(wǎng)絡(luò)算法模塊的設(shè)置

使用mapminmax函數(shù)對(duì)得到的最優(yōu)數(shù)據(jù)反歸一化

繪制實(shí)驗(yàn)誤差曲線圖

實(shí)際值與預(yù)測(cè)值曲線圖

設(shè)置實(shí)驗(yàn)結(jié)果提示窗口

運(yùn)行結(jié)果圖


?

導(dǎo)入特征數(shù)據(jù)和目標(biāo)數(shù)據(jù)

自行分析整理出

影響目標(biāo)數(shù)據(jù)的因素作為特征數(shù)據(jù)

每一個(gè)因素為一個(gè)特征種類

每一個(gè)特征需要多個(gè)樣本數(shù)據(jù)來(lái)反映

☆☆☆☆☆

GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)

根據(jù)分析

有5個(gè)特征會(huì)影響到城市公交車站客流量

分別為:

機(jī)動(dòng)車數(shù)量、公共汽電車數(shù)量、公共汽電車線路數(shù)量、公共汽電車線路網(wǎng)里程、公共汽電車運(yùn)營(yíng)里程

于是

統(tǒng)計(jì)整理了這5個(gè)特征的相關(guān)數(shù)據(jù)

作為預(yù)測(cè)模型的特征數(shù)據(jù)(輸入數(shù)據(jù))

并且

將預(yù)測(cè)數(shù)據(jù)同類的樣本特征數(shù)據(jù)-已知的客流量

作為目標(biāo)數(shù)據(jù)(1組)

然后

為了應(yīng)用訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)

準(zhǔn)備了所需預(yù)測(cè)數(shù)據(jù)的預(yù)測(cè)特征數(shù)據(jù)(1組)

來(lái)實(shí)現(xiàn)預(yù)測(cè)模型預(yù)測(cè)-未知的客流量

clear;
clc;
%導(dǎo)入數(shù)據(jù)
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年的機(jī)動(dòng)車數(shù)量/(億輛)
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年的公共汽電車數(shù)量/(萬(wàn)輛)
data3=[25460,32237,35884,38243,41738,45052,48905,52789,56786,60590,65730,70643,75770];%2009年~2021年的公共汽電車線路數(shù)/(條)
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年的公共汽電車線路網(wǎng)里程/(萬(wàn)公里)
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年的公共汽電車運(yùn)營(yíng)里程/(億公里)
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.17;67.45;79955;171.31;330];%每個(gè)值分別為2022年的:機(jī)動(dòng)車數(shù)量、公共汽電車數(shù)量、線路數(shù)、線路網(wǎng)里程、運(yùn)營(yíng)里程
P=[data1;data2;data3;data4;data5];   %特征數(shù)據(jù)
T=data6;                             %目標(biāo)數(shù)據(jù)

使用mapminmax函數(shù)對(duì)數(shù)據(jù)歸一化處理

具體用法及原理

學(xué)習(xí)MATLAB官方幫助文檔mapminmax

后面還要對(duì)預(yù)測(cè)特征數(shù)據(jù)歸一化處理

此時(shí),使用mapminmax的'apply'命令

調(diào)用特征數(shù)據(jù)歸一化得到的結(jié)構(gòu)體PS1

完成歸一化處理

[P_regular,PS1]=mapminmax(P,-1,1);
[T_regular,PS2]=mapminmax(T,-1,1);

提取數(shù)據(jù)特征數(shù)量

input_num=size(P,1);   %輸入特征個(gè)數(shù)
output_num=size(T,1);  %輸出特征個(gè)數(shù)

設(shè)置遺傳算法參數(shù)

iter_num=300;        %進(jìn)化迭代次數(shù)
group_num=100;       %種群規(guī)模
cross_pro=0.625;     %交叉概率
mutation_pro=0.05;   %變異概率,相對(duì)來(lái)說(shuō)比較小

設(shè)置兩層隱藏層的神經(jīng)元個(gè)數(shù)

hidden_num1=8;   %第一層隱藏層神經(jīng)元個(gè)數(shù)
hidden_num2=6;   %第二層隱藏層神經(jīng)元個(gè)數(shù)(比第一層?。?/code>

計(jì)算整個(gè)網(wǎng)絡(luò)層的節(jié)點(diǎn)數(shù)之和

總結(jié)點(diǎn)數(shù)=輸入特征數(shù)×第一層隱藏層節(jié)點(diǎn)數(shù)+第一層隱藏層節(jié)點(diǎn)數(shù)+第一層隱藏層節(jié)點(diǎn)數(shù)×第二層隱藏層節(jié)點(diǎn)數(shù)+第二層隱藏層節(jié)點(diǎn)數(shù)+...+第n層隱藏層節(jié)點(diǎn)數(shù)+第n層隱藏層節(jié)點(diǎn)數(shù)×第n+1層隱藏層節(jié)點(diǎn)數(shù)+第n+1層隱藏層節(jié)點(diǎn)數(shù)+第n+1層隱藏層節(jié)點(diǎn)數(shù)×輸出特征數(shù)+輸出特征數(shù)。

☆☆☆☆☆

以下是2層隱藏層的網(wǎng)絡(luò)層節(jié)點(diǎn)數(shù)之和

num_all=input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+...
+hidden_num2+hidden_num2*output_num+output_num; %節(jié)點(diǎn)總數(shù)

?設(shè)置種群長(zhǎng)度和初始參數(shù)范圍

lenchrom=ones(1,num_all);                       %種群總長(zhǎng)度
limit=[-1*ones(num_all,1) 1*ones(num_all,1)];   %初始參數(shù)給定范圍

遺傳算法部分

主要思想就是

優(yōu)化神經(jīng)網(wǎng)絡(luò)的權(quán)重和閾值(偏置)初始選擇

其初始選擇

對(duì)于神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)效果好壞

是有較大影響的

流程框架

GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)

流程代碼

%% 實(shí)驗(yàn)開(kāi)始
TIME=[];
num_iter_all=5;   %實(shí)驗(yàn)次數(shù)
input_data=P_regular;
output_data=T_regular;
test=[];
EMS_all=[];
titlestr=['實(shí)驗(yàn)運(yùn)行中,請(qǐng)稍等......'];
mm=waitbar(0,titlestr);%實(shí)驗(yàn)循環(huán)進(jìn)度條
set(mm,'Position',[245 376.8750 270 56.2500])
for NN=1:num_iter_all
    t1=clock;%每次實(shí)驗(yàn)開(kāi)始的時(shí)間
    str=['實(shí)驗(yàn)運(yùn)行第',num2str(NN),'次中,請(qǐng)稍等......'];
    waitbar(NN/num_iter_all,mm,str); %實(shí)驗(yàn)進(jìn)度條
 %% 基因編譯
    for i=1:group_num
        initial=rand(1,length(lenchrom));  %產(chǎn)生0-1的隨機(jī)數(shù)
        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);%計(jì)算初始適應(yīng)度
        fitness_group(i)=fitness_value;
    end
    [bestfitness,bestindex]=min(fitness_group);
    bestchrom=initial_chrom(bestindex,:);  %最好的染色體
    avgfitness=sum(fitness_group)/group_num; %染色體的平均適應(yīng)度
    trace=[avgfitness bestfitness]; % 記錄每一代進(jìn)化中最好的適應(yīng)度和平均適應(yīng)度
 %% 迭代過(guò)程
    input_chrom=initial_chrom;
    titlestr=['GA迭代中,請(qǐng)稍等......'];
    kk=waitbar(0,titlestr);%遺傳迭代循環(huán)進(jìn)度條
    set(kk,'Position',[925 376.8750 270 56.2500])
    for num=1:iter_num
        str=['GA迭代第',num2str(num),'次中,請(qǐng)稍等......',num2str(num/iter_num*100),'%'];
        waitbar(num/iter_num,kk,str); %GA迭代進(jìn)度條
        % 選擇
        [new_chrom,new_fitness]=select(input_chrom,fitness_group,group_num);   %把表現(xiàn)好的挑出來(lái),還是和種群數(shù)量一樣
        % 交叉
        new_chrom=Cross(cross_pro,lenchrom,new_chrom,group_num,limit);
        % 變異
        new_chrom=Mutation(mutation_pro,lenchrom,new_chrom,group_num,num,iter_num,limit);
        % 計(jì)算每次迭代后的適應(yīng)度
        for j=1:group_num
            sgroup=new_chrom(j,:); %個(gè)體 
new_fitness(j)=fitness(sgroup,input_num,hidden_num1,hidden_num2,output_num,input_data,output_data);
        end
        %找到最小和最大適應(yīng)度的染色體及它們?cè)诜N群中的位置
        [newbestfitness,newbestindex]=min(new_fitness);
        [worestfitness,worestindex]=max(new_fitness);
        % 代替上一次進(jìn)化中最好的染色體
        if  newbestfitness<bestfitness
            bestfitness=newbestfitness;
            bestchrom=new_chrom(newbestindex,:);
        end
        new_chrom(worestindex,:)=bestchrom;
        new_fitness(worestindex)=bestfitness;
        avgfitness=sum(new_fitness)/group_num;
        trace=[trace;avgfitness bestfitness]; %記錄每一代進(jìn)化中最好的適應(yīng)度和平均適應(yīng)度
    end
    close(kk)
 %% 繪制適應(yīng)度曲線圖并保存
    h=figure('visible','off');
    [r ,~]=size(trace);
    plot((1:r)',trace(:,2),'b--');
    titlestr=['適應(yīng)度曲線  ','終止代數(shù)=',num2str(iter_num),'    第',num2str(NN),'次實(shí)驗(yàn)優(yōu)化'];
    title(titlestr);
    xlabel('進(jìn)化代數(shù)');ylabel('適應(yīng)度');
    legend('最佳適應(yīng)度');
    set(gca,'xlim',[0,iter_num])
    titlestr=['第',num2str(NN),'次實(shí)驗(yàn)GA適應(yīng)度'];
    print(h,'-dpng',titlestr)
 %% 把遺傳算法優(yōu)化的最優(yōu)初始閥值權(quán)值賦予網(wǎng)絡(luò)預(yù)測(cè)
    %構(gòu)建網(wǎng)絡(luò)結(jié)構(gòu)
    net=newff(P_regular,T_regular,[hidden_num1 hidden_num2],{'tansig','tansig','purelin'},'trainlm');
    %權(quán)值初始化
    w1=bestchrom(1:input_num*hidden_num1);   %輸入層和第一層隱藏層之間的權(quán)重參數(shù)
    B1=bestchrom(input_num*hidden_num1+1:input_num*hidden_num1+hidden_num1); %第一層隱藏層神經(jīng)元的偏置
    w2=bestchrom(input_num*hidden_num1+hidden_num1+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2);  %第一層隱藏層和第二層隱藏層之間的權(quán)重參數(shù)
    B2=bestchrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2); %第二層隱藏層神經(jīng)元的偏置
    w3=bestchrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num);%第二層隱藏層和輸出層之間的權(quán)值參數(shù)
    B3=bestchrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num+output_num);%輸出層神經(jīng)元的偏執(zhí)
    %網(wǎng)絡(luò)權(quán)值賦值
    net.iw{1,1}=reshape(w1,hidden_num1,input_num);
    net.lw{2,1}=reshape(w2,hidden_num2,hidden_num1);
    net.lw{3,2}=reshape(w3,output_num,hidden_num2);
    net.b{1}=reshape(B1,hidden_num1,1);
    net.b{2}=reshape(B2,hidden_num2,1);
    net.b{3}=reshape(B3,output_num,1);
    % 設(shè)置訓(xùn)練參數(shù)
    net.trainParam.lr=0.001;             %學(xué)習(xí)率
    net.trainParam.goal=0.001;    %目標(biāo)誤差
    net.trainParam.epochs=4000; %最大迭代次數(shù)
 %% 調(diào)用神經(jīng)網(wǎng)絡(luò)工具箱開(kāi)始訓(xùn)練
    num=40; %訓(xùn)練次數(shù)
    ems_all=[];
    Test=[];
    titlestr=['BP訓(xùn)練中,請(qǐng)稍等......'];
    nn=waitbar(0,titlestr);%訓(xùn)練循環(huán)進(jìn)度條
    set(nn,'Position',[925 376.8750 270 56.2500])
    for i=1:num
        str=['BP訓(xùn)練第',num2str(i),'次中,請(qǐng)稍等......',num2str(i/num*100),'%'];
        waitbar(i/num,nn,str); %訓(xùn)練進(jìn)度條
        %調(diào)用trainlm算法訓(xùn)練網(wǎng)絡(luò)
        [net,tr]=train(net,P_regular,T_regular);
        %放入到網(wǎng)絡(luò)輸出數(shù)據(jù)
        A=sim(net,P_regular); %訓(xùn)練數(shù)據(jù)
  % 更新每次訓(xùn)練后的網(wǎng)絡(luò)權(quán)值和閾值
        w1=net.iw{1,1};
        w2=net.lw{2,1};
        w3=net.lw{3,2};
        B1=net.b{1};
        B2=net.b{2};
        B3=net.b{3};
  %利用訓(xùn)練好的網(wǎng)絡(luò)進(jìn)行預(yù)測(cè)
        %導(dǎo)入2022特征數(shù)據(jù)
        nP=newdata;
        nP_num=size(nP,2);
        %數(shù)據(jù)歸一化處理
        nP_regular=mapminmax('apply',nP,PS1);
        %輸出預(yù)測(cè)結(jié)果
        Hidden1_Out=tansig(w1*nP_regular+repmat(B1,1,nP_num)); %第一層隱藏層
        Hidden2_Out=tansig(w2*Hidden1_Out+repmat(B2,1,nP_num));%第二層隱藏層
        nT_regular=purelin(w3*Hidden2_Out+repmat(B3,1,nP_num));%輸出層
        B=[A';nT_regular']';
        %將得到的數(shù)據(jù)反歸一化得到預(yù)測(cè)數(shù)據(jù)
        a=mapminmax('reverse',B,PS2);
  %計(jì)算每次實(shí)驗(yàn)誤差
        errors_nn=abs(a(:,1:13)-T);%每一年的誤差人數(shù)
        EcRMSE=sum(errors_nn./T)/length(errors_nn)*100;%每次實(shí)驗(yàn)的誤差百分比
  %存儲(chǔ)每次網(wǎng)絡(luò)訓(xùn)練數(shù)據(jù)并選擇最優(yōu)值
        ems_all=[ems_all,EcRMSE];
        Test=[Test;a];
        [p,q]=min(ems_all); %q最小訓(xùn)練誤差的次數(shù)
        EcRMSE=p;%p最小訓(xùn)練誤差值
        a=Test(q,:);
    end
    close(nn)
 %% 繪制每次BP誤差曲線圖并保存
    h=figure('visible','off');
    plot((1:num),ems_all,'b--');
    titlestr=['誤差曲線  ','終止代數(shù)=',num2str(num),'    第',num2str(NN),'次實(shí)驗(yàn)優(yōu)化'];
    title(titlestr);
    xlabel('進(jìn)化代數(shù)');ylabel('誤差百分比/(%)');
    legend('BP訓(xùn)練誤差');
    set(gca,'xlim',[0,num])
    titlestr=['第',num2str(NN),'次實(shí)驗(yàn)BP誤差'];
    print(h,'-dpng',titlestr)
 %% 存儲(chǔ)每次實(shí)驗(yàn)相關(guān)數(shù)據(jù)
    EMS_all=[EMS_all,EcRMSE];%存儲(chǔ)每次實(shí)驗(yàn)誤差
    test=[test;a];
 %% GA-BP迭代優(yōu)化擇優(yōu)
    %索引最小誤差的實(shí)驗(yàn)次數(shù)
    [m,n]=min(EMS_all);
    a=test(n,:);
 %% 每次實(shí)驗(yàn)所耗時(shí)間存儲(chǔ)
    t2=clock;%每次實(shí)驗(yàn)結(jié)束的時(shí)間
    Time_all=etime(t2,t1);%實(shí)驗(yàn)所耗時(shí)間
    TIME=[TIME,Time_all];%存儲(chǔ)每次實(shí)驗(yàn)所耗時(shí)間
    time=sum(TIME);%實(shí)驗(yàn)總共所耗時(shí)間計(jì)算
end
close(mm)

建模方法特點(diǎn)

關(guān)閉了遺傳算法的適應(yīng)度迭代圖

和神經(jīng)網(wǎng)絡(luò)訓(xùn)練誤差圖

但保存在了MATLAB打開(kāi)的文件夾里

☆☆☆☆☆

模型中對(duì)整個(gè)實(shí)驗(yàn)循環(huán)

(神經(jīng)網(wǎng)絡(luò)每次預(yù)測(cè)的值是不唯一的,選取實(shí)驗(yàn)誤差最小的模型數(shù)據(jù)作為最終預(yù)測(cè)值)

遺傳算法迭代循環(huán)、神經(jīng)網(wǎng)絡(luò)訓(xùn)練循環(huán)

設(shè)置了進(jìn)度條顯示

(循環(huán)次數(shù)設(shè)置的比較大,可以查看實(shí)驗(yàn)進(jìn)程)

☆☆☆☆☆

在遺傳算法優(yōu)化模塊中:

適應(yīng)度計(jì)算函數(shù)

function fitness_value=fitness(input_chrom,input_num,hidden_num1,hidden_num2,output_num,input_data,output_data)
%該函數(shù)用來(lái)計(jì)算適應(yīng)度值
%input_chrom     輸入種群
%input_num        輸入層的節(jié)點(diǎn)數(shù),即數(shù)據(jù)特征數(shù)量
%output_num      隱含層節(jié)點(diǎn)數(shù),隱藏層神經(jīng)元的個(gè)數(shù)
%input_data        訓(xùn)練輸入數(shù)據(jù)
%output_data     訓(xùn)練輸出數(shù)據(jù)
%fitness_value    個(gè)體適應(yīng)度值
w1=input_chrom(1:input_num*hidden_num1);   %輸入層和第一層隱藏層之間的權(quán)重參數(shù)
B1=input_chrom(input_num*hidden_num1+1:input_num*hidden_num1+hidden_num1); %第一層隱藏層神經(jīng)元的偏置
w2=input_chrom(input_num*hidden_num1+hidden_num1+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2);  %第一層隱藏層和第二層隱藏層之間的權(quán)重參數(shù)
B2=input_chrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2); %第二層隱藏層神經(jīng)元的偏置
w3=input_chrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num);%第二層隱藏層和輸出層之間的權(quán)重參數(shù)
B3=input_chrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num+1:end);%輸出層神經(jīng)元的偏置
%網(wǎng)絡(luò)權(quán)值賦值
W1=reshape(w1,hidden_num1,input_num);
W2=reshape(w2,hidden_num2,hidden_num1);
W3=reshape(w3,output_num,hidden_num2);
B1=reshape(B1,hidden_num1,1);
B2=reshape(B2,hidden_num2,1);
B3=reshape(B3,output_num,1);
[~,n]=size(input_data);
A1=tansig(W1*input_data+repmat(B1,1,n));   %需與主函數(shù)中激活函數(shù)相同
A2=tansig(W2*A1+repmat(B2,1,n));           %需與主函數(shù)中激活函數(shù)相同
A3=purelin(W3*A2+repmat(B3,1,n));          %需與主函數(shù)中激活函數(shù)相同
error=sumsqr(output_data-A3);
fitness_value=error; %誤差即為適應(yīng)度
end

利用神經(jīng)網(wǎng)絡(luò)的權(quán)重和閾值

計(jì)算輸入數(shù)據(jù)的預(yù)測(cè)值

從而計(jì)算適應(yīng)度值=預(yù)測(cè)值與輸出值差的平方和

其中:

輸入層與第一層隱藏層之間的權(quán)重值w1=索引輸入染色體值initial_chrom的范圍(1:輸入染色體的第1個(gè)到輸入特征數(shù)目×第一層隱藏層節(jié)點(diǎn)數(shù));

第一層隱藏層神經(jīng)元的偏置B1=索引輸入染色體值initial_chrom的范圍(w1索引范圍的末值+1:w1索引范圍的末值+第一層隱藏層節(jié)點(diǎn)數(shù));

第一層隱藏層和第二層隱藏層之間的權(quán)重值w2=索引輸入染色體值initial_chrom的范圍(B1索引范圍的末值+1:B1索引范圍的末值+第一層隱藏層節(jié)點(diǎn)數(shù)×第二層隱藏層節(jié)點(diǎn)數(shù));

第二層隱藏層神經(jīng)元的偏置B2=索引輸入染色體值initial_chrom的范圍(w2索引范圍的末值+1:w2索引范圍的末值+第二層隱藏層節(jié)點(diǎn)數(shù));

第二層隱藏層和輸出層之間的權(quán)重值w3=索引輸入染色體值initial_chrom的范圍(B2索引范圍的末值+1:B2索引范圍的末值+第二層隱藏層節(jié)點(diǎn)數(shù));

輸出層神經(jīng)元的偏置B3=索引輸入染色體值initial_chrom的范圍(w3索引范圍的末值+1:end);

☆☆☆☆☆

以上權(quán)重和偏置的各索引

范圍必須設(shè)置正確

否則后面的網(wǎng)絡(luò)權(quán)值reshape重組時(shí)

與網(wǎng)絡(luò)結(jié)構(gòu)不匹配會(huì)報(bào)錯(cuò)

(后面神經(jīng)網(wǎng)絡(luò)中初始權(quán)重和偏置的索引范圍同理)

?

選擇操作函數(shù)

function [new_chrom,new_fitness]=select(input_chrom,fitness_group,group_num)
% 用輪盤賭在原來(lái)的函數(shù)里選擇
% fitness_group    種群信息
% group_num     種群規(guī)模
% newgroup        選擇后的新種群
%求適應(yīng)度值倒數(shù)  
fitness1=10./fitness_group; %individuals.fitness為個(gè)體適應(yīng)度值
%個(gè)體選擇概率
sumfitness=sum(fitness1);
sumf=fitness1./sumfitness;
%采用輪盤賭法選擇新個(gè)體
index=[];
for i=1:1000   %group_num為種群數(shù)
    pick=rand;
    while pick==0   
        pick=rand;       
    end
   for j=1:group_num   
        pick=pick-sumf(j);       
        if pick<0       
            index=[index j];           
            break; 
        end
   end
   if length(index) == group_num
        break;
  end
end

%新種群
new_chrom=input_chrom(index,:);   
new_fitness=fitness_group(index);
end

交叉操作函數(shù)

function new_chrom=Cross(cross_pro,lenchrom,input_chrom,group_num,limit)
%隨機(jī)選擇兩個(gè)染色體位置交叉
% cross_pro                   交叉概率
% lenchrom                   染色體的長(zhǎng)度,即所有參數(shù)的數(shù)量
% input_chrom              染色體群,經(jīng)過(guò)選擇遺傳下來(lái)的表現(xiàn)比較好的
% group_num                種群規(guī)模
% new_chrom                交叉后的染色體
 for i=1:group_num  %每一輪for循環(huán)中,可能會(huì)進(jìn)行一次交叉操作,染色體是隨機(jī)選擇的,交叉位置也是隨機(jī)選擇的,
                  %但該輪for循環(huán)中是否進(jìn)行交叉操作則由交叉概率決定(continue控制)        
    pick=rand(1,2);   % 隨機(jī)選擇兩個(gè)染色體進(jìn)行交叉
     while prod(pick)==0       %連乘
         pick=rand(1,2);
     end
    index=ceil(pick.*group_num);  % 交叉概率決定是否進(jìn)行交叉
    pick=rand;
     while pick==0
         pick=rand;
     end
     if pick>cross_pro
         continue;
     end
         % 隨機(jī)選擇交叉位
         pick=rand;
         while pick==0
             pick=rand;
         end
         flag=0;
       while flag==0
         pos=ceil(pick*length(lenchrom)); %隨機(jī)選擇進(jìn)行交叉的位置,即選擇第幾個(gè)變量進(jìn)行交叉,注意:兩個(gè)染色體交叉的位置相同
         pick=rand; %交叉開(kāi)始
         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; %交叉結(jié)束
       
       %判斷交叉后的兩條染色體可不可行  
        limit1=mean(limit);
        f11=isempty(find(input_chrom(index(1),:)>limit1(2), 1));
        f12=isempty(find(input_chrom(index(1),:)<limit1(1), 1));
        if f11*f12==0
            flag1=0;
        else
            flag1=1;
        end
        
        f21=isempty(find(input_chrom(index(2),:)>limit1(2), 1));
        f22=isempty(find(input_chrom(index(2),:)<limit1(1), 1));
        if f21*f22==0
            flag2=0;
        else
            flag2=1;
        end
         
         if   flag1*flag2==0
             flag=0;
         else
             flag=1;
         end    %如果兩個(gè)染色體不是都可行,則重新交叉
        end    
 end
 new_chrom=input_chrom;
end

變異操作函數(shù)

function new_chrom=Mutation(mutation_pro,lenchrom,input_chrom,group_num,num,iter_num,limit)
% 本函數(shù)完成變異操作
% mutation_pro           變異概率
% lenchrom                 染色體長(zhǎng)度
% input_chrom   輸入交叉過(guò)后的染色體
% group_num              種群規(guī)模
% iter_num             最大迭代次數(shù)
% limit                  每個(gè)個(gè)體的上限和下限
% num                   當(dāng)前迭代次數(shù)
% new_chrom           變異后的染色體
for i=1:group_num   %每一輪for循環(huán)中,可能會(huì)進(jìn)行一次變異操作,染色體是隨機(jī)選擇的,變異位置也是隨機(jī)選擇的,
    %但該輪for循環(huán)中是否進(jìn)行變異操作則由變異概率決定(continue控制)
    % 隨機(jī)選擇一個(gè)染色體進(jìn)行變異
    pick=rand;
    while pick==0
        pick=rand;
    end
    index=ceil(pick*group_num);
    % 變異概率決定該輪循環(huán)是否進(jìn)行變異
    pick=rand;
    if pick>mutation_pro
        continue;
    end
    flag=0;
    while flag==0
        % 變異位置
        pick=rand;
        while pick==0     
            pick=rand;
        end
        pos=ceil(pick*sum(lenchrom));  %隨機(jī)選擇了染色體變異的位置,即選擇了第pos個(gè)變量進(jìn)行變異
        pick=rand; %變異開(kāi)始    
        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   %變異結(jié)束
        
        limit1=mean(limit);
        f1=isempty(find(input_chrom(index,:)>limit1(2)));
        f2=isempty(find(input_chrom(index,:)<limit1(1)));
        if f1*f2==0
            flag=0;
        else
            flag=1;
        end
    end
end
new_chrom=input_chrom;

神經(jīng)網(wǎng)絡(luò)算法模塊的設(shè)置

經(jīng)過(guò)多次測(cè)試

第一層和第二層隱藏層的激活函數(shù)用‘tansig

輸出層的激活函數(shù)用‘purelin

訓(xùn)練算法函數(shù)用‘trainlm

預(yù)測(cè)效果是最好的

☆☆☆☆☆

網(wǎng)絡(luò)的權(quán)重和閾值索引的是

遺傳算法優(yōu)化模塊迭代進(jìn)化后的最優(yōu)值bestchrom

各權(quán)重和偏置索引最優(yōu)值bestchrom的范圍

同遺傳算法中的適應(yīng)度計(jì)算中的設(shè)置相同

☆☆☆☆☆

由于,神經(jīng)網(wǎng)絡(luò)的訓(xùn)練易陷入最小值

訓(xùn)練次數(shù)設(shè)置很大也不容易找到更優(yōu)預(yù)測(cè)

所以,隱藏層數(shù)設(shè)置為2層、減少訓(xùn)練次數(shù)

同樣能夠完成優(yōu)化

且隱藏層增加1層并不會(huì)對(duì)所耗時(shí)間有太大影響

整體模型預(yù)測(cè)

效果更好,消耗時(shí)間更短

☆☆☆☆☆

整個(gè)實(shí)驗(yàn)中

對(duì)遺傳算法的每一代

適應(yīng)度值、神經(jīng)網(wǎng)絡(luò)訓(xùn)練值、預(yù)測(cè)值、誤差值

都進(jìn)行了存儲(chǔ)

并選擇了最優(yōu)值

使用mapminmax函數(shù)對(duì)得到的最優(yōu)數(shù)據(jù)反歸一化

使用mapminmax函數(shù)的返回命令'reverse'

調(diào)用歸一化時(shí)得到的結(jié)構(gòu)體PS2

完成最優(yōu)數(shù)據(jù)反歸一化

?????

繪制實(shí)驗(yàn)誤差曲線圖

實(shí)際值與預(yù)測(cè)值曲線圖

設(shè)置實(shí)驗(yàn)結(jié)果提示窗口

%% 提取2022年的預(yù)測(cè)數(shù)據(jù)
Ab=a(1,14);
disp('2022年的預(yù)測(cè)客流量為:')
disp(Ab)
%% 繪制曲線圖
%繪制GA-BP誤差曲線
figure('visible','on');
plot(EMS_all,'LineWidth',2)
xlabel('實(shí)驗(yàn)優(yōu)化次數(shù)')
ylabel('誤差')
titlestr=('GA-BP實(shí)驗(yàn)誤差曲線');
title(titlestr)
%繪制目標(biāo)數(shù)據(jù)與預(yù)測(cè)數(shù)據(jù)曲線圖
figure
x1=2009:1:2021;%實(shí)際值年份
x2=2009:1:2022;%預(yù)測(cè)值年份
axy3=plot(x1,T,'b-','linewidth',1);
hold on
axy4=plot(x2,test(n,:),'r--.','linewidth',1);
xlabel('年份')
ylabel('客流量/億人次')
titlestr=['GABP遺傳神經(jīng)網(wǎng)絡(luò)算法預(yù)測(cè)——我國(guó)城市公交系統(tǒng)車站客流量','  誤差:',num2str(m),'%','     2022年預(yù)測(cè)客流量為:',num2str(Ab),'億人次'];
title(titlestr)
set(gca,'xtick',2009:1:2022);
legend([axy3(1),axy4(1)],'真實(shí)數(shù)據(jù)','預(yù)測(cè)數(shù)據(jù)')
axis([2009 2022 400 800])
grid on
%% 繪制結(jié)果提示窗口
titlestr1=['實(shí)驗(yàn)',num2str(num_iter_all),'次','所耗時(shí)間:',num2str(time),' 秒','     最小誤差為: 第  ',num2str(n(1)),'  次的  ',num2str(m(1)),'%'];
titlestr2=['2022年預(yù)測(cè)客流量為 :    ',num2str(Ab),'  億人次'];
disp(titlestr1)
disp(titlestr2)
h=msgbox({titlestr1;titlestr2},'GA-BP模型預(yù)測(cè)結(jié)果');
% 文本居中
th = findall(0, 'Tag','MessageBox' );
boxPosition = get(h,'position');
textPosition = get(th, 'position');
set(th, 'position', [boxPosition(3).*0.5 textPosition(2) textPosition(3)]);
set(th, 'HorizontalAlignment', 'center');

運(yùn)行結(jié)果圖

GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)

?GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)

GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)

GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)

GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)

GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)

僅供學(xué)習(xí)參考

?

基于遺傳算法優(yōu)化的城市公交系統(tǒng)車站客流量預(yù)測(cè)

到了這里,關(guān)于GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包