資源簡介
對ABC算法的源碼逐行做了中文注釋,并以優化SVM參數為例,是很好的學習材料。

代碼片段和文件信息
tic?%?計時器
%%?清空環境,準備數據
close?all
clear
clc
format?compact
%?載入測試數據wine其中包含的數據類別數為3;wine:178*13的矩陣wine_labes:178*1的列向量
load?wine
%?選定訓練集和測試集
%?將第一類的1-30第二類的60-95第三類的131-153做為訓練集
train_wine?=?[wine(1:30:);wine(60:95:);wine(131:153:)];
%?相應的訓練集的標簽也要分離出來
train_wine_labels?=?[wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)];
%?將第一類的31-59第二類的96-130第三類的154-178做為測試集
test_wine?=?[wine(31:59:);wine(96:130:);wine(154:178:)];
%?相應的測試集的標簽也要分離出來
test_wine_labels?=?[wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)];
%?數據預處理
%?數據預處理將訓練集和測試集歸一化到[01]區間
[mtrainntrain]?=?size(train_wine);
[mtestntest]?=?size(test_wine);
dataset?=?[train_wine;test_wine];
[dataset_scaleps]?=?mapminmax(dataset‘01);
dataset_scale?=?dataset_scale‘;
train_wine?=?dataset_scale(1:mtrain:);
test_wine?=?dataset_scale(?(mtrain+1):(mtrain+mtest):?);
%%?%%%%%%%%%%%%%用ABC算法優化SVM中的參數c和g開始%%%%%%%%%%%%%%%%%%%%
%%?參數初始化
NP=20;?%?蜂群規模
FoodNumber=NP/2;?%?蜜源(解)數量
limit=100;?%?當有蜜源連續沒被更新的次數超過limit時,該蜜源將被重新初始化
maxCycle=10;?%?最大迭代次數
%?待優化參數信息
D=2;?%?待優化參數個數,次數為c和g兩個
ub=ones(1D)*100;?%?參數取值上界,此處將c和g的上界設為100
lb=ones(1D)*(0.01);?%?參數取值下界,此處將c和g的下界設為0.01
runtime=2;?%?可用于設置多次運行(讓ABC算法運行runtime次)以考察程序的穩健性
BestGlobalMins=ones(1runtime);?%?全局最小值初始化,這里的優化目標為SVM預測結果中的平均平方誤差(MSE),初始化為最差值1
BestGlobalParams=zeros(runtimeD);?%?用于存放ABC算法優化得到的最優參數
for?r=1:runtime?%?運行ABC算法runtime次
????%?初始化蜜源
????Range?=?repmat((ub-lb)[FoodNumber?1]);
????Lower?=?repmat(lb?[FoodNumber?1]);
????Foods?=?rand(FoodNumberD)?.*?Range?+?Lower;
????%?計算每個蜜源(解)得目標函數值,objfun為計算SVM預測的平均平方誤差(MSE)的函數,根據自己的實際問題變異目標函數即可
????ObjVal=ones(1FoodNumber);?
????for?k?=?1:FoodNumber
????????ObjVal(k)?=?objfun(Foods(k:)train_wine_labelstrain_winetest_wine_labelstest_wine);
????end
????Fitness=calculateFitness(ObjVal);?%?計算適應度函數值
????
????trial=zeros(1FoodNumber);?%?用于記錄第i個蜜源有連續trail(i)次沒被更新過
????%?標記最優蜜源(解)
????BestInd=find(ObjVal==min(ObjVal));?
????BestInd=BestInd(end);
????GlobalMin=ObjVal(BestInd);?%?更新全局最優目標函數值
????GlobalParams=Foods(BestInd:);?%?更新全局最優參數為最優蜜源
????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(iParam2Change)+(Foods(iParam2Change)-Foods(neighbourParam2Change))*(rand-0.5)*2;
????????????%?確保參數取值范圍不越界
????????????ind=find(sol
????????????sol(ind)=lb(ind);
????????????ind=find(sol>ub);
????????????sol(ind)=ub(ind);
????????????%?計算變異后蜜源的目標函數值和適應度函數值
????????????ObjValSol=objfun(sol
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????8168??2016-09-04?17:10??ABC_SVM_exmp.m
?????文件????????7867??2016-09-04?17:10??ABC_SVR_exmp.m
?????文件?????????182??2008-06-09?19:54??calculateFitness.m
?????文件?????????430??2016-09-04?16:56??fobj.m
?????文件??????????70??2016-09-04?10:55??mymae.m
?????文件??????????85??2016-09-04?10:55??mymape.m
?????文件??????????74??2016-09-04?10:55??mymse.m
?????文件?????????407??2016-09-04?10:04??objfun.m
?????文件???????20168??2016-09-04?09:25??wine.mat
?????文件?????????447??2016-09-04?10:41??wndspd.mat
- 上一篇:全球銀行的銀行卡號及信息
- 下一篇:數字電子鐘—基于multisim10
評論
共有 條評論