SVM入门到实现
2017-08-28
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最优化问题:
2.软间隔问题
线性不可分时的线性支持向量机:考虑训练数据中少量的特异点。对每个样本点引入松弛变量,同时支付一个代价。
则原始问题变为如下凸二次规划问题:
3.拉格朗日对偶问题
优点:1.对偶问题更容易求解;2.可以自然引入核函数。
拉格朗日函数:
首先求L对的极小: 可得: 将上面三个式子代入到拉格朗日函数中,得:
再对上式求α的极大,即得对偶问题:
原问题是凸二次规划问题,解满足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的集合。