支持向量机A=load('h:\study.txt');%加载数据X=A(:,1:2);%特征值的数据label=A(:,3);%标签向量b=0;%待优化的参数[row,col]=size(A);%计算矩阵A的行数和列数iter=0;%迭代次数C=0.4;%最大间隔和分类正确的权重toler=0.001;MAX=40;%最大迭代次数alphas=zeros(row,1);%要求的参数,初始化为0while(iterMAX)iterchange=0;%判断某一次循环中有没有参数改变fori=1:rowfxi=double((alphas.*label)'*(X*X(i,:)'))+b;%第i个的预测值ei=fxi-double(label(i));%第i个预测值和真实值之差if(alphas(i)C&&label(i)*ei-toler)||(alphas(i)0&&label(i)*eitoler)j=i;%产生另外一个值jwhilej==ij=randint(1,1,row)+1;endfxj=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));elseL=max(0,alphas(j)+alphas(i)-C);H=min(C,alphas(j)+alphas(i));endifL==Hcontinue;endeta=X(i,:)*X(i,:)'+X(j,:)*X(j,:)'-2*X(i,:)*X(j,:)';%这部分代码是求求导出来的最优值ifeta=0continue;endalphas(j)=alphas(j)+label(j)*(ei-ej)/eta;%求出优化后的alphas(j)值ifalphas(j)H%求出的alphas(j)必须在L和H之间alphas(j)=H;endifalphas(j)Lalphas(j)=L;endifabs(alphas(j)-alphasoldJ)0.00001%若果发生轻微的变化就退出循环continue;endalphas(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,:)');ifalphas(i)0&&alphas(i)C%b值得更新b=b1;elseifalphas(j)0&&alphas(j)Cb=b2;elseb=(b1+b2)/2;enditerchange=iterchange+1;endendifiterchange==0iter=iter+1;elseiter=0;endend支持向量机主要是寻求一种能够最大间隔的超平面,它与logistic所构造的超平面原理不同的是:它主要是寻求局部点最优(也就是支持向量点),logistic是寻求全局最优。构造超平面方程,求出拉格朗日方程,在求出其对偶方程,这个对偶方程用SMO算法求解。实质就是求出那些参数,然后就可以求出W,就可以得出那些方程,就得到分割平面。这个算法的思想是在固定其余参数的时候,求得最优的一个参数,但是只把一个当做参数的话,那么这个参数可以用其他的参数表示,那么这个参数就不是参数。用一对参数把一个用另外一个参数表示,求出最优解。算法流程:遍历每个参数;这个参数是否满足要求()对应的代码:fxi=double((alphas.*label)'*(X*X(i,:)'))+b;%第i个的预测值ei=fxi-double(label(i));%第i个预测值和真实值之差if(alphas(i)C&&label(i)*ei-toler)||(alphas(i)0&&label(i)*eitoler)如果满足要求的话,随机选取另外一个参数,j=i;%产生另外一个值jwhilej==ij=randint(1,1,row)+1;endfxj=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,label(j)-label(i));H=min(C,C+label(j)-label(i));elseL=max(0,label(j)+label(i)-C);H=min(C,label(j)+label(i));endalphas(j)=alphas(j)+label(j)*(ei-ej)/eta;%求出优化后的alphas(j)值ifalphas(j)H%求出的alphas(j)必须在L和H之间alphas(j)=H;endifalphas(j)Lalphas(j)=L;end求出变化后的alphas(i)值:alphas(i)=alphas(i)+label(i)*label(j)*(alphasoldJ-alphas(j));%更新alphas(i)的值。同时要更新此时的b值: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,:)');ifalphas(i)0&&alphas(i)C%b值得更新b=b1;elseifalphas(j)0&&alphas(j)Cb=b2;elseb=(b1+b2)/2;end如果有发生变化的话,ifiterchange==0iter=iter+1;elseiter=0;end结束