对SVM的推导和编码实践(一)
线性模型
对于线性可分的二分类数据集,我们总是可以写出:
这样的预测模型,其中w是各属性的权重,b是截距即线性回归中的
在线性回归或逻辑回归中我们用预测值和真实值的某种关系来定义损失,如对数损失(逻辑回归)、0-1损失和平方损失,然后通过最小化风险函数的手段来求参数。最终都是求w(和b)。
我们发现,表达了一切线性模型,然后不同的优化策略(极值策略)对应着不同的机器学习算法。那么SVM采用什么策略来把玩这个模型呢?
SVM
模型
在二分类问题上,SVM以下式为决策模型:
c是人为定义的将样本分为正样本和负样本的常量,就像逻辑回归中的0.5一样
策略
SVM的思维相比代数和概率,偏几何更多。我们这样想,w,b决定了一个超平面将样本分开,这样的超平面很多,我们要在所有超平面中找到将样本划分得最开的那个超平面(w,b)。
这里,有了“最**”,就有了一个基本的方向。但是怎么表达划分得最开这回事呢?数学上怎么表达呢?
这要引出间隔的定义:
一个超平面与一个数据集的间隔定义为,数据集中在超平面两边离超平面最近距离的2倍
或者,让超平面居中,让两侧最近的点向超平面做垂线,让这两个距离相加。
间隔的公式为:
解释一下:在式(1)中各取一个正样本和负样本使得等号成立,它们到超平面的距离之和不正是2c吗,为什么要除以,因为w和b可以被任意缩放,为了消除缩放影响,我们要求真正的几何间隔,就要除以,它是w的模长。c是一个常数,为便于计算定为1。由此可以写出优化的目标函数及其约束条件:
这里要注意的是y_i取值为+1和-1,就可以统一上式的约束条件和求距离绝对值的算式,与逻辑回归(0,1)不同。其实本质没有区别,只是公式不同,要求的方便也不同。
这是一个带N个非等值约束的二次函数的极小值问题,套用拉格朗日乘子法的推广即可。
容错
为了减少各种叙述和公式的重复,在这里直接引入松弛变量的概念。
数据点中经常有噪音,如果噪音恰好出现在超平面的附近,对超平面的选择影响很大,因此我们允许在边界(即超平面两侧宽为1的路边)内的一部分宽度上出现的点也视为边界上的点,换句话说这些点并没有让margin变小(margin还是我们假定的1)
也就是说,虚线表示的超平面两侧的红色和黑色线这个范围内的点都合并理解为边界上的点,间隔仍然是外围黑线的距离。
红线和黑线之间的距离(控制马路牙子的宽度)用符号表示;如果我们允许这个值任意大的话,那我们设定的最小路宽1就没有意义了,因此必须对其作出限制,限制手段就是把加到式(4)中成为目标函数的一部分,这样就要求||w||和都要小才行,这里的C是用来平衡“最大化间隔”和“容忍一部分跑偏数据点”这两个目标的,它没有一个最优值,是认为设定的。
综上,我们要重写目标函数:
运用拉格朗日乘子法和对偶问题
将上述带约束条件的极小值问题改写为拉格朗日极小极大值问题:
α,γ是拉格朗日算子;
其对偶问题:
我们把强对偶条件写出来:
满足这些条件的同时为原问题(6)和对偶问题(7)的解。
对式(7)min部分,对求偏导并令为0,得出:
(11)是因为
将(9)(10)带回(7)有:
注:是i样本和j样本这两个向量的内积,更易区分的写法是;以后我们会看到如果引入了核函数,这里会变为,同样为了表述简单提前引入,我们可以认为内积也是一个函数,这样在写代码的时候就独立出来,便于以后替换成别的函数形式。
问题(13)就不好办了,虽然是带约束的极值问题,但是约束条件是一个和式和一个范围,无法直接套用拉格朗日什么的。
有一种叫感知机的方式通过不停地训练试错来找超平面,不过效果不佳。
好在有人发明了一种叫SMO(最小序列优化)的算法,可以一次更新两个α算子(或称一对),逐步迭代使得函数收敛于极小值附近并得到全部的α。
有了α就能求出w和b,因此最好的那个超平面也就确定了,就可以用它来对新数据做出分类了。
SMO是一种非常繁复的算法,手撸极其容易出错,留待以后解决。