基于灰狼算法优化支持向量机的matlab算法
灰狼优化算法优化支持向量机MATLAB实战
今天给大家分享灰狼优化算法的MATLAB实战 ,主要从算法原理和代码实战展开。
需要了解更多算法代码的,可以点击文章左下角的阅读全文,进行获取哦~需要了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦,下一期分享的内容就是你想了解的内容~
一、灰狼优化算法
灰狼优化算法(Grey Wolf Optimizer,GWO)由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优化算法。该算法受到了灰狼捕食猎物活动的启发而开发的一种优化搜索方法,它具有较强的收敛性能、参数少、易实现等特点。
灰狼属于犬科动物,被认为是顶级的掠食者,它们处于生物圈食物链的顶端。灰狼大多喜欢群居,它们具有非常严格的社会等级层次制度,如下图所示。
金字塔第一层为种群中的领导者,称为 α 。在狼群中 α 是具有管理能力的个体,主要负责关于狩猎、睡觉的时间和地方、食物分配等群体中各项决策的事务。
金字塔第二层是 α 的智囊团队,称为 β 。β 主要负责协助α 进行决策。当整个狼群的 α 出现空缺时,β 将接替 α 的位置。β 在狼群中的支配权仅次于 α,它将 α 的命令下达给其他成员,并将其他成员的执行情况反馈给 α 起着桥梁的作用。
金字塔第三层是 δ ,δ 听从 α 和 β 的决策命令,主要负责侦查、放哨、看护等事务。适应度不好的 α 和 β 也会降为 δ 。金字塔最底层是 ω ,主要负责种群内部关系的平衡。
灰狼的社会等级在群体狩猎过程中发挥着重要的作用,捕食的过程在 α 的带领下完成。灰狼的狩猎包括以下 3个主要部分:跟踪、追逐和接近猎物;追捕、包围和骚扰猎物,直到它停止移动;攻击猎物。
(1)包围猎物
在狩猎过程中,将灰狼围捕猎物的行为定义如下:
式(1)表示个体与猎物间的距离,式(2)是灰狼的位置更新公式。
(2)狩猎
灰狼能够识别猎物的位置并包围它们。当灰狼识别出猎物的位置后,β和δ在α 的带领下指导狼群包围猎物。在优化问题的决策空间中,我们对最佳解决方案(猎物的位置并不了解。因此,为了模拟灰狼的狩猎行为,我们假设α,β和δ 更了解猎物的潜在位置。我们保存迄今为止取得的3个最优解决方案,并利用这三者的位置来判断猎物所在的位置,同时强 迫其他灰狼个体(包括ω)依据最优灰狼个体的位置来更新其位置,逐渐 逼 近 猎 物。狼群内个体跟踪猎物位置的机制如下图所示。
二、GWO算法流程
GWO算法的流程图如图4所示。
三、代码实战
以GWO优化SVM的多分类问题为例,GWO优化SVM的超参数C和g.
tic % 计时器
%% 清空环境变量
close all
clear
clc
data=xlsread('数据集.xlsx');
train_x = data(1:1000,1:end-1)';
train_y = data(1:1000,end)';
test_x = data(1001:end,1:end-1)';
test_y = data(1001:end,end)';
train_x=train_x'
train_y=train_y';
test_x=test_x';
test_y=test_y';
%% 数据预处理
% 数据预处理,将训练集和测试集归一化到[0,1]区间
[mtrain,ntrain] = size(train_x);
[mtest,ntest] = size(test_x);
dataset = [train_x;test_x];
% mapminmax为MATLAB自带的归一化函数
[dataset_scale,ps] = mapminmax(dataset',0,1);
dataset_scale = dataset_scale';
train_x = dataset_scale(1:mtrain,:);
test_x = dataset_scale( (mtrain+1):(mtrain+mtest),: );
%% 利用灰狼算法选择最佳的SVM参数c和g
SearchAgents_no=10; % 狼群数量,Number of search agents
Max_iteration=10; % 最大迭代次数,Maximum numbef of iterations
dim=2; % 此例需要优化两个参数c和g,number of your variables
lb=[0.01,0.01]; % 参数取值下界
ub=[100,100]; % 参数取值上界
% v = 5; % SVM Cross Validation参数,默认为5
Convergence_curve=zeros(1,Max_iteration);
l=0; % Loop counter循环计数器
% Main loop主循环
while l<Max_iteration % 对迭代次数循环
for i=1:size(Positions,1) % 遍历每个狼
if fitness>Alpha_score && fitness<Beta_score % 如果目标函数值介于于Alpha狼和Beta狼的目标函数值之间
Beta_score=fitness; % 则将Beta狼的目标函数值更新为最优目标函数值,Update beta
Beta_pos=Positions(i,:); % 同时更新Beta狼的位置
end
if fitness>Alpha_score && fitness>Beta_score && fitness<Delta_score % 如果目标函数值介于于Beta狼和Delta狼的目标函数值之间
Delta_score=fitness; % 则将Delta狼的目标函数值更新为最优目标函数值,Update delta
Delta_pos=Positions(i,:); % 同时更新Delta狼的位置
end
end
a=2-l*((2)/Max_iteration); % 对每一次迭代,计算相应的a值,a decreases linearly fron 2 to 0
% Update the Position of search agents including omegas
for i=1:size(Positions,1) % 遍历每个狼
for j=1:size(Positions,2) % 遍历每个维度
% 包围猎物,位置更新
r1=rand(); % r1 is a random number in [0,1]
r2=rand(); % r2 is a random number in [0,1]
A1=2*a*r1-a; % 计算系数A,Equation (3.3)
C1=2*r2; % 计算系数C,Equation (3.4)
% Alpha狼位置更新
D_alpha=abs(C1*Alpha_pos(j)-Positions(i,j)); % Equation (3.5)-part 1
X1=Alpha_pos(j)-A1*D_alpha; % Equation (3.6)-part 1
r1=rand();
r2=rand();
A2=2*a*r1-a; % 计算系数A,Equation (3.3)
C2=2*r2; % 计算系数C,Equation (3.4)
% Beta狼位置更新
D_beta=abs(C2*Beta_pos(j)-Positions(i,j)); % Equation (3.5)-part 2
X2=Beta_pos(j)-A2*D_beta; % Equation (3.6)-part 2
r1=rand();
r2=rand();
A3=2*a*r1-a; % 计算系数A,Equation (3.3)
C3=2*r2; % 计算系数C,Equation (3.4)
% Delta狼位置更新
D_delta=abs(C3*Delta_pos(j)-Positions(i,j)); % Equation (3.5)-part 3
X3=Delta_pos(j)-A3*D_delta; % Equation (3.5)-part 3
% 位置更新
Positions(i,j)=(X1+X2+X3)/3;% Equation (3.7)
end
end
l=l+1;
Convergence_curve(l)=Alpha_score;
end
bestc=Alpha_pos(1,1);
bestg=Alpha_pos(1,2);
bestGWOaccuarcy=Alpha_score;
%% 利用最佳的参数进行SVM网络训练
% model = fitcecoc(train_x, train_y,cmd_gwosvm);
% save classifier.mat model;
% predict_label = predict(model,test_x);
% predict_label2 = predict(model,train_x);
% 打印测试集分类准确率
k1 = length(test_y);
n1 = length(find(predict_label == test_y));
disp('打印测试集分类准确率');
Accuracy_1 = n1 / k1 * 100;
k2 = length(train_y);
n2 = length(find(predict_label2 == train_y));
disp('打印测试集分类准确率');
Accuracy_2 = n2 / k2 * 100;
%% 结果分析
% 测试集的实际分类和预测分类图
figure;
hold on;
plot(test_y,'b-o');
plot(predict_label,'r-*');
legend('真实类别','预测类别')
xlabel('测试集')
ylabel('测试集类别')
string = {'SVM-GWO训练集';['正确率Accuracy = ' num2str(Accuracy_2) '%' ]};
title(string)
%% 显示程序运行时间
toc
%fpr 精确率 tpr召回率
[Metrics_test,FPR,TPR]=polygonareametric(test_y,predict_label,0);
predict_label2=categorical(predict_label2);
train_y=categorical(train_y);
predict_label=categorical(predict_label);
test_y=categorical(test_y);
figure
plotconfusion(predict_label2,train_y)
figure
plotconfusion(predict_label,test_y)
结果显示
文章来源:matlab学习之家