SVM知识点总结
1:几何间隔和函数间隔
假设叉号对应的点标签y=1,圈对应的点的标签y=0,我们可以得到一个分类界面能够将两类数据分开。当处理未知数据A,B,C的时候,很显然,判断A为y=1这一类的置信度(confident)应该比判断C为y=1这一类的置信度高,而B的置信度介于两者之间。因此,我们可以知道,如果某个点距离分类界面越远的话,预测结果的置信度越高。
函数间隔(functional margin)的定义如下:
当 y=1时(真实标签),如果wx+b足够大的话,那么整个函数间隔就足够大,说明预测是准确并且置信度很高(confident and correct),同理,如果y=-1时,预测结果wx+b为负数,并且足够大的话,函数间隔也大,代表置信度高的预测。
函数间隔能够用于衡量预测的置信度(confident of prediction),但是也存在一个问题,就是当缩放分类界面的参数w和b时,函数间隔会等比例的缩放,造成函数距离无意义的增加,为了解决这个问题,几何间隔定义如下:
我们定义一个集合S={x1,x2,...,xn}的函数距离为整个集合函数距离的最小值 :
2:最大距离分类器
如上面所说,如果一个分类器能够使得一个集合S的几何间隔(geometric margin)尽可能的大的话,那么该分类器对于集合S的判断的置信度越大,因此我们就希望找一个分类界面,能够最大化几何间隔。
因此,最初的目标函数如下:
其中||w||=1,所以几何间隔等于函数间隔,r代表函数间隔。因为r代表集合S的最小的函数间隔,因此其余所有节点的函数间隔都要大于r。
如果上面的式子能够直接优化的话,w,b结果就是我们最终的结果。但是||w||=1这个条件不好优化,因此将上面的式子转化为下面的形式:
任意缩放w,b不会导致集合距离改变,cs229课程笔记里面有一段话是这样说的:
通过缩放w和b,可以实现任意关于w的限制,因此,为了方便优化,我们通过缩放w,b,使得集合S的函数距离等于1,变为下面的形式:
上面的目标函数按理应该是max 1/||w||,和上面的目标函数是等价的。
3:目标函数求解
对于一个带约束的优化问题:
我们构造成如下形式:
如果我们求解上式的最优参数,如下:
我们可以得到下面的结果:
也就是说,最大化L的最优 解等价于f(w)的最优解,因此目标函数变为了:
当满足kkt条件的时候,下面的不等式取等号:
KKT条件如下:
使用KKT条件,我们可以得到:
因此优化目标变成了:
使用SMO算法能够得到最优的α,此时w,b, α都得到了。现在看一下分类界面的形式:
当给我们一个新的样本点x的时候,我们计算x与其余点的内积得到wx+b的结果,如果大于0,那么我们判断y=1,小于0我们判断y=-1。又因为,通过KKT条件我们知道,α*g(x)=0,因为除了支持向量(wx+b=1)外,其余点wx+b>1,因此g(x)>0,因此 这些点的α等于0,因此当给一个新的样本点的时候,我们只需要计算它和支持向量的内积,使用上式就能求得wx+b的结果。
4:改进
为了使得分类器对于一些异常点(outlier)能够有比较好的处理,对原始的目标函数进行如下优化:
对w,b求偏导等于0之后
使用同样的方法对上式进行优化,可以得到分类界面的参数。
使用核函数(kernel method)可以增强SVM对于线性不可分的数据的分类能力,那么如何选择kernel method?我认为,因为不同的核函数,实际上对应的是不同的映射函数,比如说多项式核对应下面的映射函数:
下面的多项式核对应另外一种映射函数:
高斯核对应一个无穷维度的映射函数:
那到底怎么选择合适的核函数呢,下面是https://www.quora.com/How-do-I-select-SVM-kernels中的解答,我认为说的比较好,1:高斯核使用的是欧氏距离作为相似度度量形式,而其他的核函数,比如说线性核,多项式核等等,使用的是内积作为相似度度量形式,因此,如果我们事先知道使用哪种相似度函数进行度量比较好的话,我们就可以选择不同的核函数,比如说hash编码一般使用汉明距离进行度量,而汉明距离和内积成反比,因此使用线性核,多项式核等可能会有比较好的结果;
2:高斯核具有平移不变性(translation incariance),并且是归一化的(K(x,x)=1),因此从很多情况中得出高斯核一般是效果最好的;
3:对于一个特定的问题怎么选择适当的核函数,还是需要尝试不同的核函数,然后选择效果最好的;
高斯核实际上衡量的是新来的数据和每个样本的距离,c=0的多项式核(如上)使用任意两个维度的积作为新的特征。
吴恩达的机器学习课程上对于如何选择核函数有一些经验:
假设N代表数据维度,M代表样本个数:
1:当N很大,M小的时候:因为N很大,M很小,因此我们希望模型尽可能的简单,因为我们没有足够多的数据可以用来训练模型,因此直接使用线性核:(也就是不使用核函数,直接使用内积)。
2: 当N比较小,M比较大的时候,可以使用高斯核来增加非线性可分性。在使用高斯核之前,一般需要进行归一化,使得不同维度之间具有相近的scale.
使用逻辑回归和不带核函数的SVM的一个区别就是,SVM是比较耗时的,当M比较大的时候,计算的复杂度很大。SVM和神经网络的区别就是,SVM一般解决的是一个凸优化问题,因此通常都能达到全局最优解,而神经网络可能会陷入局部最优问题。
6:SVM的另一种形式
上面的最小化式子也是SVM的一种目标函数,Andrew Ng在说的是,这个式子是从逻辑回归转化过来的,我想说的主要有一下四点:
1:在逻辑回归中,后面的正则化项的目的是为了防止过拟合发生,在SVM中,通过前面的公式我们可以知道,后面的关于θ的正则化项实际上是为了保证几何间隔更大,使得分类界面更好,实际上这也是一种防止过拟合的情况,因为分类界面的几何间隔小的话,对于未知的样本来说,效果本来就可能很差;
2:上面的式子和我们使用拉格朗日构造的min max L形式上不一样,实际上是共通的,因为max L如果满足的话,也就是说所有的条件都满足的话,该式子可以写成上图蓝色部分的形式,和上面推导的公式就吻合了;
3:这里的C实际上目的是控制几何间隔(正则化项)和正确分类的权重,如果C设置很大的话,那么目标函数就侧重与保证所有样本正确分类,如果设置的小的话,就保证几何间隔尽可能的大,因此可以出现一些错分的情况;
4:上面的SVM形式没有保证所有样本都被正确分类,而前面的使用KKT条件求解的参数,是保证了所有样本都正确分类。
这是SVM的另一种表现形式,提供了另一种理解,当xi在θ方向上的投影比较小的时候,||θ|| 就比较大。这和几何间隔的结论一致,几何间隔等于r/||θ||,||θ||越小的话,几何间隔越大,分类界面越好。
https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation里面有一个SVM分类的小例子。使用scikit-learn的SVM模型需要指定C以及核函数,如果是高斯核,还需要设定方差。