【SVM预测】基于蝙蝠算法改进SVM实现数据分类
? 最近在學習svm算法,借此文章記錄自己的學習過程,在學習很多處借鑒了z老師的講義和李航的統計,若有不足的地方,請海涵;svm算法通俗的理解在二維上,就是找一分割線把兩類分開,問題是如下圖三條顏色都可以把點和星劃開,但哪條線是最優的呢,這就是我們要考慮的問題;
首先我們先假設一條直線為 W?X+b =0 為最優的分割線,把兩類分開如下圖所示,那我們就要解決的是怎么獲取這條最優直線呢?及W 和 b 的值;在SVM中最優分割面(超平面)就是:能使支持向量和超平面最小距離的最大值;
我們的目標是尋找一個超平面,使得離超平面比較近的點能有更大的間距。也就是我們不考慮所有的點都必須遠離超平面,我們關心求得的超平面能夠讓所有點中離它最近的點具有最大間距。
如上面假設藍色的星星類有5個樣本,并設定此類樣本標記為Y =1,紫色圈類有5個樣本,并設定此類標記為 Y =-1,共 T ={(X? ,Y?) , (X?,Y?) (X?,Y?) .........} 10個樣本,超平面(分割線)為wx+b=0;? 樣本點到超平面的幾何距離為:
?????
??????? 此處要說明一下:函數距離和幾何距離的關系;定義上把 樣本| w?x?+b|的距離叫做函數距離,而上面公式為幾何距離,你會發現當w 和b 同倍數增加時候,函數距離也會通倍數增加;簡單個例子就是,樣本 X? 到 2wX?+2b =0的函數距離是wX??+b =0的函數距離的 2倍;而幾何矩陣不變;
??????? 下面我們就要談談怎么獲取超平面了?!
超平面就是滿足支持向量到其最小距離最大,及是求:max [支持向量到超平面的最小距離] ;那只要算出支持向量到超平面的距離就可以了吧 ,而支持向量到超平面的最小距離可以表示如下公式:
故最終優化的的公式為:
?根據函數距離和幾何距離可以得知,w和b增加時候,幾何距離不變,故怎能通過同倍數增加w和 b使的支持向量(距離超平面最近的樣本點)上樣本代入 y(w*x+b) =1,而不影響上面公式的優化,樣本點距離如下:如上圖其r1函數距離為1,k1函數距離為1,而其它
樣本點的函數距離大于1,及是:y(w?x+b)>=1,把此條件代入上面優化公式候,可以獲取新的優化公式1-3:
公式1-3見下方:優化最大化分數,轉化為優化最小化分母,為了優化方便轉化為公式1-4
為了優化上面公式,使用拉格朗日公式和KTT條件優化公式轉化為:
對于上面的優化公式在此說明一下:比如我們的目標問題是???梢詷嬙旌瘮?#xff1a;
此時?與?是等價的。因為?,所以只有在?的情況下
才能取得最大值,因此我們的目標函數可以寫為。如果用對偶表達式:,
由于我們的優化是滿足強對偶的(強對偶就是說對偶式子的最優值是等于原問題的最優值的),所以在取得最優值?的條件下,它滿足 :
,
結合上面的一度的對偶說明故我們的優化函數如下面,其中a >0
現在的優化方案到上面了,先求最小值,對 w 和 b 分別求偏導可以獲取如下公式:
把上式獲取的參數代入公式優化max值:
化解到最后一步,就可以獲取最優的a值:
以上就可以獲取超平面!
但在正常情況下可能存在一些特異點,將這些特異點去掉后,剩下的大部分點都能線性可分的,有些點線性不可以分,意味著此點的函數距離不是大于等于1,而是小于1的,為了解決這個問題,我們引進了松弛變量 ε>=0; 這樣約束條件就會變成為:
故原先的優化函數變為:
對加入松弛變量后有幾點說明如下圖所以;距離小于1的樣本點離超平面的距離為d ,在綠線和超平面之間的樣本點都是由損失的,
其損失變量和距離d 的關系,可以看出 ξ = 1-d , 當d >1的時候會發現ξ?=0,當 d<1 的時候?ξ = 1-d ;故可以畫出損失函數圖,如下圖1-7;樣式就像翻書一樣,我們把這個損失函數叫做 hinge損失;
下面我們簡單的就來討論一下核函數:核函數的作用其實很簡單就是把低維映射到高維中,便于分類。核函數有高斯核等,下面就直接上圖看參數對模型的影響,從下圖可以了解,當C變化時候,容錯變小,泛化能力變小;當選擇高斯核函數的時候,隨時R參數調大,準確高提高,最終有過擬合風險;
tic % 計時器 %% 清空環境變量 close all clear clc %format compactload('ISSL-Isomap.mat') % load CMPE原始 % mappedX=X; %% 數據提取 zc=mappedX(1:60,:);%特征輸入 lie=mappedX(61:120,:); mo=mappedX(121:180,:); que=mappedX(181:240,:); duan=mappedX(241:300,:); mm=size(zc,1); nn=20;a=ones(mm,1);%行為總體樣本數 b=2*ones(mm,1); c=3*ones(mm,1); d=4*ones(mm,1); f=5*ones(mm,1);n1=randperm(size(zc,1)); n2=randperm(size(lie,1)); n3=randperm(size(mo,1)); n4=randperm(size(que,1)); n5=randperm(size(duan,1));train_wine = [zc(n1(1:nn),:);lie(n2(1:nn),:);mo(n3(1:nn),:);que(n4(1:nn),:);duan(n5(1:nn),:)]; % 相應的訓練集的標簽也要分離出來 train_wine_labels = [a(1:nn,:);b(1:nn,:);c(1:nn,:);d(1:nn,:);f(1:nn,:)]; % 將第一類的31-59,第二類的96-130,第三類的154-178做為測試集 test_wine = [zc(n1((nn+1):mm),:);lie(n2((nn+1):mm),:);mo(n3((nn+1):mm),:);que(n4((nn+1):mm),:);duan(n5((nn+1):mm),:)]; % 相應的測試集的標簽也要分離出來 test_wine_labels = [a((nn+1):mm,:);b((nn+1):mm,:);c((nn+1):mm,:);d((nn+1):mm,:);f((nn+1):mm,:)]; %% 數據預處理 % 數據預處理,將訓練集和測試集歸一化到[0,1]區間 [mtrain,ntrain] = size(train_wine); [mtest,ntest] = size(test_wine);dataset = [train_wine;test_wine]; % mapminmax為MATLAB自帶的歸一化函數 [dataset_scale,ps] = mapminmax(dataset',0,1); dataset_scale = dataset_scale';train_wine = dataset_scale(1:mtrain,:); test_wine = dataset_scale( (mtrain+1):(mtrain+mtest),: );%% Default parameters 默認參數n=10; % Population size, typically10 to 40 N_gen=150; % Number of generations A=0.5; % Loudness (constant or decreasing) r=0.5; % Pulse rate (constant or decreasing) % This frequency range determines the scalings % You should change these values if necessary Qmin=0; % Frequency minimum Qmax=2; % Frequency maximum % Iteration parameters N_iter=0; % Total number of function evaluations %這是什么意思??? % Dimension of the search variables d=2; % Number of dimensions % Lower limit/bounds/ a vector Lb=[0.01,0.01]; % 參數取值下界 Ub=[100,100]; % 參數取值上界 % Initializing arrays Q=zeros(n,1); % Frequency v=zeros(n,d); % Velocities % Initialize the population/solutions% Output/display disp(['Number of evaluations: ',num2str(N_iter)]); disp(['Best =',num2str(best),' fmin=',num2str(fmin)]);%% 利用最佳的參數進行SVM網絡訓練 cmd_gwosvm = ['-c ',num2str(best(:,1)),' -g ',num2str(best(:,2))]; model_gwosvm = svmtrain(train_wine_labels,train_wine,cmd_gwosvm); %% SVM網絡預測 [predict_label] = svmpredict(test_wine_labels,test_wine,model_gwosvm); total = length(test_wine_labels);% 打印測試集分類準確率 right = length(find(predict_label == test_wine_labels)); Accuracy=right/total; % disp('打印測試集分類準確率'); % str = sprintf( 'Accuracy = %g%% (%d/%d)',accuracy(1),right,total); % disp(str); %% 結果分析 % 測試集的實際分類和預測分類圖 figure; hold on; plot(test_wine_labels,'o'); plot(predict_label,'r*'); xlabel('測試集樣本','FontSize',12); ylabel('類別標簽','FontSize',12); legend('實際測試集分類','預測測試集分類'); title('測試集的實際分類和預測分類圖','FontSize',12); grid on snapnowfigure plot(1:N_gen,AAA);總結
以上是生活随笔為你收集整理的【SVM预测】基于蝙蝠算法改进SVM实现数据分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Util】 时间天数增加,时间比较。
- 下一篇: 学霸们的科研工具