粒子群最適化 PSO 最適化 BP ニューラル ネットワーク (PSO-BP) 回帰予測 - Matlab コードの実装

1.粒子群アルゴリズム PSO

        粒子群最適化 (PSO) は、1995 年に Kennedy らによって提案された古典的なヒューリスティック アルゴリズムです。鳥類の捕食行動に関する研究に触発された PSO は、グループ内の個人間の協力と情報共有を通じて、グループの位置を無秩序から秩序へと解決空間に作り、グループのメンバーは自分自身や他のメンバーの経験から学び、検索モードを常に変更して、最適なソリューションを見つけます。調整パラメーターが少なく、収束速度が速いという利点により、PSO は現在、ニューラル ネットワークのトレーニングの最適化やその他の関数の最適化の分野で広く使用されています。

        PSO アルゴリズムの基本的な考え方は、粒子を介して鳥の群れの個体をシミュレートすることであり、これらの粒子には速度と位置の属性があります。粒子群内の各粒子は、独自の検索空間で個別に最適解を検索し、他の粒子と情報を共有して現在の大域最適解を見つけます.次に、各粒子は現在の大域最適解に従って速度と位置を調整し、継続的に反復しますグローバル最適解を得るために更新します。PSO アルゴリズムの実装手順は次のとおりです。

(1) 最大反復回数、母集団サイズ、個人学習係数、社会学習係数、慣性重みなどのパラメータを初期化し、粒子群の位置を初期化し、初期粒子適合度を計算して初期最適粒子を取得します。 ;

(2) 母集団の適応度を計算し、現在の粒子群の最適な粒子の位置を更新します。

(3) これまでのグローバル最適粒子の位置と適合度を更新します。

(4) 最適な個体位置と最適なフィットネスが得られるまで (2) ~ (3) を繰り返し、ループから飛び出します。有限回数の反復の後、粒子群内の各粒子は最適解に近づきます。

2. PSO-BP予測モデルの構築

        BP ニューラル ネットワークを確立する過程で、接続の重みをランダムに設定すると、予測結果に誤差が生じます。また、勾配降下トレーニングには、速度が遅く、極小であるという欠点があり、大域的最適値を達成することは困難です。ニューラルネットワークのトレーニング。粒子群最適化アルゴリズム PSO を使用して最適化し、予測精度と一般化能力を向上させます。ビルド プロセスは次のとおりです。

(1) データを正規化し、BP ニューラル ネットワークを確立し、トポロジを決定し、ネットワークの重みとしきい値を初期化します。

(2) PSO パラメーター、最大反復回数、母集団サイズ、個人学習因子、社会的学習因子、慣性重みなどのパラメーターを初期化します。

(3) PSO の人口位置を初期化し、BP ニューラル ネットワーク構造に従って最適化する必要がある変数要素の数を計算します。

(4) PSO 最適化、フィットネス関数は BP ネットワークによって予測された平均二乗誤差に設定され、PSO 最適化プロセスが繰り返され、最適な粒子の位置が反復の最大回数まで継続的に更新され、PSO アルゴリズムが終了しました;

(5) PSO アルゴリズムの最適化された重みしきい値パラメーターが BP ニューラル ネットワークに割り当てられます。つまり、最適な PSO-BP モデルが出力され、PSO-BP がトレーニングと予測に使用され、事前に BP ネットワークと比較されます。最適化。

コード取得: ここをクリックして直接ジャンプicon-default.png?t=N3I4http://t.csdn.cn/GIUzd

3. キーコード

%% 建立BP模型
net=newff(inputn,outputn,hiddennum_best,{'tansig','purelin'},'trainlm');
 
% 设置BP参数
net.trainParam.epochs=1000;        % 训练次数
net.trainParam.lr=0.01;            % 学习速率
net.trainParam.goal=0.00001;       % 训练目标最小误差
net.trainParam.show=25;            % 显示频率
net.trainParam.mc=0.01;            % 动量因子
net.trainParam.min_grad=1e-6;      % 最小性能梯度
net.trainParam.max_fail=6;         % 最高失败次数

%% 初始化PSO参数
popsize=10;   %初始种群规模
maxgen=50;   %最大进化代数
dim=inputnum*hiddennum_best+hiddennum_best*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum;    %自变量个数
lb=repmat(-3,1,dim);    %自变量下限
ub=repmat(3,1,dim);   %自变量上限
c1 = 2;  % 每个粒子的个体学习因子,也称为个体加速常数
c2 = 2;  % 每个粒子的社会学习因子,也称为社会加速常数
w = 0.9;  % 惯性权重
vmax =3*ones(1,dim); % 粒子的最大速度
vmax=repmat(vmax,popsize,1);

%% 初始化粒子的位置和速度
x = zeros(popsize,dim);
for i = 1: dim
    x(:,i) = lb(i) + (ub(i)-lb(i))*rand(popsize,1);   % 随机初始化粒子所在的位置在定义域内
end
v = -vmax + 2*vmax .* rand(popsize,dim);  % 随机初始化粒子的速度

%% 计算适应度
fit = zeros(popsize,1);  % 初始化这n个粒子的适应度全为0
for i = 1:popsize  % 循环整个粒子群,计算每一个粒子的适应度
    [fit(i),NET]= fitness(x(i,:),inputnum,hiddennum_best,outputnum,net,inputn,outputn,output_train,inputn_test,outputps,output_test);   % 调用函数来计算适应度
    eval( strcat('NETA.net',int2str(i),'=NET;'))
end 
pbest = x;   % 初始化这n个粒子迄今为止找到的最佳位置
ind = find(fit == min(fit), 1);  % 找到适应度最小的那个粒子的下标
gbest = x(ind,:);  % 定义所有粒子迄今为止找到的最佳位置
fit_gbest=fit(ind);  
eval( strcat('Net=NETA.net',int2str(ind ),';'));
eval( strcat('NETT=NETA.net',int2str(ind),';'));

%% 进化过程
for d = 1:maxgen  % 开始迭代,一共迭代K次
    for i = 1:popsize   % 依次更新第i个粒子的速度与位置
        v(i,:) = w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:));  % 更新第i个粒子的速度
        for j = 1: dim
            if v(i,j) < -vmax(j)
                v(i,j) = -vmax(j);
            elseif v(i,j) > vmax(j)
                v(i,j) = vmax(j);
            end
        end
        x(i,:) = x(i,:) + v(i,:); % 更新第i个粒子的位置
        for j = 1: dim
            if x(i,j) < lb(j)
                x(i,j) = lb(j);
            elseif x(i,j) > ub(j)
                x(i,j) = ub(j);
            end
        end
        [fit(i),NET] = fitness(x(i,:),inputnum,hiddennum_best,outputnum,net,inputn,outputn,output_train,inputn_test,outputps,output_test); 
        eval( strcat('NETA.net',int2str(i),'=NET;'))      [fit_pbest,~]=fitness(pbest(i,:),inputnum,hiddennum_best,outputnum,net,inputn,outputn,output_train,inputn_test,outputps,output_test);
        if fit(i) <fit_pbest    
           pbest(i,:) = x(i,:);   
           fit_pbest =fit(i);
           eval( strcat('NETT=NETA.net',int2str(i),';'))
        end
        %更新历史最优粒子位置
        if  fit_pbest < fit_gbest  
            gbest = pbest(i,:);   
            fit_gbest=fit_pbest;
            eval( strcat('Net=NETT;'));
        end
    end
    Convergence_curve(d) =fit_gbest;  % 更新第d次迭代得到的最佳的适应度
    waitbar(d/maxgen,h0,[num2str(d/maxgen*100),'%'])
    if getappdata(h0,'canceling')
        break
    end
end

%% 权重阈值更新
w1=Best_pos(1:inputnum*hiddennum_best); 
B1=Best_pos(inputnum*hiddennum_best+1:inputnum*hiddennum_best+hiddennum_best);  
w2=Best_pos(inputnum*hiddennum_best+hiddennum_best+1:inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum); 
B2=Best_pos(inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+1:inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum);   

%矩阵重构
net.iw{1,1}=reshape(w1,hiddennum_best,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum_best);
net.b{1}=reshape(B1,hiddennum_best,1);
net.b{2}=reshape(B2,outputnum,1);

4. シミュレーション結果

(1) 経験式によると、隠れ層ノードの最適な数は、入力ノードと出力ノードの数から得られます。

(2) PSO-BPとBPの予測比較図と誤差図

  (3) BPとPSO-BPの各種誤差指標と予測精度

 (4) 粒子群最適化アルゴリズムの PSO フィットネス進化曲線

  (5) BP および PSO-BP モデルの回帰図

  (6) BP および PSO-BP モデルのエラー ヒストグラム

 4. まとめ

    粒子群アルゴリズム PSO と BP ニューラル ネットワークはどちらもランダム性に基づくアルゴリズムであるため、同じパラメーター セットの最適化結果が異なる場合があり、モデルのロバスト性と信頼性を検証するには実験を繰り返す必要があることに注意してください。

おすすめ

転載: blog.csdn.net/baoliang12345/article/details/130494343