【SVM分类】基于人工蜂群算法改进SVM实现数据分类matlab源码
作者:互联网
一、神经网络-支持向量机
支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。 1 数学部分 1.1 二维空间 2 算法部分
二、人工蜂群算法
受到蜜蜂群体的有组织的觅食过程的启发,Karaboga提出了模拟蜜蜂群体觅食过程的人工蜂群(Artificial Bee Colony) 算法用于解决多维度多峰谷的优化问题。该算法创始之初被用来寻找Sphere、Rosenbrock和Rastrigin函数的最小值。 首先对蜜蜂基于摇摆舞进行觅食的过程特征进行介绍。在图1中,存在两个已发现的食物源A和B。初始时,潜在工蜂以非雇佣蜂的身份进行搜索。它并不知道蜂房附近的任何蜜源的信息。因此,它有以下两个可能的选择: (1)成为一个侦察蜂,秉着自身潜在动力或外在因素自发的搜索蜂房附近的区域(见图1中的S); (2)在观看摆尾舞后,成为一个被招募者,并开始搜索蜜源(见图1中的R)。 在定位蜜源之后,该蜜蜂能够利用自身的能力来记住食物源的位置,并立刻对它进行探索。该蜜蜂现在成为了一个雇佣蜂。雇佣蜂采到蜂蜜后,从蜜源处返回蜂房并将蜂蜜卸载到蜜室中。在卸载完蜂蜜后,雇佣蜂有下列三个选择: (1)放弃已经采集过的蜜源,成为一个受其他摇尾舞招募的跟随者(UF)。 (2)施展摇尾舞技,招募蜂房内的同伴,再次回到原先采集过的食物源(EF1)。 (3)不招募其它的蜜蜂,继续探索采集过的食物源(EF2)。
二、算法流程
人工蜂群算法由连续的四个阶段组成,分别是初始化阶段、引领(雇佣)蜂阶段、跟随蜂阶端和侦察蜂阶段。 人工蜂群算法中将人工蜂群分为引领蜂、跟随蜂和侦察蜂三类,每一次搜索过程中,引领蜂和跟随蜂是先后开采食物源,即寻找最优解,而侦察蜂是观察是否陷入局部最优,若陷入局部最优则随机地搜索其它可能的食物源。每个食物源代表问题一个可能解,食物源的花蜜量对应相应解的质量(适应度值f i t fitfit)。
1、初始化阶段
2、引领蜂阶段
3、跟随蜂阶段
4、侦察蜂阶段
5、食物源
三、代码
clc;
clear;
close all;
%% Problem Definition
CostFunction=@(x) Sphere(x); % Cost Function
nVar=5; % Number of Decision Variables
VarSize=[1 nVar]; % Decision Variables Matrix Size
VarMin=-10; % Decision Variables Lower Bound
VarMax= 10; % Decision Variables Upper Bound
%% ABC Settings
MaxIt=200; % Maximum Number of Iterations
nPop=100; % Population Size (Colony Size)
nOnlooker=nPop; % Number of Onlooker Bees
L=round(0.6*nVar*nPop); % Abandonment Limit Parameter (Trial Limit)
a=1; % Acceleration Coefficient Upper Bound
%% Initialization
% Empty Bee Structure
empty_bee.Position=[];
empty_bee.Cost=[];
% Initialize Population Array
pop=repmat(empty_bee,nPop,1);
% Initialize Best Solution Ever Found
BestSol.Cost=inf;
% Create Initial Population
for i=1:nPop
pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
pop(i).Cost=CostFunction(pop(i).Position);
if pop(i).Cost<=BestSol.Cost
BestSol=pop(i);
end
end
% Abandonment Counter
C=zeros(nPop,1);
% Array to Hold Best Cost Values
BestCost=zeros(MaxIt,1);
%% ABC Main Loop
for it=1:MaxIt
% Recruited Bees
for i=1:nPop
% Choose k randomly, not equal to i
K=[1:i-1 i+1:nPop];
k=K(randi([1 numel(K)]));
% Define Acceleration Coeff.
phi=a*unifrnd(-1,+1,VarSize);
% New Bee Position
newbee.Position=pop(i).Position+phi.*(pop(i).Position-pop(k).Position);
% Evaluation
newbee.Cost=CostFunction(newbee.Position);
% Comparision
if newbee.Cost<=pop(i).Cost
pop(i)=newbee;
else
C(i)=C(i)+1;
end
end
% Calculate Fitness Values and Selection Probabilities
F=zeros(nPop,1);
MeanCost = mean([pop.Cost]);
for i=1:nPop
F(i) = exp(-pop(i).Cost/MeanCost); % Convert Cost to Fitness
end
P=F/sum(F);
% Onlooker Bees
for m=1:nOnlooker
% Select Source Site
i=RouletteWheelSelection(P);
% Choose k randomly, not equal to i
K=[1:i-1 i+1:nPop];
k=K(randi([1 numel(K)]));
% Define Acceleration Coeff.
phi=a*unifrnd(-1,+1,VarSize);
% New Bee Position
newbee.Position=pop(i).Position+phi.*(pop(i).Position-pop(k).Position);
% Evaluation
newbee.Cost=CostFunction(newbee.Position);
% Comparision
if newbee.Cost<=pop(i).Cost
pop(i)=newbee;
else
C(i)=C(i)+1;
end
end
% Scout Bees
for i=1:nPop
if C(i)>=L
pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
pop(i).Cost=CostFunction(pop(i).Position);
C(i)=0;
end
end
% Update Best Solution Ever Found
for i=1:nPop
if pop(i).Cost<=BestSol.Cost
BestSol=pop(i);
end
end
% Store Best Cost Ever Found
BestCost(it)=BestSol.Cost;
% Display Iteration Information
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
end
%% Results
figure;
%plot(BestCost,'LineWidth',2);
semilogy(BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;
5.参考文献:
书籍《MATLAB神经网络43个案例分析》
完整代码下载或者仿真咨询https://www.cnblogs.com/ttmatlab/p/14882966.html
标签:蜂群,SVM,分类,pop,算法,Cost,nPop,Position,源码 来源: https://blog.51cto.com/u_15287693/2984881