【DELM分類】基于人工蜂群算法改進(jìn)深度學(xué)習(xí)極限學(xué)習(xí)機(jī)實(shí)現(xiàn)數(shù)據(jù)分類附matlab代碼
1 簡介
人工神經(jīng)網(wǎng)絡(luò)的最大缺點(diǎn)是訓(xùn)練時(shí)間太長從而限制其實(shí)時(shí)應(yīng)用范圍,近年來,極限學(xué)習(xí)機(jī)(Extreme Learning Machine, ELM)的提出使得前饋神經(jīng)網(wǎng)絡(luò)的訓(xùn)練時(shí)間大大縮短,然而當(dāng)原始數(shù)據(jù)混雜入大量噪聲變量時(shí),或者當(dāng)輸入數(shù)據(jù)維度非常高時(shí),極限學(xué)習(xí)機(jī)算法的綜合性能會受到很大的影響.深度學(xué)習(xí)算法的核心是特征映射,它能夠摒除原始數(shù)據(jù)中的噪聲,并且當(dāng)向低維度空間進(jìn)行映射時(shí),能夠很好的起到對數(shù)據(jù)降維的作用,因此我們思考利用深度學(xué)習(xí)的優(yōu)勢特性來彌補(bǔ)極限學(xué)習(xí)機(jī)的弱勢特性從而改善極限學(xué)習(xí)機(jī)的性能.為了進(jìn)一步提升DELM預(yù)測精度,本文采用麻雀搜索算法進(jìn)一步優(yōu)化DELM超參數(shù),仿真結(jié)果表明,改進(jìn)算法的預(yù)測精度更高。







2 部分代碼
function [ObjVal,Foods, trace]=ABC1(fit,D,NP,maxCycle,Foods)
%% 參數(shù)初始化
objfun=fit.objfun;ub=fit.ub; lb=fit.lb;
D; % 待優(yōu)化參數(shù)個(gè)數(shù)
NP; % 蜂群規(guī)模
maxCycle; % 最大迭代次數(shù)
FoodNumber=NP/2; % 蜜源(解)數(shù)量,因此NP必須為偶數(shù)
limit=100; % 當(dāng)有蜜源連續(xù)沒被更新的次數(shù)超過limit時(shí),該蜜源將被重新初始化
% 待優(yōu)化參數(shù)信息
ub=ones(1,D)*ub; % 參數(shù)取值上界
lb=ones(1,D)*lb; % 參數(shù)取值下界
if nargin<5
? ?Range = repmat((ub-lb),[FoodNumber 1]);
? ?Lower = repmat(lb, [FoodNumber 1]);
? ?Foods = rand(FoodNumber,D) .* Range + Lower;
end
BestGlobalMins=[]; %用于存放全局最優(yōu)解與平均適應(yīng)度值
GlobalMin=inf;
GlobalParams=[inf inf];
%% 初始化蜜源
% 計(jì)算每個(gè)蜜源(解)得目標(biāo)函數(shù)值,objfun為計(jì)算SVM預(yù)測的平均平方誤差(MSE)的函數(shù),根據(jù)自己的實(shí)際問題變異目標(biāo)函數(shù)即可
ObjVal=ones(1,FoodNumber);
for k = 1:FoodNumber
? ?ObjVal(k) = objfun(Foods(k,:));
end
Fitness=calculateFitness(ObjVal); % 計(jì)算適應(yīng)度函數(shù)值
% 標(biāo)記初始最優(yōu)蜜源(解)
BestInd=find(ObjVal==min(ObjVal));
BestInd=BestInd(end);
if (ObjVal(BestInd)<GlobalMin)
? ?GlobalMin=ObjVal(BestInd);
? ?GlobalParams=Foods(BestInd,:);
end
%%
? ?trial=zeros(1,FoodNumber); % 用于記錄第i個(gè)蜜源有連續(xù)trail(i)次沒被更新過
? ?iter=1; % 迭代開始
? ?while ((iter <= maxCycle)) % 循環(huán)條件
? ? ? ?%%%%%%%%%%%%%%%%%%%%%引領(lǐng)蜂搜索解的過程%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
? ? ? ?for i=1:(FoodNumber) % 遍歷每個(gè)蜜源(解)
? ? ? ? ? ?Param2Change=fix(rand*D)+1; % 隨機(jī)選擇需要變異的參數(shù)
? ? ? ? ? ?neighbour=fix(rand*(FoodNumber))+1; % 隨機(jī)選擇相鄰蜜源(解)以準(zhǔn)備變異
? ? ? ? ? ?% 需要保證選擇的相鄰蜜源不是當(dāng)前蜜源(i)
? ? ? ? ? ?while(neighbour==i)
? ? ? ? ? ? ? ?neighbour=fix(rand*(FoodNumber))+1;
? ? ? ? ? ?end
? ? ? ? ? ?sol=Foods(i,:); % 提取當(dāng)前蜜源(解)對應(yīng)的的參數(shù)
? ? ? ? ? ?% 參數(shù)變異得到新的蜜源: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;
? ? ? ? ? ?% 確保參數(shù)取值范圍不越界
? ? ? ? ? ?ind=find(sol<lb);
? ? ? ? ? ?sol(ind)=lb(ind);
? ? ? ? ? ?ind=find(sol>ub);
? ? ? ? ? ?sol(ind)=ub(ind);
? ? ? ? ? ?% 計(jì)算變異后蜜源的目標(biāo)函數(shù)值和適應(yīng)度函數(shù)值
? ? ? ? ? ?ObjValSol=objfun(sol);
? ? ? ? ? ?FitnessSol=calculateFitness(ObjValSol);
? ? ? ? ? ?% 更新當(dāng)前蜜源的相關(guān)信息
? ? ? ? ? ?if (FitnessSol>Fitness(i))
? ? ? ? ? ? ? ?Foods(i,:)=sol;
? ? ? ? ? ? ? ?Fitness(i)=FitnessSol;
? ? ? ? ? ? ? ?ObjVal(i)=ObjValSol;
? ? ? ? ? ? ? ?trial(i)=0; % 如果當(dāng)前蜜源被更新了,則對應(yīng)的trial歸零
? ? ? ? ? ?else
? ? ? ? ? ? ? ?trial(i)=trial(i)+1; % 如果當(dāng)前蜜源沒有被更新,則trial(i)加1
? ? ? ? ? ?end
? ? ? ?end
? ? ? ?%%%%%%%%%%%%%%%%%%%%%%%% 跟隨蜂搜索解的過程 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
? ? ? ?% 計(jì)算解(蜜源)的概率
? ? ? ?prob=(0.9.*Fitness./max(Fitness))+0.1;
? ? ? ?% 循環(huán)初始化
? ? ? ?i=1;
? ? ? ?t=0;
? ? ? ?while(t<FoodNumber) % 循環(huán)條件
? ? ? ? ? ?if(rand<prob(i)) % 若隨機(jī)概率小于當(dāng)前解(蜜源)的概率
? ? ? ? ? ? ? ?t=t+1; % 循環(huán)計(jì)數(shù)器加1
? ? ? ? ? ? ? ?Param2Change=fix(rand*D)+1; % 隨機(jī)確定需要變異的參數(shù)
? ? ? ? ? ? ? ?neighbour=fix(rand*(FoodNumber))+1; % 隨機(jī)選擇相鄰蜜源(解)
? ? ? ? ? ? ? ?% 需要保證選擇的相鄰蜜源不是當(dāng)前蜜源(i)
? ? ? ? ? ? ? ?while(neighbour==i)
? ? ? ? ? ? ? ? ? ?neighbour=fix(rand*(FoodNumber))+1;
? ? ? ? ? ? ? ?end
? ? ? ? ? ? ? ?sol=Foods(i,:); % 提取當(dāng)前蜜源i(解)對應(yīng)的的參數(shù)
? ? ? ? ? ? ? ?% 參數(shù)變異得到新的蜜源: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;
? ? ? ? ? ? ? ?% 防止參數(shù)越界
? ? ? ? ? ? ? ?ind=find(sol<lb);
? ? ? ? ? ? ? ?sol(ind)=lb(ind);
? ? ? ? ? ? ? ?ind=find(sol>ub);
? ? ? ? ? ? ? ?sol(ind)=ub(ind);
? ? ? ? ? ? ? ?% 計(jì)算變異后蜜源的目標(biāo)函數(shù)值和適應(yīng)度函數(shù)值
? ? ? ? ? ? ? ?ObjValSol=objfun(sol);
? ? ? ? ? ? ? ?FitnessSol=calculateFitness(ObjValSol);
? ? ? ? ? ? ? ?% 更新當(dāng)前蜜源的相關(guān)信息
? ? ? ? ? ? ? ?if (FitnessSol>Fitness(i))
? ? ? ? ? ? ? ? ? ?Foods(i,:)=sol;
? ? ? ? ? ? ? ? ? ?Fitness(i)=FitnessSol;
? ? ? ? ? ? ? ? ? ?ObjVal(i)=ObjValSol;
? ? ? ? ? ? ? ? ? ?trial(i)=0; % 如果當(dāng)前蜜源被更新了,則對應(yīng)的trial歸零
? ? ? ? ? ? ? ?else
? ? ? ? ? ? ? ? ? ?trial(i)=trial(i)+1; % 如果當(dāng)前蜜源沒有被更新,則trial(i)加1
? ? ? ? ? ? ? ?end
? ? ? ? ? ?end
? ? ? ? ? ?i=i+1; % 更新i
? ? ? ? ? ?if (i==(FoodNumber)+1) % 若值超過蜜源數(shù)量,則i重新初始化
? ? ? ? ? ? ? ?i=1;
? ? ? ? ? ?end
? ? ? ?end
? ? ? ?% 記住最優(yōu)蜜源
? ? ? ?ind=find(ObjVal==min(ObjVal));
? ? ? ?ind=ind(end);
? ? ? ?if (ObjVal(ind)<GlobalMin)
? ? ? ? ? ?GlobalMin=ObjVal(ind);
? ? ? ? ? ?GlobalParams=Foods(ind,:);
? ? ? ?end
? ? ? ?%%%%%%%%%%%% 偵查蜂搜索解的過程 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
? ? ? ?% 找出連續(xù)最多次都沒有被更新的蜜源
? ? ? ?ind=find(trial==max(trial));
? ? ? ?ind=ind(end);
? ? ? ?% 如果連續(xù)沒有更新的次數(shù)大于限定次數(shù),則由偵查蜂重新初始化該蜜源
? ? ? ?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);%計(jì)算平均適應(yīng)度值
? ? ? ?BestGlobalMins(iter,:)=[GlobalMin average_fit]; % 記錄本次ABC算法的最優(yōu)目標(biāo)函數(shù)值與平均適應(yīng)度值
? ? ? ?BestGlobalParams(iter,:)=GlobalParams; % 記錄本次ABC算法的最優(yōu)參數(shù)
? ? ? ?iter=iter+1;
? ?end % 一次ABC算法完結(jié) ?
%%
trace=BestGlobalMins(:,1);
3 仿真結(jié)果

4 參考文獻(xiàn)
[1]馬萌萌. 基于深度學(xué)習(xí)的極限學(xué)習(xí)機(jī)算法研究[D]. 中國海洋大學(xué), 2015.
博主簡介:擅長智能優(yōu)化算法、神經(jīng)網(wǎng)絡(luò)預(yù)測、信號處理、元胞自動(dòng)機(jī)、圖像處理、路徑規(guī)劃、無人機(jī)等多種領(lǐng)域的Matlab仿真,相關(guān)matlab代碼問題可私信交流。
部分理論引用網(wǎng)絡(luò)文獻(xiàn),若有侵權(quán)聯(lián)系博主刪除。
