本稿では、差分進化とグレウルフ最適化を組み合わせたDEGWO-BPアルゴリズムを紹介します。この手法は、BPニューラルネットワークの初期重みとバイアスを最適化し、多変数単出力の回帰予測問題に対応します。Matlabで実装され、既にデバッグ済みのコードを提供します。
DEGWOアルゴリズムの主な改良点は、差分進化が局所最適解に陥りやすい問題と、グレウルフアルゴリズムが早期収束しやすい欠点を克服することにあります。差分進化の変異・選択演算子を用いて種群の多様性を維持し、グレウルフアルゴリズムと差分進化の交叉・選択演算子を導入してグローバルサーチを実現します。最適化過程では、反復的な漸進的収束が行われます。
コアとなる変異操作の実装例を以下に示します:
% 差分変異操作
for i=1:SearchAgents_no
r1 = randi([1,SearchAgents_no]);
while(r1==i)
r1 = randi([1,SearchAgents_no]);
end
mutantPos = Positions(r1,:) + rand*(Best_pos - Positions(r1,:)) + rand*(Positions(alpha,:)-Positions(delta,:));
% 境界処理
mutantPos = max(mutantPos, lower_bound);
mutantPos = min(mutantPos, upper_bound);
if rand < crossover_rate
newPositions(i,:) = mutantPos;
end
end
この実装では、アルファ個体とデルタ個体の位置情報を差分方向として利用し、ランダムな摂動を加えて新しい解を生成しています。これにより、グレウルフの狩猟行動に「突然変異」要素を導入し、解の多様性を確保しています。
メインプログラムは非常にシンプルで、以下の3行で実行できます:
%% メインプログラムエントリーポイント
data = xlsread('your_data.xlsx'); % 自分のExcelデータに置き換える
[bestNet,result] = DEGWO_BP(data); % 最適化を実行
plotResult(result); % 自動で比較グラフを出力
データ前処理では、匿名関数を用いた正規化が実装されています:
normalize = @(x) (x - min(x)) ./ (max(x) - min(x));
data_normalized = normalize(data);
この記述はMatlab初心者にも親切で、データ範囲を変更する際に正規化関数の定義を探す必要がありません。ただし、データに外れ値がある場合には注意が必要です。
適応度計算ではMSE損失関数が使用されていますが、ゼロ除算を防ぐための工夫が施されています:
mse = sum((T - sim(net,P)).^2)/length(T);
fitness = 1/(mse + 1e-6); % 分母保護
1e-6の平滑係数は重要で、データ量が大きい場合にmseがゼロに近づくのを防ぎます。
出力層にはpurelin関数が使用されています:
net.layers{2}.transferFcn = 'purelin'; % 回帰タスクの標準設定
分類タスクに変更する場合はsoftmax関数に、時系列予測では入力層の遅延パラメータを調整する必要があります。
注意点として、デフォルトの反復回数は50回に設定されています(parameters.Max_iter = 50;)。データ量が多い場合はこの値を増やす必要があります。また、種群サイズは50を超えないようにしてください。
このコードはベースラインとして適しており、詳細なコメントによりMatlab初心者でも容易に実行できます。