1.算法描述
SVM 是有監(jiān)督的學(xué)習(xí)模型葫录,我們需要事先對(duì)數(shù)據(jù)打上分類標(biāo)簽,通過求解最大分類間隔來求解二分類問題。如果要求解多分類問題缴允,可以將多個(gè)二分類器組合起來形成一個(gè)多分類器。
WOA算法設(shè)計(jì)的既精妙又富有特色,它源于對(duì)自然界中座頭鯨群體狩獵行為的模擬练般, 通過鯨魚群體搜索矗漾、包圍、追捕和攻擊獵物等過程實(shí)現(xiàn)優(yōu)時(shí)化搜索的目的薄料。在原始的WOA中敞贡,提供了包圍獵物,螺旋氣泡摄职、尋找獵物的數(shù)學(xué)模型誊役。在初始每個(gè)鯨魚的位置
代表了一個(gè)可行解,通過后期探索和開發(fā)兩個(gè)階段谷市,逐步找到最佳位置蛔垢,即最優(yōu)解。
首先迫悠,座頭鯨可以識(shí)別獵物的位置并將其包圍鹏漆,但由于最佳位置在搜索空間中不是已的,因此WOA算法假定當(dāng)前最佳候選解決方案是目標(biāo)獵物或接近最佳獵物创泄。 確定最佳搜索代理后艺玲,其他搜索代理將因此嘗試更新其對(duì)最佳搜索代理的位置。 此行為由以下方程式表示:
支持向量機(jī)(support vector machines, SVM)是二分類算法验烧,所謂二分類即把具有多個(gè)特性(屬性)的數(shù)據(jù)分為兩類板驳,目前主流機(jī)器學(xué)習(xí)算法中,神經(jīng)網(wǎng)絡(luò)等其他機(jī)器學(xué)習(xí)模型已經(jīng)能很好完成二分類碍拆、多分類若治,學(xué)習(xí)和研究SVM,理解SVM背后豐富算法知識(shí)感混,對(duì)以后研究其他算法大有裨益端幼;在實(shí)現(xiàn)SVM過程中,會(huì)綜合利用之前介紹的一維搜索弧满、KKT條件婆跑、懲罰函數(shù)等相關(guān)知識(shí)。本篇首先通過詳解SVM原理庭呜,后介紹如何利用python從零實(shí)現(xiàn)SVM算法滑进。
實(shí)例中樣本明顯的分為兩類,黑色實(shí)心點(diǎn)不妨為類別一募谎,空心圓點(diǎn)可命名為類別二扶关,在實(shí)際應(yīng)用中會(huì)把類別數(shù)值化,比如類別一用1表示数冬,類別二用-1表示节槐,稱數(shù)值化后的類別為標(biāo)簽。每個(gè)類別分別對(duì)應(yīng)于標(biāo)簽1、還是-1表示沒有硬性規(guī)定铜异,可以根據(jù)自己喜好即可哥倔,需要注意的是,由于SVM算法標(biāo)簽也會(huì)參與數(shù)學(xué)運(yùn)算揍庄,這里不能把類別標(biāo)簽設(shè)為0咆蒿。
線性核:
主要用于線性可分的情況,我們可以看到特征空間到輸入空間的維度是一樣的币绩,其參數(shù)少速度快蜡秽,對(duì)于線性可分?jǐn)?shù)據(jù),其分類效果很理想
通常首先嘗試用線性核函數(shù)來做分類缆镣,看看效果如何芽突,如果不行再換別的
優(yōu)點(diǎn):方案首選、簡(jiǎn)單董瞻、可解釋性強(qiáng):可以輕易知道哪些feature是重要的
缺點(diǎn):只能解決線性可分的問題
高斯核:
通過調(diào)控參數(shù)寞蚌,高斯核實(shí)際上具有相當(dāng)高的靈活性,也是使用最廣泛的核函數(shù)之一钠糊。
如果σ \sigmaσ選得很大的話挟秤,高次特征上的權(quán)重實(shí)際上衰減得非常快抄伍,所以實(shí)際上(數(shù)值上近似一下)相當(dāng)于一個(gè)低維的子空間艘刚;
如果σ \sigmaσ選得很小,則可以將任意的數(shù)據(jù)映射為線性可分——當(dāng)然截珍,這并不一定是好事攀甚,因?yàn)殡S之而來的可能是非常嚴(yán)重的過擬合問題岗喉。
優(yōu)點(diǎn):可以映射到無限維、決策邊界更為多維荚斯、只有一個(gè)參數(shù)
缺點(diǎn):可解釋性差、計(jì)算速度慢查牌、容易過擬合
多項(xiàng)式核
多項(xiàng)式核函數(shù)可以實(shí)現(xiàn)將低維的輸入空間映射到高緯的特征空間事期,
但是多項(xiàng)式核函數(shù)的參數(shù)多
當(dāng)多項(xiàng)式的階數(shù)比較高的時(shí)候纸颜,核矩陣的元素值將趨于無窮大或者無窮小,計(jì)算復(fù)雜度會(huì)大到無法計(jì)算懂衩。
優(yōu)點(diǎn):可解決非線性問題、主觀設(shè)置
缺點(diǎn):多參數(shù)選擇、計(jì)算量大
sigmoid核
采用sigmoid核函數(shù)浊洞,支持向量機(jī)實(shí)現(xiàn)的就是只包含一個(gè)隱層牵敷,激活函數(shù)為 Sigmoid 函數(shù)的神經(jīng)網(wǎng)絡(luò)法希。
應(yīng)用SVM方法,隱含層節(jié)點(diǎn)數(shù)目(它確定神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu))毛肋、隱含層節(jié)點(diǎn)對(duì)輸入節(jié)點(diǎn)的權(quán)值都是在設(shè)計(jì)(訓(xùn)練)的過程中自動(dòng)確定的屋剑。
而且支持向量機(jī)的理論基礎(chǔ)決定了它最終求得的是全局最優(yōu)值而不是局部最小值,也保證了它對(duì)于未知樣本的良好泛化能力而不會(huì)出現(xiàn)過學(xué)習(xí)現(xiàn)象唉匾。
如圖巍膘,輸入層->隱藏層之間的權(quán)重是每個(gè)支撐向量,隱藏層的計(jì)算結(jié)果是支撐向量和輸入向量的內(nèi)積峡懈,隱藏層->輸出層之間的權(quán)重是支撐向量對(duì)應(yīng)的
woa-svm流程圖如下所示:
2.仿真效果預(yù)覽
matlab2022a仿真結(jié)果如下:
3.MATLAB核心程序
P ??= breast(:,1:9);
T ??= round(breast(:,end)/2);
Iters = 30; ???????????%最大迭代次數(shù)
D ????= 2; ???????????%搜索空間維數(shù)
Num ??= 10; ??????????
%初始化種群的個(gè)體(可以在這里限定位置和速度的范圍)
woa_idx ?????= zeros(1,D);
woa_get ?????= inf;
%初始化種群的個(gè)
xwoa=rand(Num,D)/70; %隨機(jī)初始化位置
for t=1:Iters
t
for i=1:Num
if xwoa(i,1)<0
xwoa(i,1)=0.1;
end
if xwoa(i,2)<0
xwoa(i,2)=0.001;
end
%目標(biāo)函數(shù)更新
[pa(i)] ?= fitness(xwoa(i,:),P,T);
Fitout ??= pa(i);
%更新
if Fitout < woa_get ?
woa_get = Fitout;
woa_idx = xwoa(i,:);
end
end
%調(diào)整參數(shù)
c1 = 2-t*((1)/120);
c2 =-1+t*((-1)/120);
%位置更新
for i=1:Num
rng(i);
r1 ????????= rand();
r2 ????????= rand();
K1 ????????= 2*c1*r1-c1; ?
K2 ????????= 2*r2; ????????????
l ?????????=(c2-1)*rand + 1; ?
rand_flag ?= rand(); ??
for j=1:D
if rand_flag<0.6 ??
if abs(K1)>=1
RLidx ???= floor(Num*rand()+1);
X_rand ??= xwoa(RLidx, :);
D_X_rand = abs(K2*X_rand(j)-xwoa(i,j));
xwoa(i,j)= X_rand(j)-K1*D_X_rand; ????
else
D_Leader = abs(K2*woa_idx(j)-xwoa(i,j));
xwoa(i,j)= woa_idx(j)-K1*D_Leader; ???
end
else
distLeader = abs(woa_idx(j)-xwoa(i,j));
xwoa(i,j) ?= distLeader*exp(12*l).*cos(l.*2*pi)+woa_idx(j);
end
end
end
[pb] ????= fitness(woa_idx,P,T);
Pbest(t) = pb;
end