支持向量机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');

以下为实验结果图:                                        

             

版权声明:本文为博主原创文章,未经博主允许不得转载。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值