Dual SVM (对偶支持向量机)

来源:互联网 发布:网络攻击的位置 编辑:程序博客网 时间:2024/05/18 12:02

1. SVM 目标函数及约束条件

SVM 的介绍及数学推导参考:我的CSDN,此处直接跳过,直接给出 SVM 的目标函数和约束条件:

minw,b12wTws.t.yn(wTxn+b)1,n=1,..N

2. 拉格朗日乘子形式

利用拉格朗日乘子法可以将 1 中的有约束问题转化为无约束问题,如下所示:

L(w,b,α)=12wTw+Nn=0αn(1yn(wTxn+b))

此时的目标函数变为:

minw,b(maxαn>0L(w,b,α))

对于不好的 b,w,会有1yn(wTx+b)>0 ,则:

maxαn>0(Ω+Nn=0αn(......))αn

对于好的 b,w,会有1yn(wTx+b)<0 ,则:

maxαn>0(Ω+Nn=0αn(......))Ωαn0

3. 对偶形式

假设 p 表示目标函数的最优解,即:

minw,b(maxαn>0L(w,b,α))=p

假设 q 表示下述目标函数对偶形式的最优解,即:

maxαn>0(minw,bL(w,b,α))=q

则满足:p>q

因为值域有重叠时,最大值中的最小值比最小值中的最大值要大,如下图所示:

这里写图片描述

因为 q 提供了 p 的一个下界,在满足某些条件的情况下这两者相等,可以通过求解第二个问题间接的求解第一个问题。

对于二次规划问题,如果满足下述条件,则两个问题等价,构成强对偶关系。
1. 凸问题
2. 有解
3. 线性条件

因此,求解 p 的问题就变成了求解 q 的问题。

maxαn>0minw,b12wTw+Nn=1αn(1yn(wTxn+b))L(w,b)

4. 求解

  1. L(w,b)b=0=Nn=1αnyn,得:
    Nn=1αnyn=0
  2. 把上式带入 L(w,b,α) 得:
    maxαn>0minw12wTw+Nn=1αn(1ynwTxn)L(w,b)
  3. L(w)w=0=wiNn=1αnwTxn,i,得:
    w=Nn=1αnynxn
  4. 把上式带入 L(w),得:
    maxαn>0(12||Nn=1αnynxn||2+Nn=1αn)
  5. max -> min
    minαn>0(12||Nn=1αnynxn||2Nn=1αn)
  6. 标准对偶 SVM
    minαn>0(12Nn=1Nm=1αnαmynymxTnxm||Nn=1αn)s.t.Nn=1αnyn=0αn=0,n=1,2,...,n
  7. 转化为二次规划问题
    αQP(Q,p,A,c)minu12αTQα+pTαs.t.aTmαcm,m=1,2,...,M


qn,m=ynymxTnxmp=1Nc=0

8. 求解 b,w
w=Nn=1αnynxn

αn(1yn(wTxn+b))=0αn>0b=ynwTx

matlab 中的 quadprog 函数可用于求解该问题。

5. 问题

在第4部份中第7步的二次规划问题中,qn,m=ynymxTnxm,也就是说 Q 的计算复杂度为O(N2d)d 表示每个样本的长度;而在标准的 SVM 问题中,Q 的计算复杂度为O(Nd2),所以,如果 d>N,将原问题转化为对偶问题可以减小计算复杂度,而如果d<N时,直接计算的复杂度反而较低。

由于w=Nn=1αnynxn,在非支持向量处αn=0,也就是说w只与支持向量有关,所以预测函数
h(x)=sign(wTx+b)只与支持向量有关。而直接的 SVM 不具有这样的性质。

所谓的支持向量就是:离分隔超平面最近的那些点,就是在第6部份标出的那些点。

6. 示例

% 功能:演示对偶SVM算法% 时间:2015-07-12clcclear allclose all%% 测试样本dataLength = 2;dataNumber = [100, 100];% 第一类x1 = randn(dataLength, dataNumber(1));y1 = ones(1, dataNumber(1));% 第二类x2 = 5 + randn(dataLength, dataNumber(2));y2 = -ones(1, dataNumber(2));% 显示figure(1);plot(x1(1,:), x1(2,:), 'bx', x2(1,:), x2(2,:), 'k.');axis([-3 8 -3 8]);title('SVM')hold on% 合并样本X = [x1, x2];       Y = [y1, y2];      % 打乱样本顺序index = randperm(sum(dataNumber));X(:, index) = X;Y(:, index) = Y;%% SVM 训练% line : w1x1 + w2x2 + b = 0% weight = [b, w1, w2]weight = dualSvmTrainMine(X, Y);%% 测试输出% y = kx + bk = -weight(2) / weight(3);b = weight(1) / weight(3);xLine = -2:0.1:7;yLine = k .* xLine - b;plot(xLine, yLine, 'r')hold on%% 查找支持向量epsilon = 1e-5;dist = abs(k .* X(1, :) - X(2,:) - b);i_sv = find(dist <= min(dist(:)) + epsilon);        plot(X(1,i_sv), X(2,i_sv),'ro');

Dual SVM 结果:

这里写图片描述

SVM 和 Dual SVM 结果:

这里写图片描述

从上图可以看出,SVM 和 Dual SVM 的结果是一致的。

7. 完整代码

GitHub

8. 参考

  1. 《视觉机器学习20讲》第九讲
  2. 《Coursera 机器学习技法(林轩田 - 台湾大学 》02 Dual Support Vector Machine
0 0
原创粉丝点击