欢迎光临散文网 会员登陆 & 注册

【DELM分类】基于人工蜂群算法改进深度学习极限学习机实现数据分类附matlab代码

2022-05-17 21:40 作者:Matlab工程师  | 我要投稿

1 简介

人工神经网络的最大缺点是训练时间太长从而限制其实时应用范围,近年来,极限学习机(Extreme Learning Machine, ELM)的提出使得前馈神经网络的训练时间大大缩短,然而当原始数据混杂入大量噪声变量时,或者当输入数据维度非常高时,极限学习机算法的综合性能会受到很大的影响.深度学习算法的核心是特征映射,它能够摒除原始数据中的噪声,并且当向低维度空间进行映射时,能够很好的起到对数据降维的作用,因此我们思考利用深度学习的优势特性来弥补极限学习机的弱势特性从而改善极限学习机的性能.为了进一步提升DELM预测精度,本文采用麻雀搜索算法进一步优化DELM超参数,仿真结果表明,改进算法的预测精度更高。

2 部分代码

function [ObjVal,Foods, trace]=ABC1(fit,D,NP,maxCycle,Foods)%% 参数初始化objfun=fit.objfun;ub=fit.ub; lb=fit.lb;D; % 待优化参数个数NP; % 蜂群规模maxCycle; % 最大迭代次数FoodNumber=NP/2; % 蜜源(解)数量,因此NP必须为偶数limit=100; % 当有蜜源连续没被更新的次数超过limit时,该蜜源将被重新初始化% 待优化参数信息ub=ones(1,D)*ub; % 参数取值上界lb=ones(1,D)*lb; % 参数取值下界if nargin<5    Range = repmat((ub-lb),[FoodNumber 1]);    Lower = repmat(lb, [FoodNumber 1]);    Foods = rand(FoodNumber,D) .* Range + Lower;endBestGlobalMins=[]; %用于存放全局最优解与平均适应度值GlobalMin=inf;GlobalParams=[inf inf];%% 初始化蜜源% 计算每个蜜源(解)得目标函数值,objfun为计算SVM预测的平均平方误差(MSE)的函数,根据自己的实际问题变异目标函数即可ObjVal=ones(1,FoodNumber);for k = 1:FoodNumber    ObjVal(k) = objfun(Foods(k,:));endFitness=calculateFitness(ObjVal); % 计算适应度函数值% 标记初始最优蜜源(解)BestInd=find(ObjVal==min(ObjVal));BestInd=BestInd(end);if (ObjVal(BestInd)<GlobalMin)    GlobalMin=ObjVal(BestInd);    GlobalParams=Foods(BestInd,:);end%%    trial=zeros(1,FoodNumber); % 用于记录第i个蜜源有连续trail(i)次没被更新过    iter=1; % 迭代开始    while ((iter <= maxCycle)) % 循环条件        %%%%%%%%%%%%%%%%%%%%%引领蜂搜索解的过程%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        for i=1:(FoodNumber) % 遍历每个蜜源(解)            Param2Change=fix(rand*D)+1; % 随机选择需要变异的参数            neighbour=fix(rand*(FoodNumber))+1; % 随机选择相邻蜜源(解)以准备变异            % 需要保证选择的相邻蜜源不是当前蜜源(i)            while(neighbour==i)                neighbour=fix(rand*(FoodNumber))+1;            end            sol=Foods(i,:); % 提取当前蜜源(解)对应的的参数            % 参数变异得到新的蜜源:v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij})            sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;            % 确保参数取值范围不越界            ind=find(sol<lb);            sol(ind)=lb(ind);            ind=find(sol>ub);            sol(ind)=ub(ind);            % 计算变异后蜜源的目标函数值和适应度函数值            ObjValSol=objfun(sol);            FitnessSol=calculateFitness(ObjValSol);            % 更新当前蜜源的相关信息            if (FitnessSol>Fitness(i))                Foods(i,:)=sol;                Fitness(i)=FitnessSol;                ObjVal(i)=ObjValSol;                trial(i)=0; % 如果当前蜜源被更新了,则对应的trial归零            else                trial(i)=trial(i)+1; % 如果当前蜜源没有被更新,则trial(i)加1            end        end        %%%%%%%%%%%%%%%%%%%%%%%% 跟随蜂搜索解的过程 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        % 计算解(蜜源)的概率        prob=(0.9.*Fitness./max(Fitness))+0.1;        % 循环初始化        i=1;        t=0;        while(t<FoodNumber) % 循环条件            if(rand<prob(i)) % 若随机概率小于当前解(蜜源)的概率                t=t+1; % 循环计数器加1                Param2Change=fix(rand*D)+1; % 随机确定需要变异的参数                neighbour=fix(rand*(FoodNumber))+1; % 随机选择相邻蜜源(解)                % 需要保证选择的相邻蜜源不是当前蜜源(i)                while(neighbour==i)                    neighbour=fix(rand*(FoodNumber))+1;                end                sol=Foods(i,:); % 提取当前蜜源i(解)对应的的参数                % 参数变异得到新的蜜源:v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij})                sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;                % 防止参数越界                ind=find(sol<lb);                sol(ind)=lb(ind);                ind=find(sol>ub);                sol(ind)=ub(ind);                % 计算变异后蜜源的目标函数值和适应度函数值                ObjValSol=objfun(sol);                FitnessSol=calculateFitness(ObjValSol);                % 更新当前蜜源的相关信息                if (FitnessSol>Fitness(i))                    Foods(i,:)=sol;                    Fitness(i)=FitnessSol;                    ObjVal(i)=ObjValSol;                    trial(i)=0; % 如果当前蜜源被更新了,则对应的trial归零                else                    trial(i)=trial(i)+1; % 如果当前蜜源没有被更新,则trial(i)加1                end            end            i=i+1; % 更新i            if (i==(FoodNumber)+1) % 若值超过蜜源数量,则i重新初始化                i=1;            end        end        % 记住最优蜜源        ind=find(ObjVal==min(ObjVal));        ind=ind(end);        if (ObjVal(ind)<GlobalMin)            GlobalMin=ObjVal(ind);            GlobalParams=Foods(ind,:);        end        %%%%%%%%%%%% 侦查蜂搜索解的过程 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        % 找出连续最多次都没有被更新的蜜源        ind=find(trial==max(trial));        ind=ind(end);        % 如果连续没有更新的次数大于限定次数,则由侦查蜂重新初始化该蜜源        if (trial(ind)>limit)            trial(ind)=0;            sol=(ub-lb).*rand(1,D)+lb;            ObjValSol=objfun(sol);            FitnessSol=calculateFitness(ObjValSol);            Foods(ind,:)=sol;            Fitness(ind)=FitnessSol;            ObjVal(ind)=ObjValSol;        end        average_fit=mean(ObjVal);%计算平均适应度值        BestGlobalMins(iter,:)=[GlobalMin average_fit]; % 记录本次ABC算法的最优目标函数值与平均适应度值        BestGlobalParams(iter,:)=GlobalParams; % 记录本次ABC算法的最优参数        iter=iter+1;    end % 一次ABC算法完结  %%trace=BestGlobalMins(:,1);

3 仿真结果

4 参考文献

[1]马萌萌. 基于深度学习的极限学习机算法研究[D]. 中国海洋大学, 2015.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

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



【DELM分类】基于人工蜂群算法改进深度学习极限学习机实现数据分类附matlab代码的评论 (共 条)

分享到微博请遵守国家法律