Fire15 +

SVM入门到实现

1.原始问题

输入:T={(x1,y1),(x2,y2),…,(xn,yn)},xi属于Rn,yi属于{-1,+1}

输出:w,b

学习目标:在特征空间找到一个超平面将实例分到不同的类。

分离超平面:w·x+b=0

分类决策函数:f(x)=sign(w·x+b)


在超平面确定的情况下,|w·x+b|可以相对的表示点x到超平面的距离远近。 则可用y(w·x+b)表示分类的正确性及确信度。即函数间隔:

由于函数间隔不稳定(成倍改变w,b时超平面不变,函数间隔却会改变),所以引入几何间隔(一般是实例点到超平面的带符号距离)。即对w加以约束。如规范化||w||=1,使得间隔是确定的。

几何间隔:


则目标为求得一个几何间隔最大的分离超平面。可表示如下: s.t.  

其中几何间隔可以等价为 函数间隔 / ||w||=1,同时对于最优化问题,函数间隔的取值不影响解。(因为w,b按比例乘以k,那么函数间隔也变成k倍,即 函数间隔*k / ||kw||=函数间隔 / ||w||) 这样就可以取函数间隔=1.代入后注意到 最大化1/||w|| 等价于 最小化||w||。

所以得到SVM最优化问题:

s.t.  

2.软间隔问题

线性不可分时的线性支持向量机:考虑训练数据中少量的特异点。对每个样本点引入松弛变量,同时支付一个代价。

则原始问题变为如下凸二次规划问题:

s.t.      

3.拉格朗日对偶问题

优点:1.对偶问题更容易求解;2.可以自然引入核函数。

拉格朗日函数:

    其中,

则原始问题等价于拉格朗日函数的极小极大问题:

则对偶问题为极大极小问题:

首先求L对的极小:             可得:             将上面三个式子代入到拉格朗日函数中,得:    

再对上式求α的极大,即得对偶问题:

       s.t.          其中,由约束,消去ui可得

原问题是凸二次规划问题,解满足KKT条件。 设对偶问题的解为: 若存在α * 的一个分量j满足,则原始问题解w,b为:              

4.SMO算法

问题变为求解对偶问题的解α。编程求解时一般初始化α为全0。

SMO思路:若所有变量的解都满足此优化问题的KKT条件,则解就得到了。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。子问题有两个变量,一个是选择违反KKT条件最严重的那一个,另一个由约束条件自动确定。

整个SMO算法包含两个部分:求解两个变量二次规划的解析方法和选择变量的启发式方法。

于是SMO的最优化问题的子问题为:

    s.t.           其中Kij=K(xi,xj),ζ为常数,且上式省略了不含α1,α2的常数项。

设问题初始可行解为,最优解为,且假设在沿着约束方向未经剪辑时α2的最优解为

记, 则有:         其中,       

由于α的不等式约束,最优值范围要满足: 其中L,H是α2对角线段端点的界,且有        

则有:

同时可求得:

变量的选择方法

SMO算法再每个子问题中选择两个变量优化,其中至少一个变量是违反KKT条件的。

1.第一个变量(外层循环) 在训练样本中选择违反KKT条件最严重的样本点。即检查是否满足KKT条件:        其中,

2.第二个变量(内层循环) 标准是希望使α2能有足够变化。为了加快计算速度,一种简单做法是选择α2是其对应|E1-E2|最大。即若E1为正,则选最小的Ei为E2;反之E1为负选最大的Ei为E2.

3.计算阈值b和差值Ei 每次完成两个变量优化后都要重新计算b。由KKT条件:

都满足大于0小于C,则b1new=b2new。若是0或C,则b1_new和b2_new及之间的数都符合KKT条件,这时选择他们中点作为b_new.

每次优化后还必须更新对应的Ei值,并保存再列表中: 其中S是所有支持向量xj的集合。

END

实现代码

参考资料:《统计学习方法》

Coding

Writing

Living