天天看點

支援向量機SVM----完整版序列最小優化SMO(Sequential Minimal Optimation)

本算法根據《機器學習實戰》中Python版的完整版SMO改編而來,是以詳細的過程說明請參照原書。由于代碼量較大,函數較多,是以将整個算法和資料進行了打包,可在雲盤上下載下傳連結: https://pan.baidu.com/s/1eS6g0s6 密碼: pat5。這裡隻給出主程式的代碼及實驗結果。需要注意的是,因為實驗具有随機性,每次仿真的結果可能會有一定的差異。

以下為實驗Matlab代碼:

clc;
clear;
%加載測試資料檔案,前兩列為坐标值,後兩列為類标号
fileID = fopen('D:\matlabFile\SVM\SVM.txt');
DS=textscan(fileID,'%f %f %f');
fclose(fileID);
%将資料轉為矩陣形式
DataMat=cat(2,DS{1},DS{2});
[Row,Column]=size(DataMat);
%提取類别矩陣
LabelMat=DS{3};
%常數
C=0.6;
%容差
Toler=0.001;
%設定最大循環次數
MaxIter=40;
kTup={'lin',0};
%構造結構體
OS=BuildStruct(DataMat,LabelMat,C,Toler,kTup);
%循環計數器
flag=0;
EnterSet=true;
alphaPairChanged=0;
 while (flag<MaxIter)&&(alphaPairChanged>0||EnterSet)
     alphaPairChanged=0;
     if EnterSet
         for i=1:OS.m
             Result=InnerL(i,OS);
             OS=Result{1,1};
             alphaPairChanged=alphaPairChanged+Result{1,2};
         end
         flag=flag+1;
     else
         Index=find(OS.Alpha>0);
         for i=1:length(Index)
             Result=InnerL(Index(i),OS);
             OS=Result{1,1};
             alphaPairChanged=alphaPairChanged+Result{1,2};      
         end
         flag=flag+1; 
     end
     if EnterSet
         EnterSet=false;
     elseif alphaPairChanged==0
         EnterSet=true;
     end
 end
 %顯示原始點集
scatter(DataMat(:,1),DataMat(:,2),'filled');
hold on
%顯示支援向量
Index=find(OS.Alpha>0);
Sup=DataMat(Index,:);
scatter(Sup(:,1),Sup(:,2),'r','filled');
           

以下為實驗結果圖:                                        

支援向量機SVM----完整版序列最小優化SMO(Sequential Minimal Optimation)

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

繼續閱讀