%SMO算法求解支持向量机
A=load('study.txt');%加载数据
X=A(:,1:2);
%特征值的数据
label=A(:,3);
%标签向量
b=0;
%待优化的参数
[row,col]=size(A);
%计算矩阵A的行数和列数
iter=0;
%迭代次数
C=1;
%最大间隔和分类正确的权重
toler=0.001;
MAX=100;
%最大迭代次数
alphas=zeros(row,1);%要求的参数,初始化为0?
while(iter<MAX)
iterchange=0;%判断某一次循环中有没有参数改变
for i=1:row
fxi=double((alphas.*label)'*(X*X(i,:)'))+b; %第i个的预测值
ei=fxi-double(label(i)); %第i个预测值和真实值之差
% if (label(i)*ei<-toler)||(label(i)*ei>toler)
if (alphas(i)>=0&&label(i)*ei<-toler)||(alphas(i)>=0&&label(i)*ei>toler)
j=i;
%产生另外一个值j?
while j==i
j=randi(row-1)+1;
end
fxj=double((alphas.*label)'*(X*X(j,:)'))+b; %第j个的预测值
ej=fxj-double(label(j)); %第j个预测值和真实值之差
alphasoldI=alphas(i); %保留参数的值
alphasoldJ=alphas(j);
if (label(i)~=label(j)) %限制求导出来的label(j)的值,在L和H之间
L=max(0,alphas(j)-alphas(i));
H=min(C,C+alphas(j)-alphas(i));
else
L=max(0,alphas(j)+alphas(i)-C);
H=min(C,alphas(j)+alphas(i));
end
if L>=H
continue;
end
eta=X(i,:)*X(i,:)'+X(j,:)*X(j,:)'-2*X(i,:)*X(j,:)';%?这部分代码是求求导出来的最优值
if eta<=0
continue;
end
alphas(j)=alphas(j)+label(j)*(ei-ej)/eta; %求出优化后的alphas(j)值
if alphas(j)>H %求出的alphas(j)必须在L和H之间
alphas(j)=H;
end
if alphas(j)<L
alphas(j)=L;
end
if abs(alphas(j)-alphasoldJ)<0.00001
% 若果发生轻微的变化就退出循环
continue;
end
alphas(i)=alphas(i)+label(i)*label(j)*(alphasoldJ-alphas(j));% 更新 alphas(i) 的值
b1=b-ei-label(i)*(alphas(i)-alphasoldI)*(X(i,:)*X(i,:)')-label(j)*(alphas(j)-alphasoldJ)*(X(j,:)*X(j,:)');
b2=b-ej-label(i)*(alphas(i)-alphasoldI)*(X(i,:)*X(i,:)')-label(j)*(alphas(j)-alphasoldJ)*(X(j,:)*X(j,:)');
if alphas(i)>0&&alphas(i)<C
%b 值得更新
b=b1;
elseif alphas(j)>0&&alphas(j)<C
b=b2;
else
b=(b1+b2)/2;
end
iterchange=iterchange+1;
end
end
if iterchange==0
iter=iter+1;
else
iter=0;
end
% iter=iter+1;
end
w=(alphas.*label)'*X;
plot(X(1:row/2,1),X(1:row/2,2),'*');
hold on;
plot(X((1+row/2):row,1),X((1+row/2):row,2),'go');
m=0:0.01:10;
n=(-b-w(2)*m)/w(1);
plot(m,n,'r');