1.算法描述
支持向量機(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)的
蟻群算法是受到對(duì)真實(shí)螞蟻群覓食行為研究的啟發(fā)而提出秉剑。生物學(xué)研究表明:一群相互協(xié)作的螞蟻能夠找到食物和巢穴之間的最短路徑,而單只螞蟻則不能泛豪。生物學(xué)家經(jīng)過大量細(xì)致觀察研究發(fā)現(xiàn),螞蟻個(gè)體之間的行為是相互作用相互影響的。螞蟻在運(yùn)動(dòng)過程中,能夠在它所經(jīng)過的路徑上留下一種稱之為信息素的物質(zhì),而此物質(zhì)恰恰是螞蟻個(gè)體之間信息傳遞交流的載體侦鹏。螞蟻在運(yùn)動(dòng)時(shí)能夠感知這種物質(zhì),并且習(xí)慣于追蹤此物質(zhì)爬行,當(dāng)然爬行過程中還會(huì)釋放信息素诡曙。一條路上的信息素蹤跡越濃,其它螞蟻將以越高的概率跟隨爬行此路徑,從而該路徑上的信息素蹤跡會(huì)被加強(qiáng),因此,由大量螞蟻組成的蟻群的集體行為便表現(xiàn)出一種信息正反饋現(xiàn)象。某一路徑上走過的螞蟻越多,則后來者選擇該路徑的可能性就越大略水。螞蟻個(gè)體之間就是通過這種間接的通信機(jī)制實(shí)現(xiàn)協(xié)同搜索最短路徑的目標(biāo)的价卤。
蟻群算法是對(duì)自然界螞蟻的尋徑方式進(jìn)行模擬而得出的一種仿生算法。螞蟻在運(yùn)動(dòng)過程中聚请,能夠在它所經(jīng)過的路徑上留下信息素進(jìn)行信息傳遞炸卑,而且螞蟻在運(yùn)動(dòng)過程中能夠感知這種物質(zhì),并以此來指導(dǎo)自己的運(yùn)動(dòng)方向洒敏。因此,由大量螞蟻組成的蟻群的集體行為便表現(xiàn)出一種信息正反饋現(xiàn)象:某一路徑上走過的螞蟻越多,則后來者選擇該路徑的概率就越大。
2.仿真效果預(yù)覽
matlab2022a仿真結(jié)果如下:
3.MATLAB核心程序
%% 第一步:初始化
M ?= length(LB);%決策變量的個(gè)數(shù)
%蟻群位置初始化
X ?= zeros(M,N);
for i=1:M
x=unifrnd(LB(i),UB(i),1,N);
X(i,:)=x;
end
%輸出變量初始化
BESTX = cell(K,1);%細(xì)胞結(jié)構(gòu),每一個(gè)元素是M×1向量,記錄每一代的最優(yōu)個(gè)體
BESTY = zeros(K,1);%K×1矩陣,記錄每一代的最優(yōu)個(gè)體的評(píng)價(jià)函數(shù)值
k ????= 1;%迭代計(jì)數(shù)器初始化
Tau ??= ones(1,N);%信息素初始化
Y ????= zeros(1,N);%適應(yīng)值初始化
%% 第二步:迭代過程
while k<=K
k
YY=zeros(1,N);
for n=1:N
x ????= X(:,n);
J ????= func_fitness(X_train,X_test,T_train,T_test,x(1),x(2),x(3));
YY(n) = J;
end
maxYY ??= max(YY);
temppos = find(YY==maxYY);
POS ????= temppos(1);
%螞蟻隨機(jī)探路
for n=1:N
x ??= X(:,n);
J ??= func_fitness(X_train,X_test,T_train,T_test,x(1),x(2),x(3));
Fx ?= J;
mx ?= x + Lambda*rand*x; ??????????
J ??= func_fitness(X_train,X_test,T_train,T_test,mx(1),mx(2),mx(3));
Fmx = J;
if Fmx<Fx
X(:,n)=mx;
Y(n)=Fmx;
else
X(:,n)=x;
Y(n)=Fx;
end
end
%朝信息素最大的地方移動(dòng)
for n=1:N
rng(n*k);
if n~=POS & rand <= 1-k/K
.............................................................
end
end
indy ????= find(Y==0);
Y(indy) ?= 1;
%更新信息素并記錄
Tau ?????= Tau*(1-Rho);
maxY ????= max(Y);
minY ????= min(Y);
DeltaTau = Q*(maxY-Y)/(maxY-minY)/1e1;
p ???????= 0.05*Tau;
Tau ?????= (1-p).*Tau + DeltaTau;
minY ????= min(Y);
pos4 ????= find(Y==minY);
BESTX{k} = X(:,pos4(1));
%更新移動(dòng)速度
if k <= 1
e1 ????= minY;
Lambda = Lambda;
else
Lambda = Lambda + 0.15*(minY-e1);
e1 ????= minY;
end
k=k+1;
end
C0 ?????= BESTX{end}(1);
gamma0 ?= BESTX{end}(2);
tt0 ????= BESTX{end}(3);
save ACO.mat C0 gamma0 tt0
end
if SEL == 2
load ACO.mat
%調(diào)用四個(gè)最優(yōu)的參數(shù)
C ????= C0;
gamma = gamma0;
tt ???= tt0;
cmd ??????= ['-s 3',[' -t ', num2str(ceil(tt))],[' -c ', num2str(C)],[' -g ',num2str(gamma)],' -p 0.00001'];
model ????= svmtrain(T_train,X_train,cmd);
[yIn,input1ps] = mapminmax(In');
[Predict1,error1] = svmpredict(Out,yIn',model);