回归预测 | MATLAB实现IPSO-BP、PSO-BP、BP多输入单输出预测对比(改进粒子群算法优化BP神经网络)
目录
- 回归预测 | MATLAB实现IPSO-BP、PSO-BP、BP多输入单输出预测对比(改进粒子群算法优化BP神经网络)
- 效果一览
- 基本介绍
- 程序设计
- 参考资料
效果一览
基本介绍
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);
%% 获取最优权重