FA(萤火虫算法)MATLAB源码详细中文注解
来源:互联网 发布:坏男孩软件靠谱吗 编辑:程序博客网 时间:2024/04/29 23:39
以优化SVM算法的参数c和g为例,对FA(萤火虫算法)MATLAB源码进行了逐行中文注解。
完整程序和示例文件地址:http://download.csdn.net/detail/u013337691/9626263
链接:http://pan.baidu.com/s/1kVbd5cV 密码:7ym8
tic % 计时器%% 清空环境变量close allclearclcformat compact%% 数据提取% 载入测试数据wine,其中包含的数据为classnumber = 3,wine:178*13的矩阵,wine_labes:178*1的列向量load wine.mat% 选定训练集和测试集% 将第一类的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)];%% 数据预处理% 数据预处理,将训练集和测试集归一化到[0,1]区间[mtrain,ntrain] = size(train_wine);[mtest,ntest] = size(test_wine);dataset = [train_wine;test_wine];% mapminmax为MATLAB自带的归一化函数[dataset_scale,ps] = mapminmax(dataset',0,1);dataset_scale = dataset_scale';train_wine = dataset_scale(1:mtrain,:);test_wine = dataset_scale( (mtrain+1):(mtrain+mtest),: );%% FA优化参数% 参数向量 parameters [n N_iteration alpha betamin gamma]% n为种群规模,N_iteration为迭代次数para=[10,50,0.5,0.2,1];% 待优化参数上下界 Simple bounds/limits for d-dimensional problemsd=2; % 待优化参数个数Lb=[0.01,0.01]; % 下界Ub=[100,100]; % 上界% 参数初始化 Initial random guessu0=Lb+(Ub-Lb).*rand(1,d);% 迭代寻优 Display results[bestsolutio,bestojb]=ffa_mincon_svm(@objfun_svm,u0,Lb,Ub,para,train_wine_labels,train_wine,test_wine_labels,test_wine);%% 打印参数选择结果bestc=bestsolutio(1);bestg=bestsolutio(2);disp('打印选择结果');str=sprintf('Best c = %g,Best g = %g',bestc,bestg);disp(str)%% 利用最佳的参数进行SVM网络训练cmd_gwosvm = ['-c ',num2str(bestc),' -g ',num2str(bestg)];model_gwosvm = svmtrain(train_wine_labels,train_wine,cmd_gwosvm);%% SVM网络预测[predict_label,accuracy] = svmpredict(test_wine_labels,test_wine,model_gwosvm);% 打印测试集分类准确率total = length(test_wine_labels);right = sum(predict_label == test_wine_labels);disp('打印测试集分类准确率');str = sprintf( 'Accuracy = %g%% (%d/%d)',accuracy(1),right,total);disp(str);%% 结果分析% 测试集的实际分类和预测分类图figure;hold on;plot(test_wine_labels,'o');plot(predict_label,'r*');xlabel('测试集样本','FontSize',12);ylabel('类别标签','FontSize',12);legend('实际测试集分类','预测测试集分类');title('测试集的实际分类和预测分类图','FontSize',12);grid on%% 显示程序运行时间toc
% 萤火虫算法主程序开始 Start FAfunction [nbest,fbest]=ffa_mincon_svm(costfhandle,u0, Lb, Ub, para,train_wine_labels,train_wine,test_wine_labels,test_wine)% 检查输入参数 Check input parameters (otherwise set as default values)if nargin<5 para=[20 100 0.25 0.20 1];endif nargin<4 Ub=[];endif nargin<3 Lb=[];endif nargin<2 disp('Usuage: FA_mincon(@cost,u0,Lb,Ub,para)');end% n=number of fireflies% MaxGeneration=number of pseudo time steps% ------------------------------------------------% alpha=0.25; % Randomness 0--1 (highly random)% betamn=0.20; % minimum value of beta% gamma=1; % Absorption coefficient% ------------------------------------------------n=para(1);MaxGeneration=para(2);alpha=para(3);betamin=para(4);gamma=para(5);% 检查上界向量与下界向量长度是否相同 Check if the upper bound & lower bound are the same sizeif length(Lb) ~=length(Ub) disp('Simple bounds/limits are improper!') returnend% 计算待优化参数维度 Calcualte dimensiond=length(u0);% 初始化目标函数值 Initial values of an arrayzn=ones(n,1)*10^100;% ------------------------------------------------% 初始化萤火虫位置 generating the initial locations of n fireflies[ns,Lightn]=init_ffa(n,d,Lb,Ub,u0);for k=1:MaxGeneration % 迭代开始% 更新alpha(可选)This line of reducing alpha is optional alpha=alpha_new(alpha,MaxGeneration);% 对每个萤火虫计算目标函数值 Evaluate new solutions (for all n fireflies)for i=1:n zn(i)=costfhandle(ns(i,:),train_wine_labels,train_wine,test_wine_labels,test_wine); Lightn(i)=zn(i);end% 根据亮度排序 Ranking fireflies by their light intensity/objectives[Lightn,Index]=sort(zn);ns_tmp=ns;for i=1:n ns(i,:)=ns_tmp(Index(i),:);end%% 找出当前最优 Find the current bestnso=ns;Lighto=Lightn;nbest=ns(1,:);Lightbest=Lightn(1);% 另存最优值 For output onlyfbest=Lightbest;% 向较优方向移动 Move all fireflies to the better locations[ns]=ffa_move(n,d,ns,Lightn,nso,Lighto,alpha,betamin,gamma,Lb,Ub);end% ----- All the subfunctions are listed here ------------% 初始化萤火虫位置 The initial locations of n firefliesfunction [ns,Lightn]=init_ffa(n,d,Lb,Ub,u0)ns=zeros(n,d);if ~isempty(Lb) % 如果参数界限不为空 if there are bounds/limits for i=1:n ns(i,:)=Lb+(Ub-Lb).*rand(1,d); % 则在取值范围内随机取值 endelse % 如果没有设置参数界限 for i=1:n ns(i,:)=u0+randn(1,d); % 在原有参数上加白噪声 endend% 初始化目标函数 initial value before function evaluationsLightn=ones(n,1)*10^100;% Move all fireflies toward brighter onesfunction [ns]=ffa_move(n,d,ns,Lightn,nso,Lighto,alpha,betamin,gamma,Lb,Ub)% 参数取值范围绝对值 Scaling of the systemscale=abs(Ub-Lb);% 更新萤火虫 Updating firefliesfor i=1:n % The attractiveness parameter beta=exp(-gamma*r) for j=1:n r=sqrt(sum((ns(i,:)-ns(j,:)).^2)); % Update moves if Lightn(i)>Lighto(j) % 如果i比j亮度更强 Brighter and more attractive beta0=1; beta=(beta0-betamin)*exp(-gamma*r.^2)+betamin; tmpf=alpha.*(rand(1,d)-0.5).*scale; ns(i,:)=ns(i,:).*(1-beta)+nso(j,:).*beta+tmpf; end end % end for jend % end for i% 防止越界 Check if the updated solutions/locations are within limits[ns]=findlimits(n,ns,Lb,Ub);% This function is optional, as it is not in the original FA% The idea to reduce randomness is to increase the convergence,% however, if you reduce randomness too quickly, then premature% convergence can occur. So use with care.% alpha参数更新函数 function alpha=alpha_new(alpha,NGen)% alpha_n=alpha_0(1-delta)^NGen=10^(-4);% alpha_0=0.9delta=1-(10^(-4)/0.9)^(1/NGen);alpha=(1-delta)*alpha;% 防止越界 Make sure the fireflies are within the bounds/limitsfunction [ns]=findlimits(n,ns,Lb,Ub)for i=1:n % Apply the lower bound ns_tmp=ns(i,:); I=ns_tmp<Lb; ns_tmp(I)=Lb(I); % Apply the upper bounds J=ns_tmp>Ub; ns_tmp(J)=Ub(J); % Update this new move ns(i,:)=ns_tmp;end
%% SVM_Objective Functionfunction f=objfun_svm(cv,train_wine_labels,train_wine,test_wine_labels,test_wine)% cv为长度为2的横向量,即SVM中参数c和v的值cmd = [' -c ',num2str(cv(1)),' -g ',num2str(cv(2))];model=svmtrain(train_wine_labels,train_wine,cmd); % SVM模型训练[~,fitness]=svmpredict(test_wine_labels,test_wine,model); % SVM模型预测及其精度f=1-fitness(1)/100; % 以分类预测错误率作为优化的目标函数值
(广告)欢迎扫描关注微信公众号:Genlovhyy的数据小站(Gnelovy212)
0 0
- FA(萤火虫算法)MATLAB源码详细中文注解
- SA(模拟退火)优化算法MATLAB源码详细中文注解
- GSA(引力搜索)优化算法MATLAB源码详细中文注解
- DE(差分进化)优化算法MATLAB源码详细中文注解
- DE(差分进化)优化算法MATLAB源码详细中文注解
- CS(布谷鸟搜索)算法MATLAB源码逐行中文注解
- GWO(灰狼优化)算法MATLAB源码逐行中文注解
- EM算法MATLAB代码及详细注解
- 萤火虫算法
- 萤火虫算法详解
- 优化算法之萤火虫算法(firefly algorithm)
- Firefly 算法(FA)原理及流程
- 基于python 编写的萤火虫算法(GSO)
- ABC(智能蜂群算法)优化SVM_源码逐行中文注解
- 萤火虫
- EM算法和FA
- matlab图像算法源码
- 字符串匹配的FA(有限状态自动机)算法
- java中面向对象的三大特性
- Python-基于socket实现的反向shell攻击后门
- STL源码剖析 deque的中控器
- 【小技巧】
- 3D Fe3O4@Au@Ag nanoflowers assembled magnetoplasmonic chains for in situ SERS monitoring of plasmon-
- FA(萤火虫算法)MATLAB源码详细中文注解
- Android无限循环轮播广告位Banner
- Js实现延迟加载
- 整理个跨浏览器的事件处理程序
- android.graphics.Typeface应用
- Contest1002 - HHU ACM 综合训练1 A题 Kingdom of Black and White(朴素)
- CentOS简易安装MySQL
- Statement和PreparedStatement的区别
- 实战iOS9【第一天】搜索API