回归预测 | MATLAB实现IPSO-BP、PSO-BP、BP多输入单输出预测对比(改进粒子群算法优化BP神经网络)

回归预测 | MATLAB实现IPSO-BP、PSO-BP、BP多输入单输出预测对比(改进粒子群算法优化BP神经网络)

效果一览

1
2
3
4

基本介绍

MATLAB实现IPSO-BP、PSO-BP、BP改进粒子群算法优化BP神经网络多输入单输出(不同数据优化效果不一样,改进后的效果也有差异)

程序设计

  • 完整程序私信博主。
%% 粒子群初始化
Range = ones(sizepop,1)*(ub-lb);
pop = rand(sizepop,Dim).*Range + ones(sizepop,1)*lb;    % 初始化粒子群
V = rand(sizepop,Dim)*(Vmax-Vmin) + Vmin;                 % 初始化速度
fitness = zeros(sizepop,1);
for i=1:sizepop
    fitness(i,:) = fun(pop(i,:));                         % 粒子群的适应值
end

%% 个体极值和群体极值
[bestf, bestindex]=min(fitness);
zbest=pop(bestindex,:);   % 全局最佳
gbest=pop;                % 个体最佳
fitnessgbest=fitness;              % 个体最佳适应值
fitnesszbest=bestf;               % 全局最佳适应值

%% 迭代寻优
iter = 0;
while( (iter < maxiter ))
    w=Wmin*rand*(1-cos(pi*iter*0.5/maxiter))+Wmax*(cos(pi*iter*0.5/maxiter))^0.5;
    for j=1:sizepop
        % 速度更新
        V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
        if V(j,:)>Vmax
            V(j,:)=Vmax;
        end
        if V(j,:)<Vmin
            V(j,:)=Vmin;
        end
        % 位置更新
        pop(j,:)=pop(j,:)+V(j,:);
        for k=1:Dim
            if pop(j,k)>ub(k)
                pop(j,k)=ub(k);
            end
            if pop(j,k)<lb(k)
                pop(j,k)=lb(k);
            end
        end
        % 适应值
        fitness(j,:) =fun(pop(j,:));
        % 个体最优更新
        if fitness(j) < fitnessgbest(j)
            gbest(j,:) = pop(j,:);
            fitnessgbest(j) = fitness(j);
        end
        % 群体最优更新
        if fitness(j) < fitnesszbest
            zbest = pop(j,:);
            fitnesszbest = fitness(j);
        end
    end
    iter = iter+1;                      % 迭代次数更新
    curve(iter) = fitnesszbest;
end
%%  数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);

[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);

%%  节点个数
inputnum  = size(p_train, 1);   % 输入层节点数
hiddennum = 5;                  % 隐藏层节点数
outputnum = size(t_train, 1);   % 输出层节点数

%%  构建网络
net = newff(p_train, t_train, hiddennum);

%%  设置训练参数
net.trainParam.epochs     = 1000;      % 训练次数
net.trainParam.goal       = 1e-6;      % 目标误差
net.trainParam.lr         = 1e-3;      % 学习率
net.trainParam.showWindow = 0;         % 关闭窗口

%%  参数设置
fun = @getObjValue;                                 % 目标函数
dim = inputnum * hiddennum + hiddennum * outputnum + ...
    hiddennum + outputnum;                          % 优化参数个数
lb  = -1 * ones(1, dim);                            % 优化参数目标下限
ub  =  1 * ones(1, dim);                            % 优化参数目标上限
pop = 5;                                            % 种群数量
Max_iteration = 100;                                 % 最大迭代次数   

%%  优化算法
[Best_pos, Best_score, curve] = IPSO(pop, Max_iteration, lb, ub, dim, fun,2,-2); 

%%  获取最优权重

参考资料

[1] https://blog.csdn.net/kjm13182345320/article/details/129215161
[2] https://blog.csdn.net/kjm13182345320/article/details/128105718

猜你喜欢

转载自blog.csdn.net/kjm13182345320/article/details/129353309