支持向量机SVM----简化版序列最小优化SMO(Sequential Minimal Optimation)

本算法根据《机器学习实战》中Python版的简化版SMO改编而来,所以详细的过程说明请参照原书,这里只给出了改编后的程序及结果。实验数据数量较大放在云盘上,https://pan.baidu.com/s/1cHJKku。

需要注意的问题:因为存在第二个点是随机选择的特征,所以每次实验的结果可能都不会完全一样。

以下为实验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
C=0.6;
%设定容错率
Toler=0.001;
%设定循环次数
MaxIter=30;
b=0;
Alpha=zeros(Row,1);
%循环计数器
flag=0;
while flagToler)&&(Alpha(i)>0))
            %在Row的范围内,随机选择一个不等于i的数
            Rnd=unidrnd(Row,1,Row);
            j=Rnd(1);
            if i==j
                j=Rnd(2);
            end
            X_j=(Alpha.*LabelMat)'*(DataMat*DataMat(j,:)')+b;
            %计算坐标Y的误差
            Err_j=X_j-LabelMat(j);
            %备份第i,j个Alpha
            Alpha_i_old=Alpha(i);
            Alpha_j_old=Alpha(j);
            %寻找最大最小值,保证Alpha在0到C之间
            if LabelMat(i)~=LabelMat(j)
                Low=max([0,Alpha(j)-Alpha(i)]);
                High=min([C,C+Alpha(j)-Alpha(i)]);
            else
                Low=max([0,Alpha(j)+Alpha(i)-C]);
                High=min([C,Alpha(j)+Alpha(i)]);
            end
            %如果最大最小相等,循环步进
            if Low==High
                continue;
            end
            Eta=2*DataMat(i,:)*DataMat(j,:)'-DataMat(i,:)*DataMat(i,:)'-DataMat(j,:)*DataMat(j,:)';
            if Eta>0
                continue;
            end
            Alpha(j)=Alpha(j)-LabelMat(j)*(Err_i-Err_j)/Eta;
            if Alpha(j)>High
                Alpha(j)=High;
            end
            if Alpha(j)0);
Sup=DataMat(Index,:);
scatter(Sup(:,1),Sup(:,2),'r');
实验结果仅供参考:

支持向量机SVM----简化版序列最小优化SMO(Sequential Minimal Optimation)_第1张图片







你可能感兴趣的:(数据挖掘)