基于灰狼算法優化支持向量機的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);figureplotconfusion(predict_label2,train_y)figureplotconfusion(predict_label,test_y)
結果顯示
文章來源:matlab學習之家
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















