粒子群算法优化BP和Elman神经网络-matlab源码

粒子群优化算法是一种智能优化算法,又称微粒群算法,它通过模拟自然界鸟群捕食和鱼群捕食的过程。通过群体中的协作寻找到问题的全局最优解。

收敛性的数学证明帮助了PSO的发展和应用,但此内分析具有很大的局限性。为PSO加入正交学习后,算法的全局收敛、收敛精度及鲁棒可靠性都得到了提高。

话不多说直接附代码:

算法用于预测,输入为3特征值,输出为1输出。内附数据集,拿来直接用,结构清晰,注释详细,全在一个程序里,方便对比。

本次用了BP、Elman神经网络和PSO-BP、PSO-Elman神经网络对比。

部分数据集:

其中,xyz是输入,o是需要预测的输出

部分代码:

clear;clc;close all;
load data4.mat;
[train_x,inputps]=mapminmax(train_x);
test_x=mapminmax('apply',test_x,inputps);
[train_y,outputps]=mapminmax(train_y);
test_y=mapminmax('apply',test_y,outputps);
inputnum=3;hiddennum=5;outputnum=1;epoch_bp_elman=5000;
dim=26;%=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
N=50;%种群数量
epoch_pso=50;%粒子群算法迭代次数
epoch_bp=5000;epoch_elman=5000;%BP、Elman神经网络迭代次数
w=0.8;c1=1.5;c2=1.5;
Xmax=20;Xmin=-20;%粒子群x上下限
Vmax=10;Vmin=-10;%速度v上下限
%初始化种群个体位置和速度
x_bp=rand(N,dim)*(Xmax-Xmin)+Xmin;%初始BP
v_bp=rand(N,dim)*(Xmax-Xmin)+Xmin;
x_elman=rand(N,dim)*(Xmax-Xmin)+Xmin;%初始Elman
v_elman=rand(N,dim)*(Xmax-Xmin)+Xmin;
%初始化个体、全局最优位置和最优值(速度)
%PSOBP
net_bp=newff(train_x,train_y,hiddennum);%创建初始BP神经网络,给目标函数用
p_bp_local=x_bp;%当前BP种群矩阵
pbest_bp_local=ones(N,1);%当前BP种群适应度
g_bp_quanju=ones(1,dim);%全局BP种群矩阵
gbest_bp_quanju=1e5;%全局BP种群适应度初始设置为10W
%粒子群算法迭代开始
......

figure(1);
plot(1:size(yy_bp,2),yy_bp,'b-');
title('PSO收敛曲线','fontsize',12);
xlabel('迭代次数','fontsize',12);ylabel('适应度值','fontsize',12);
%把粒子群算法迭代结果最优值赋给神经网络当做权重和偏置
w1_bp=x_bp(1:inputnum*hiddennum);
B1_bp=x_bp(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2_bp=x_bp(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2_bp=x_bp(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
w1_elman=x_elman(1:inputnum*hiddennum);
B1_elman=x_elman(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2_elman=x_elman(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2_elman=x_elman(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

figure(2);
plot(1:size(error_psobp,2),error_psobp,'r',1:size(error_bp,2),error_bp,'m--',1:size(error_psoelman,2),error_psoelman,'g-',1:size(error_elman,2),error_elman,'c--');%
title('预测误差','fontsize',12);
xlabel('样本数量','fontsize',12);ylabel('误差值','fontsize',12);
legend('PSO-BP误差','BP误差','PSO-Elman误差','Elman误差');
figure(3);
plot(1:size(test_x,2),result_bp,'m-',1:size(test_x,2),result_sim_bp,'r-',1:size(test_x,2),test_y,'b-',1:size(result_sim_elman,2),result_sim_elman,'g-',1:size(result_elman,2),result_elman,'c--')
legend('BP预测值','PSO-BP预测值','真实值','PSO+Elman预测值','Elman预测值');

 粒子群算法收敛曲线图:

预测结果:

源码下载地址:

链接:https://pan.baidu.com/s/1Hzk0trmkdHr0GfmBjk2KGA 
提取码:6666

-------------------------------------------------------我的其他代码--------------------------------------------------------

粒子群算法优化BP神经网络-matlab源码

头脑风暴算法优化BP神经网络-matlab源码

层次聚类、k_means聚类-python源码

Adaboost-python手推源码不调用库-有手就会

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用蜂群算法优化ELman神经网络MATLAB程序: ```matlab % 蜂群算法优化ELman神经网络 % 初始化 clear clc global train_input train_target test_input test_target N I H K load Data.mat % 加载数据 train_input = Data.train_input; train_target = Data.train_target; test_input = Data.test_input; test_target = Data.test_target; N = size(train_input, 2); % 样本数 I = size(train_input, 1); % 输入层节点数 H = 10; % 隐层节点数 K = 1; % 输出层节点数 Foods = 30; % 食物数量 Limit = 100; % 迭代次数 Range = 10; % 搜索范围 SP = 0.6; % 固定搜索概率 SN = 5; % 邻域搜索次数 FoodPosition = zeros(Foods, H * (I + H + K) + K); % 食物位置 FoodSource = zeros(Foods, 1); % 食物源 GlobalMin = realmax; % 全局最优解 GlobalParams = zeros(1, H * (I + H + K) + K); % 全局最优参数 Fitness = zeros(Foods, 1); % 适应度值 Max = zeros(Limit, 1); % 最大适应度值 Mean = zeros(Limit, 1); % 平均适应度值 % 初始化食物位置和适应度值 for i = 1:Foods FoodPosition(i, :) = rand(1, H * (I + H + K) + K) * Range * 2 - Range; [Fitness(i), ~] = BPNN(FoodPosition(i, :)); if Fitness(i) < GlobalMin GlobalMin = Fitness(i); GlobalParams = FoodPosition(i, :); end end % 迭代搜索 for t = 1:Limit % 邻域搜索 for i = 1:Foods for j = 1:SN NewFoodPosition = FoodPosition(i, :) + rand(1, H * (I + H + K) + K) * Range * 2 - Range; [NewFitness, ~] = BPNN(NewFoodPosition); if NewFitness < Fitness(i) FoodPosition(i, :) = NewFoodPosition; Fitness(i) = NewFitness; end if NewFitness < GlobalMin GlobalMin = NewFitness; GlobalParams = NewFoodPosition; end end end % 固定搜索 for i = 1:Foods if rand() < SP NewFoodPosition = GlobalParams + rand(1, H * (I + H + K) + K) * Range * 2 - Range; [NewFitness, ~] = BPNN(NewFoodPosition); if NewFitness < Fitness(i) FoodPosition(i, :) = NewFoodPosition; Fitness(i) = NewFitness; end if NewFitness < GlobalMin GlobalMin = NewFitness; GlobalParams = NewFoodPosition; end end end % 记录最大和平均适应度值 Max(t) = max(Fitness); Mean(t) = mean(Fitness); end % 绘制适应度值变化图 figure(1); plot(Max, 'r-'); hold on; plot(Mean, 'b--'); xlabel('迭代次数'); ylabel('适应度值'); legend('最大适应度值', '平均适应度值'); % 测试 [~, output] = BPNN(GlobalParams, 1); output = round(output); accuracy = sum(output == test_target) / length(test_target); disp(['测试准确率为:', num2str(accuracy)]); % BP神经网络 function [fitness, output] = BPNN(params, test) global train_input train_target test_input test_target N I H K W1 = reshape(params(1:H * I), H, I); B1 = reshape(params(H * I + 1:H * I + H), H, 1); W2 = reshape(params(H * I + H + 1:H * I + H + H * K), K, H); B2 = reshape(params(H * I + H + H * K + 1:end), K, 1); if test == 0 % 训练 net = newelm(train_input, train_target, H, {'tansig', 'purelin'}, 'traingd', 'learngd', 'mse'); net.IW{1,1} = W1; net.b{1} = B1; net.LW{2,1} = W2; net.b{2} = B2; net.trainParam.lr = 0.1; net.trainParam.epochs = 100; net.trainParam.goal = 0.01; net = train(net, train_input, train_target); output = sim(net, train_input); fitness = mse(output - train_target); else % 测试 net = newelm(train_input, train_target, H, {'tansig', 'purelin'}, 'traingd', 'learngd', 'mse'); net.IW{1,1} = W1; net.b{1} = B1; net.LW{2,1} = W2; net.b{2} = B2; output = sim(net, test_input); fitness = mse(output - test_target); end end ``` 代码中使用了ELman神经网络,其中蜂群算法用于优化神经网络的权重和偏置参数。通过运行程序,可以得到神经网络的最优参数和测试准确率。同时,程序还会输出适应度值变化图,以便分析算法的收敛情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我也想搞机器学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值