【预测模型-BP分类】基于萤火虫算法优化BP神经网络实现数据分类附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法  神经网络预测 雷达通信  无线传感器

信号处理 图像处理 路径规划 元胞自动机 无人机

⛄ 内容介绍

为了提高数据分类准确率,提出一种基于萤火虫算法和BP神经网络的分类方法.针对反向传播(BP)神经网络存在全局搜索能力差,萤火虫算法来优化BP神经网络对初始权重敏感的问题,进而实现对数据的分类.实验结果表明,所提算法对数据的分类准确率更高,分类准确率达到94.5%,而且可以加快收敛速度

⛄ 部分代码

%==========================================================================

% 算法说明:荧火虫算法(GSO:Glowworm swarm optimisation:a new method for optimising mutlti-modal functions)

% =========================================================================

clc

clear;%清除变量

close all;

% ================================初始化开始================================

domx=[-3,3;-3,3];%定义域

%domx=[-2.048,2.048;-2.048,2.048];

rho   =0.4; %荧光素挥发因子

gamma =0.6; %适应度提取比例

beta  =0.08;%邻域变化率

nt    =5;   %邻域阀值(邻域荧火虫数)

s     =0.01;%步长

iot0  =5;   %荧光素浓度

rs    =3;   %3;%感知半径

r0    =1.5; %3;%决策半径

% ================================初始化结束================================

% ===============================分配空间开始===============================

m =size(domx,1);    %函数空间维数

n =50;              %萤火虫个数

gaddress =zeros(n,m);%分配荧火虫地址空间

ioti     =zeros(n,1);    %分配荧光素存放空间

rdi      =zeros(n,1);     %分配荧火虫决策半径存放空间

% ===============================分配空间结束===============================

figure(1);

sign_first = 1;

step_track = 0;

x = -3:0.1:3;

y = -3:0.1:3;

[xx,yy] = meshgrid(x,y);

j1=3*(1-xx).^2.*exp(-(xx.^2+(yy+1).^2));

j2=10*(xx./5-xx.^3-yy.^5).*exp(-(xx.^2+yy.^2));

j3=(1/3)*exp(-((xx+1).^2+yy));

zz=j1-j2-j3;

figure(1);

surf(xx,yy,zz);

hold on

% ===========================荧火虫常量初始化开始============================

%1.初始化地址

for i=1:m

    gaddress(:,i)=domx(i,1)+(domx(i,2)-domx(i,1))*rand(n,1);

end

gvalue = maxfun(gaddress);

gbest_old = max(gvalue);

%

%可视化

plot3(gaddress(:,1),gaddress(:,2),gvalue(:),'b*');

drawnow;

pause(1);

%

%2.初始化荧光素

ioti(:,1)=iot0;

%3.初始化决策半径

rdi(:,1)=r0;

iter_max=500;%最大迭代次数

t=1;%迭代累计

unchange = 0;

% ===========================荧火虫常量初始化结束============================

% =============================iter_max迭代开始=============================

while(t<=iter_max) && (unchange<60)

    %1.更新荧光素

    ioti=max(0,(1-rho)*ioti+gamma*maxfun(gaddress));

    %2.各荧火虫移动过程开始

    for i=1:n

        %2.1 决策半径内找更优点

        Nit=[];%存放荧火虫序号

        for j=1:n

            if (norm(gaddress(j,:)-gaddress(i,:))<rdi(i))&&(ioti(i,1)<ioti(j,1))

                Nit(numel(Nit)+1)=j;

            end

        end

        %2.2 找下一步移动的点开始

        if length(Nit)>0 %先判断Nit个数不为0

            Nitioti=ioti(Nit,1);%选出Nit荧光素

            SumNitioti=sum(Nitioti);%Nit荧光素和

            Molecular=Nitioti-ioti(i,1);%分子

            Denominator=SumNitioti-ioti(i,1);%分母

            Pij=Molecular./Denominator;%计算Nit各元素被选择概率

            Pij=cumsum(Pij);%累计

            Pij=Pij./Pij(end);%归一化

            Pos=find(rand<Pij);%确定位置

            j=Nit(Pos(1));%确定j的位置

            %荧火虫i向j移动一小步

            gaddress(i,:)=gaddress(i,:)+s*(gaddress(j,:)-gaddress(i,:))/norm(gaddress(j,:)-gaddress(i,:));

            gaddress(i,:)=range(gaddress(i,:),domx);%限制范围

            

            %

            %更新决策半径

            rdi(i)=rdi(i)+beta*(nt-length(Nit));

            if rdi(i,1)<0

                rdi(i,1)=0;

            end

            if rdi(i,1)>rs

                rdi(i,1)=rs;

            end

        end

        %2.2 找下一步移动的点结束

    end

    %

    %可视化

    gvalue = maxfun(gaddress);

    gbest_new = max(gvalue);

    

    if gbest_new > gbest_old

        unchange = 0;

        gbest_old = gbest_new;

    else

        unchange = unchange + 1;

    end

    

    %plot(gaddress(:,1),gaddress(:,2),'b.','markersize',6);hold on;

    if mod(t,20)

        plot3(gaddress(:,1),gaddress(:,2),gvalue(:),'b*');

        drawnow;

        pause(0.01);

    end

    %2.各荧火虫移动过程结束

    %保存动态图gif

            f=getframe(gcf);  

            imind=frame2im(f);

            [imind,cm] = rgb2ind(imind,256);

             if(sign_first==1)

                 sign_first=0;

                imwrite(imind,cm,'track.gif','gif', 'Loopcount',inf,'DelayTime',0.02);

             else

                imwrite(imind,cm,'track.gif','gif','WriteMode','append','DelayTime',0.02);

             end

             %保存动态图gif

    t=t+1;

end

% =============================iter_max迭代结束=============================

% =============================输出最优结果开始=============================

gvalue=maxfun(gaddress);%求各个荧火虫的值

disp('最大值为:')

num=find(gvalue==max(gvalue));%最大值序号

MaxValue=-max(gvalue)

disp('最优解为:')

BestAddress=gaddress(num,:);

% =============================输出最优结果结束=============================

⛄ 运行结果

⛄ 参考文献

[1]彭新建, 翁小雄. 基于萤火虫算法优化BP神经网络的公交行程时间预测[J]. 广西师范大学学报:自然科学版, 2017, 35(1):9.

❤️ 关注我领取海量matlab电子书和数学建模资料

❤️部分理论引用网络文献,若有侵权联系博主删除

 

下面是使用萤火虫算法进行BP神经网络分类Matlab 代码示例: ``` % 导入数据 load iris_dataset; x = irisInputs; t = irisTargets; % 初始化神经网络 net = feedforwardnet([5,3]); net.trainParam.epochs = 1000; % 设置迭代次数 net.trainParam.lr = 0.1; % 设置学习率 % 定义适应度函数 fitness = @(w) train_net(w, net, x, t); % 调用萤火虫算法 n = 20; % 种群大小 m = 50; % 最大迭代次数 gamma = 0.5; % 最小光强 alpha = 0.2; % 吸引因子 beta0 = 1; % 亮度增益因子 beta = @(i) beta0 * exp(-alpha*i); % 计算亮度增益因子 pop = rand(n, net.numWeightElements); % 初始化种群 fitness_values = zeros(n, 1); % 初始化适应度值 for i = 1:n fitness_values(i) = fitness(pop(i,:)); end for i = 1:m for j = 1:n for k = 1:n if fitness_values(j) < fitness_values(k) r = norm(pop(j,:)-pop(k,:)); % 计算距离 beta_ = beta(i); % 计算亮度增益因子 I = fitness_values(j) + beta_ * exp(-gamma*r^2); % 计算亮度 pop(j,:) = pop(j,:) + rand(1, net.numWeightElements) * (pop(k,:)-pop(j,:)) * I; % 萤火虫移动 end end end % 更新适应度值 for j = 1:n fitness_values(j) = fitness(pop(j,:)); end end % 训练神经网络 net = setwb(net, pop(1,:)); % 设置权重 net = train(net, x, t); % 测试神经网络 y = sim(net, x); plotconfusion(t, y); ``` 其中 `train_net` 函数用于计算神经网络分类准确率,代码如下: ``` function acc = train_net(w, net, x, t) net = setwb(net, w); % 设置权重 y = sim(net, x); % 计算输出 [~, label1] = max(t); [~, label2] = max(y); acc = sum(label1 == label2) / length(label1); % 计算准确率 end ``` 注意:以上代码仅作为示例,实际应用中需要根据具体问题进行调整和优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

matlab科研助手

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

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

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

打赏作者

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

抵扣说明:

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

余额充值