SVM的原理是什么?
支持向量机(Support Vecor Machine,SVM)是既可以解决线性问题又可以解决非线性问题,既可以用于分类,又可以用于回归的经典算法。它的基本模型是在特征空间中寻找间隔最大化的分离超平面,使距离最近的样本点到该超平面的距离尽可能的远。(间隔最大使它有别于感知机)
SVM为什么采用间隔最大化?
为什么要将求解SVM的原始问题转换为其对偶问题?
SVM算法优缺点总结:
SVM和LR的异同点
为什么SVM要引入核函数?
当样本在原始空间线性不可分时,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。
令ϕ(x)表示将x映射后的特征向量,于是在特征空间中划分超平面所对应的模型可表示为:
优化的目标函数为:
其对偶问题为:
求解上式涉及到计算 ,这是样本xi与xj映射到特征空间之后的内积。由于特征空间维数可能很高,甚至可能是无穷维,因此直接计算 通常是困难的,为了避开这个障碍,可以设想这样一个函数:
即xi与xj在特征空间的内积等于它们在原始样本空间中通过函数K(·,·)计算的结果.有了这样的函数,我们就不必直接去计算高维甚至无穷维特征空间中的内积,于是对偶问题可重写为:
SVM常用核函数:
SVM 核函数之间的区别:
一般选择线性核和高斯核( RBF 核)。
一般通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。 如果特征的数量很大,跟样本数量差不多,选用线性核的 SVM。 如果特征的数量比较小,样本数量一般,选用高斯核的 SVM。
为什么SVM对缺失数据敏感?
SVM希望样本在特征空间中线性可分,所以特征空间的好坏对SVM的性能很重要,缺失特征数据将影响超平面距离的度量,进一步会影响训练结果的好坏。
SVM如何处理多分类问题?
直接法,直接在目标函数上修改,将多个分类面的参数求解合并到一个最优化问题里面(计算量非常大)。
间接法:对训练器进行组合。其中比较典型的有一对一(OVO),和一对多(OVR)。
一对多:将二分类学习器的两类设定为目标类为一类,其余类为另外一类,针对k个类可以训练出k个分类器,当有一个新的样本来的时候,用这k个分类器来测试,那个分类器的概率高,那么这个样本就属于哪一类。效果不太好,bias比较高。
一对一:对任意两个类训练出一个分类器,如果有k类,一共训练出C(2,k) 个分类器,当有一个新样本时,用这C(2,k) 个分类器来预测,每当被判定属于某一类的时候,该类就加一,最后票数最多的类别被认定为该样本的类。
SVM是用的是哪个库?Sklearn中的SVM都有什么参数可以调节?
采用sklearn.svm.SVC设置的参数。SVC函数的训练时间是随训练样本平方级增长,所以不适合超过10000的样本。对于多分类问题,SVC采用的是one-vs-one投票机制,需要两两类别建立分类器,训练时间可能比较长。
sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)
主要调节的参数有:C、kernel、degree、gamma、coef0:
感知机的模型就是尝试找到一条直线(超平面),能够把二元数据隔离开。对于这个分离的超平面,我们定义为,如下图。定义在该超平面上方的点y=1 ,在该超平面下方的点y=−1。可以看出满足这个条件的超平面并不止一个。那么这么多的可以分类的超平面,哪个是最好的呢?哪个是泛化能力最强的呢?
感知机模型的损失函数优化的思想是让所有误分类的点(定义为M)到超平面的距离和最小,即最小化下式:
当w和b成比例的增加,比如,当分子的w和b扩大N倍时,分母的L2范数也会扩大N倍。也就是说,分子和分母有固定的倍数关系。那么我们可以固定分子或者分母为1,然后求另一个即分子自己或者分母的倒数的最小化作为损失函数,这样可以简化损失函数。在感知机模型中,我们采用的是保留分子,固定分母,即最终感知机模型的损失函数为:
在感知机模型中,我们可以找到多个可以分类的超平面将数据分开,并且优化时希望所有的点都离超平面远。但是实际上离超平面很远的点已经被正确分类,我们让它离超平面更远并没有意义。反而我们最关心是那些离超平面很近的点,这些点很容易被误分类,如果我们可以让离超平面比较近的点尽可能的远离超平面,那么我们的分类效果会好一些。
如下图所示,分离超平面为=0 ,如果所有的样本不光可以被超平面分开,还和超平面保持一定的函数距离(下图函数距离为1),那么这样的分类超平面是比感知机的分类超平面优的。可以证明,这样的超平面只有一个。和超平面平行的保持一定的函数距离的这两个超平面对应的向量,我们定义为支持向量,如下图虚线所示。
有时候本来数据的确是可分的,也就是说可以用线性分类SVM的学习方法来求解,但是却因为混入了异常点,导致不能线性可分,比如下图1,另外一种情况虽线性可分,但是会严重影响我们模型的泛化预测效果,如下图2,如果不考虑异常点,SVM的超平面应该是下图中的红色线所示,但是由于有一个蓝色的异常点,导致我们学习到的超平面是图中的粗虚线所示,这样会严重影响分类模型预测效果。
如何解决这些问题呢?SVM引入了软间隔最大化的方法来解决。
回顾下硬间隔最大化的条件:
和线性可分SVM的优化方式类似,我们首先将软间隔最大化的约束问题用拉格朗日函数转化为无约束问题如下:
利用上面的三个式子去消除w和b。
线性支持向量机还有另外一种解释如下:
线性可分SVM通过软间隔最大化,可以解决线性数据集带有异常点时的分类处理,但是现实生活中的确有很多数据不是线性可分的,这些线性不可分的数据也不是去掉异常点就能处理这么简单。SVM通过引入核函数可以处理这样的情况。
多项式回归转化为线性回归:
也就是说,对于二维的不是线性的数据,将其映射到了五维以后,就变成了线性的数据。对于在低维线性不可分的数据,在映射到了高维以后,就变成线性可分的了。
求解上式涉及到计算样本映射到特征空间之后的内积。由于特征空间维数可能很高,甚至可能是无穷维,因此直接计算此内积是困难的。但可假想有这样一个函数:
K(x,z)的计算是在低维特征空间来计算的,它避免了在高维维度空间计算内积的巨大计算量。总结下线性不可分时核函数的引入过程:
遇到线性不可分的样例时,常用做法是把样例特征映射到高维空间中去(如多项式回归)但是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到令人恐怖的。此时,可以引入核函数,核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数好在它在低维上进行计算,而将实质上的分类效果(利用了内积)表现在了高维上,这样避免了直接在高维空间中的复杂计算,真正解决了SVM线性不可分的问题。
对于从低维到高维的映射,核函数不止一个。那么什么样的函数才可以当做核函数呢?对于任意的对应的Gram矩阵是半正定矩阵,则K(x,z)是正定核函数。
SMO算法关系到,我们如何求出优化函数极小化时候的α∗,进而求出w,b我们将在下一篇讨论这个问题。
如下图所示,在蓝色条带里面的点都是没有损失的,但是外面的点的是有损失的,损失大小为红色线的长度。
总结下,我们的SVM回归模型的损失函数度量为:
上一节我们已经得到了我们的损失函数的度量,现在可以可以定义我们的目标函数如下:
上一节我们讲到了SVM回归模型的目标函数的原始形式,我们的目标是
看似很复杂,其实消除过程和系列第一篇第二篇文章类似,由于式子实在是冗长,这里我就不写出推导过程了,最终得到的对偶形式为: