自学机器学习一个月,接触到很多算法,但总觉得没有体会到各个算法的精髓,晕晕呼呼的。现在决定将每个算法总结一遍,白纸黑子写下来,随着时光慢慢体会各个算法间不同。
较早的分类模型——感知机(1957)是二类分类的线性模型,也是后来神经网络和支持向量机的基础。支持向量机(Support vector
machines)最早也是一种二类分类模型,经过演进,现在成为既能处理多元线性和非线性的问题,也能处理回归问题。在深度学习风靡之前算是最好的分类算法。但目前SVM的应用仍然很多,尤其是在小样本集上。
1.感知机模型
感知机模型是一种二分类的线性分类器,只能处理线性可分的问题,就是尝试找到一个超平面将数据集分开,在二维空间这个超平面就是一条直线,在三维空间就是一个平面。感知机模型如下:
sign函数是指示函数(当wx+b> 0,f(x)= 1; wx+b < 0,f(x)= -1)。感知机的超平面是wx+b= 0。
将上述分段函数(wx+b> 0,f(x)= 1; wx+b < 0f(x)= -1)整合成f(x)(wx+b)>0,即y(wx+ b) >0。满足该式子的样本点即分类正确的点,不满足的即分类错误的点。目标是找到这样一组参数w和b,使得将训练集中的正类点和负类点分开。
接下来定义损失函数(损失函数是衡量错误的程度的函数。当损失函数等于零时,意味着预测值=实际值)。
其中M是表示误分类的样本集合。
2.支持向量机
感知机模型中,我们的目标是将训练集分开,只要是能将样本分开的超平面都满足我们的要求,而这样的超平面有很多。支持向量机本质上和感知机类似,只是要求更加苛刻。在分类过程中,远离超平面的点肯定比超平面附近的点安全,更不容易被误分类。支持向量机的思想就是重点关注这些离超平面很近的点,一句话就是在分类正确的同时,让离超平面最近的点到超平面的间隔最大。
γ是离超平面最近的点的到超平面的几何间隔,将几何间隔用函数间隔替代,可以将式子表示为:
γ(帽子)表示的是函数间隔,而函数间隔的取值是会随着w,b成倍数变化而变化的,并不会影响最终的结果,因此令γ(帽子)
= 1,则我们最终的问题可以表述为:
在这里引出了支持向量机的第一个亮点:最大化间隔,最大化间隔能使得分类更加精确,且该最大间隔超平面是存在且唯一的。
上面的问题中的1/2||w||2 是凸函数,同时约束不等式是仿射函数,因此这是一个凸二次规划问题,根据凸优化理论,我们可以借助拉格朗日函数将我们的约束问题转化为无约束的问题来求解,我们的优化函数可以表达为:
αi 是拉格朗日乘子,
αi ≥0
i = 1, 2, 3, ....., n 。
根据拉格朗日的对偶性,可以将原始问题转化为对偶问题(只要对偶问题存在,对偶问题的最优化解就是原问题的最优化解,一般对偶问题都比原始问题更容易求解)极大极小问题:
先对w,b求导求极小问题,可以得到w,b的值:
将求得的解代入到拉格朗日函数中,可以得到下面的优化函数(将代入后原本的求α的极大问题转换成了极小问题):
因此只需要求得我们的α的值就可以求得我们的w,b的值(求α的常用算法是SMO算法,可以参考https://www.cnblogs.com/pinard/p/6111471.html)假设最终求得的α的值为α*,则w,b可以表述成:
引入KTT条件(KTT条件是上面拉格朗日函数求最优解的必要条件):
从KTT条件中可以看出,当yi(w*xi +b*) - 1 > 0 时,αi*= 0;当αi*> 0 时,yi(w*xi +b*) - 1 = 0;
结合上面的w,b表达式可以引出支持向量机的第二个亮点:w,b参数只与满足yi(w*xi +b*) - 1 = 0的样本有关,而这些样本点就是离最大间隔超平面最近的点,我们将这些点称之为支持向量。因此很多时候支持向量在小样本集分类时也能表现的很好,也正是因为这个原因。(另外需注意:α向量的个数是和训练集数量相等的,对与大的训练集,会导致所需要的参数数量增多,因此SVM在处理大的训练集时会比其他常见的机器学习算法要慢)
3.软间隔最大化
通常情况下的训练集中都会存在一些异常点,而这些异常点会导致训练集线性不可分,但除去这些异常点之后,剩下的样本就是线性可分的,而上面讲到的硬间隔最大化是无法处理线性不可分的问题,线性不可分意味着有些样本点的函数间隔是不能满足大于等于1的约束条件。因此我们对每个样本(xi,yi)引入一个松弛变量 ξi,则我们的约束条件变为:
目标函数中加入对松弛变量的惩罚项,惩罚参数C> 0,目标优化函数变为:
因为整个求解的原始问题可以描述为:
采用和之前同样的求解方法,利用拉格朗日将约束问题转化为无约束的问题,将原始问题转化为求极大极小问题的对偶问题,可以得到我们的最终结果:
和第二部分中的结果唯一不同的是αi 的取值范围多了一个上限C值,对于软间隔最大化时,其支持向量描述要复杂一些,因为其支持向量可以在间隔边界上(如下图中的虚线),也可以在间隔边界和超平面之间,或者在分离超平面误分的一侧。
4、合页损失函数
合页损失函数又称为hinge损失函数,其表达式如下:
因此我们上面的优化问题可以描述为:
对上述损失函数中的第一项可以理解为当样本分类正确且间隔大于1,即yi(wxi +b) ≥ 1时,损失为0;而当 yi(wxi +b) < 1 时,损失为
1- yi(wxi +b),注意在这里即使样本分类正确,但是间隔小于1的也会计入损失,这就是支持向量机的苛刻性。
下图是hinge损失函数和其他一些损失函数的比较:
5、线性不可分
上面讲到的软间隔最大化只能解决由于异常点而导致的线性不可分问题,而对于本身的数据集就是非线性的问题就无能为力,根据相关理论对于在低维空间线性不可分的问题,一般将其映射到高维空间后都是线性可分的,我们可以将这一理论运用到支持向量机中,可以引入一个函数 ϕ(x),将样本集从当前维度映射到更高的维度,回过头来看我们之前的优化函数:
我们只需要将优化函数中的內积xi · xj 转化成ϕ(xi) · ϕ(xj)即可解决我们的非线性问题,但与此同时也引入了新的问题我们的数据维度增大后,內积的计算量也增大了,当映射后的维度很高,甚至是达到无穷维之后,求解模型时的计算量也会显著增大,那么如何来处理这个问题呢?这就需要引入我们的核函数了。
我们知道即使在映射到高维后,內积ϕ(xi) · ϕ(xj)的值也依然是一个常数,那么是否存在这样一个函数K( xi · xj )= ϕ(xi) · ϕ(xj),有理论证明当这样的函数是存在的(Mercer定理已证明),我们将其称为核函数。
在此引出了支持向量机的第三个亮点:在不需要将样本映射到高维空间,而利用核函数解决非线性分类问题。
通过借助核函数就解决了我们的问题,当然不是什么函数都能作为核函数的,已经被证明的核函数并不多,而常用的核函数也就那么几个,接下来我们介绍下常见的几种核函数:
1)线性核函数
线性核函数很好理解,只能用来处理线性问题,其表达式如下:
因此我们可以将线性SVM和非线性SVM放在一起,只需要通过设定核函数和处理它们
2)多项式核函数
其中的a,c,d的值都是需要我们去通过调参设置的。
3)径向基核函数
径向基核函数也称为高斯核函数
参数较少,只需要自己去设置参数σ
4)Sigmoid核函数
K(x,y) = tanh (ax · z+ r)
需要设置调试的参数a,r,其中 tanh函数双曲正切函数,也被常用来作神经网络中的激活函数。
根据泰勒展开式,我们知道高阶可导的函数都可以用多项式函数表示,在这里径向基核函数和Sigmoid核函数都是高阶可导的,因此都可以用多项式来表述。换句话说,径向基核函数和Sigmoid核函数都是可以表述高阶多项式的,因此在选择核函数时,径向基核函数和Sigmoid核函数通常要比多项式核函数表现的要好,因为可以自动的去匹配阶数,而不需要我们去指定多项式核函数的阶数,此外多项式核函数需要调试的参数也比较多,因此通常选择径向基核函数。
6、总结
总的来说,在集成算法和神经网络风靡之前,SVM基本上是最好的分类算法,但即使在今天,它依然占有较高的地位。
SVM的主要优点有:
1)引入最大间隔,分类精确度高
2)在样本量较小时,也能准确的分类,并且具有不错的泛化能力
3)引入核函数,能轻松的解决非线性问题
4)能解决高维特征的分类、回归问题,即使特征维度大于样本的数据,也能有很好的表现
SVM的主要缺点有:
1)在样本量非常大时,核函数中內积的计算,求解拉格朗日乘子α值的计算都是和样本个数有关的,会导致在求解模型时的计算量过大
2)核函数的选择通常没有明确的指导,有时候难以选择一个合适的核函数,而且像多项式核函数,需要调试的参数也非常多
3)SVM对缺失数据敏感(好像很多算法都对缺失值敏感,对于缺失值,要么在特征工程时处理好,要么使用树模型)。