​最近发现要彻底、快速地弄懂一个算法,最好的办法就是找源码来,静下心,一行一行的学习。所以我把ABC算法的源码找来逐行做了中文注释,并以优化SVM参数为例,进行学习。

废话不多说,直接上MATLAB代码(ABC-SVR):

tic % 计时
%% 清空环境,准备数据
clear
clc
close all
load wndspd % 示例数据为风速(时间序列)数据,共144个样本
% 训练/测试数据准备(用前3天预测后一天),用前100天的数据做训练
train_input(1,:)=wndspd(1:97);
train_input(2,:)=wndspd(2:98);
train_input(3,:)=wndspd(3:99);
train_output=[wndspd(4:100)]';
test_input(1,:)=wndspd(101:end-3);
test_input(2,:)=wndspd(102:end-2);
test_input(3,:)=wndspd(103:end-1);
test_output=[wndspd(104:end)]';
% 数据归一化处理
[input_train,rule1]=mapminmax(train_input);
[output_train,rule2]=mapminmax(train_output);
input_test=mapminmax('apply',test_input,rule1);
output_test=mapminmax('apply',test_output,rule2);
%% %%%%%%%%%%%%%用ABC算法优化SVR中的参数c和g开始%%%%%%%%%%%%%%%%%%%%
%% 参数初始化
NP=20; % 蜂群规模
FoodNumber=NP/2; % 蜜源(解)数量
limit=100; % 当有蜜源连续没被更新的次数超过limit时,该蜜源将被重新初始化
maxCycle=10; % 最大迭代次数
% 待优化参数信息
D=2; % 待优化参数个数,次数为c和g两个
ub=ones(1,D)*100; % 参数取值上界,此处将c和g的上界设为100
lb=ones(1,D)*(0.01); % 参数取值下界,此处将c和g的下界设为0.01runtime=2; % 可用于设置多次运行(让ABC算法运行runtime次)以考察程序的稳健性BestGlobalMins=ones(1,runtime); % 全局最小值初始化,这里的优化目标为SVR预测结果中的平均平方误差(MSE),初始化为最差值1
BestGlobalParams=zeros(runtime,D); % 用于存放ABC算法优化得到的最优参数for r=1:runtime % 运行ABC算法runtime次% 初始化蜜源Range = repmat((ub-lb),[FoodNumber 1]);Lower = repmat(lb, [FoodNumber 1]);Foods = rand(FoodNumber,D) .* Range + Lower;% 计算每个蜜源(解)得目标函数值,fobj为计算SVR预测的平均平方误差(MSE)的函数,根据自己的实际问题变异目标函数即可ObjVal=ones(1,FoodNumber); for k = 1:FoodNumberObjVal(k) = fobj(Foods(k,:),input_train,output_train,input_test,output_test);endFitness=calculateFitness(ObjVal); % 计算适应度函数值trial=zeros(1,FoodNumber); % 用于记录第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;endsol=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=fobj(sol,input_train,output_train,input_test,output_test);FitnessSol=calculateFitness(ObjValSol);% 更新当前蜜源的相关信息if (FitnessSol>Fitness(i))Foods(i,:)=sol;Fitness(i)=FitnessSol;ObjVal(i)=ObjValSol;trial(i)=0; % 如果当前蜜源被更新了,则对应的trial归零elsetrial(i)=trial(i)+1; % 如果当前蜜源没有被更新,则trial(i)加1endend%%%%%%%%%%%%%%%%%%%%%%%% 跟随蜂搜索解的过程 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 计算解(蜜源)的概率prob=(0.9.*Fitness./max(Fitness))+0.1;% 循环初始化i=1;t=0;while(t<FoodNumber) % 循环条件if(rand<prob(i)) % 若随机概率小于当前解(蜜源)的概率t=t+1; % 循环计数器加1Param2Change=fix(rand*D)+1; % 随机确定需要变异的参数neighbour=fix(rand*(FoodNumber))+1; % 随机选择相邻蜜源(解)% 需要保证选择的相邻蜜源不是当前蜜源(i)while(neighbour==i)neighbour=fix(rand*(FoodNumber))+1;endsol=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=fobj(sol,input_train,output_train,input_test,output_test);FitnessSol=calculateFitness(ObjValSol);% 更新当前蜜源的相关信息if (FitnessSol>Fitness(i))Foods(i,:)=sol;Fitness(i)=FitnessSol;ObjVal(i)=ObjValSol;trial(i)=0; % 如果当前蜜源被更新了,则对应的trial归零elsetrial(i)=trial(i)+1; % 如果当前蜜源没有被更新,则trial(i)加1endendi=i+1; % 更新iif (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) Bas(ind)=0;sol=(ub-lb).*rand(1,D)+lb;ObjValSol=fobj(sol,input_train,output_train,input_test,output_test);FitnessSol=calculateFitness(ObjValSol);Foods(ind,:)=sol;Fitness(ind)=FitnessSol;ObjVal(ind)=ObjValSol;enditer=iter+1;end % 一次ABC算法完结BestGlobalMins(r)=GlobalMin; % 记录本次ABC算法的最优目标函数值BestGlobalParams(r,:)=GlobalParams; % 记录本次ABC算法的最优参数end % end of runs
%% %%%%%%%%%%%%%用ABC算法优化SVR中的参数c和g结束%%%%%%%%%%%%%%%%%%%%
%% 打印参数选择结果,这里输出的是最后一次ABC算法寻优得到的参数
bestc=GlobalParams(1);
bestg=GlobalParams(2);
disp('打印选择结果');
str=sprintf('Best c = %g,Best g = %g',bestc,bestg);
disp(str)
%% 利用回归预测分析最佳的参数进行SVM网络训练
cmd_cs_svr=['-s 3 -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
model_cs_svr=svmtrain(output_train',input_train',cmd_cs_svr); % SVM模型训练
%% SVM网络回归预测
[output_test_pre,acc]=svmpredict(output_test',input_test',model_cs_svr); % SVM模型预测及其精度
test_pre=mapminmax('reverse',output_test_pre',rule2);
test_pre = test_pre';err_pre=wndspd(104:end)-test_pre;
figure('Name','测试数据残差图')
set(gcf,'unit','centimeters','position',[0.5,5,30,5])
plot(err_pre,'*-');legend('预测残差:实际-预测',0);
figure('Name','原始-预测图')
plot(test_pre,'*r-');hold on;plot(wndspd(104:end),'bo-');
legend('预测','原始')
set(gcf,'unit','centimeters','position',[0.5,13,30,5])result=[wndspd(104:end),test_pre];MAE=mymae(wndspd(104:end),test_pre)
MSE=mymse(wndspd(104:end),test_pre)
MAPE=mymape(wndspd(104:end),test_pre)
%% 显示程序运行时间
toc

完整程序和示例数据文件下载地址:http://download.csdn.net/detail/u013337691/9621448

(广告)欢迎扫描关注微信公众号:Genlovhyy的数据小站(Gnelovy212)

ABC(智能蜂群算法)优化SVM_源码逐行中文注解相关推荐

  1. bartlett 算法 matlab,GWO(灰狼优化)算法MATLAB源码逐行中文注解(转载)

    以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. tic % 计时器 %% 清空环境变量 close all clear clc format compact %% ...

  2. GWO(灰狼优化)算法MATLAB源码逐行中文注解

    以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. 完整程序和示例文件地址:http://download.csdn.net/detail/u013337691/962 ...

  3. GWO(灰狼优化)算法MATLAB源码逐行中文注解()

    以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. tic % 计时器 %% 清空环境变量 close all clear clc format compact %% ...

  4. FA(萤火虫算法)MATLAB源码详细中文注解

    以优化SVM算法的参数c和g为例,对FA(萤火虫算法)MATLAB源码进行了逐行中文注解. 完整程序和示例文件地址:http://download.csdn.net/detail/u013337691 ...

  5. CS(布谷鸟搜索)算法MATLAB源码逐行中文注解

    以优化SVM算法的参数c和g为例,对CS算法MATLAB源码进行了逐行中文注解. 完整程序和示例文件地址:http://download.csdn.net/detail/u013337691/9622 ...

  6. 灰狼优化算法求函数最优值matlab,GWO(灰狼优化)算法MATLAB源码逐行中文注解(转载)...

    2-l*((2)/Max_iteration); % 对每一次迭代,计算相应的a值,a decreases linearly fron 2 to 0% Update the Position of s ...

  7. 多目标人工秃鹫优化算法(MATLAB源码分享,智能优化算法) 提出了一种多目标版本的人工秃鹫优化算法(AVOA)

    多目标人工秃鹫优化算法(MATLAB源码分享,智能优化算法) 提出了一种多目标版本的人工秃鹫优化算法(AVOA),用于多目标优化问题. AVOA的灵感来源于非洲秃鹫的生活方式. 档案.网格和领导者选择 ...

  8. 【LSSVM回归预测】基于matlab人工蜂群算法优化最小二乘支持向量机LSSVM数据回归预测【含Matlab源码 2213期】

    ⛄一.人工蜂群算法优化最小二乘支持向量机LSSVM简介 1 最小二乘支持向量机 最小二乘支持向量机是支持向量机的一种改进算法[9,10],它将SVM算法中的不等式约束转化为等式约束,采用最小二乘线性系 ...

  9. 【LSSVM回归预测】人工蜂群算法优化最小二乘支持向量机LSSVM数据回归预测【含Matlab源码 2213期】

    ⛄一.人工蜂群算法优化最小二乘支持向量机LSSVM简介 1 最小二乘支持向量机 最小二乘支持向量机是支持向量机的一种改进算法[9,10],它将SVM算法中的不等式约束转化为等式约束,采用最小二乘线性系 ...

最新文章

  1. java:不同数据类型的转换规则
  2. 初步解决博客园代码高亮的一个方案
  3. 将Java Flight Recorder与OpenJDK 11结合使用
  4. Labyrinth(HDU-4826)
  5. vue2.0 自定义 生成二维码(QRCode)组件
  6. Spring中的Bean配置
  7. Build Apache Module
  8. 照片尺寸及像素对应表
  9. Virtualbox虚拟机桥接模式配置
  10. 手心输入法导致 Navicat for MySQL闪退的解决办法
  11. 个人记录——洛谷试炼场,BOSS战!【新手村】
  12. qt web混合编程_Qt+VS混合编程教程
  13. 立创EDA学习笔记(2)——创建元件符号
  14. 2023西安电子科技大学计算机考研信息汇总
  15. Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
  16. ASP+VML制作统计图的源程序
  17. 《迅雷链精品课》第十四课:区块链共识算法前沿分析
  18. 定制ERP和通用ERP如何选择?
  19. STM32:Modbus-RTU通讯协议——CRC校验
  20. Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。

热门文章

  1. 这个漂亮老男人你记住了吗?——BGP学习
  2. qt 如何设计好布局和漂亮的界面。
  3. Actr-Critc
  4. 爱斯维尔LATEX要求
  5. 【艾特淘】如何才能入池淘宝“猜你喜欢”?
  6. 【论文阅读】——BASTION-SGX: Bluetooth and Architectural Support for Trusted I/O on SGX
  7. 用计算机录制一段30,测评!电脑录屏软件哪个好用?小白进阶第1阶段
  8. 登录页面记住密码如何实现?
  9. gazebo地图构建
  10. 从零开始仿写一个抖音App——基于FFmpeg的极简视频播放器