距离知识
点到直线/平面的距离公式:
1、假定点p(x0,y0),平面方程为f(x,y)=Ax+By+C,那么点p到平面f(x)的距离为:
2、从三维空间扩展到多维空间中,如果存在一个超平面f(X)=θX+b; 那么某一个点X0到这个超平面的距离为:
参考文献:https://wenku.baidu.com/view/d26d2ba39e31433239689374.html
感知器模型
感知器算法是最古老的分类算法之一,原理比较简单,不过模型的分类泛化能力比较弱,不过感知器模型是SVM、神经网络、深度学习等算法的基础。
感知器的思想很简单:比如有很多的学员生,分为男学生和女学生,感知器模型就是试图找到一条直线,能够把所有的男学生和女学生分隔开,如果是高维空间中,感知器模型寻找的就是一个超平面,能够把所有的二元类别分割开。感知器模型的前提是:数据是线性可分的。
对于m个样本,每个样本n维特征以及一个二元类别输出y,如下:
目标是找到一个超平面,即:
让一个类别的样本满足: ;另外一个类别的满足:。感知器模型为:
正确分类: ,错误分类: ;所以我们可以定义我们的损害函数为:期望使分类错误的所有样本(m条样本)到超平面的距离之和最小。
因为此时分子和分母中都包含了θ值,当分子扩大N倍的时候,分母也会随之扩大,也就是说分子和分母之间存在倍数关系,所以可以固定分子或者分母为1,然后求另一个即分子或者分母的倒数的最小化作为损失函数,简化后的损失函数为(分母为1)
:
直接使用梯度下降法就可以对损失函数求解,不过由于这里的m是分类错误的样本点集合,不是固定的,所以我们不能使用批量梯度下降法(BGD)求解,只能使用随机梯度下降(SGD)或者小批量梯度下降(MBGD);一般在感知器模型中使用SGD来求解。
SVM
支持向量机(Support Vecor Machine, SVM)本身是一个二元分类算法,是对感知器算法模型的一种扩展,现在的SVM算法支持线性分类和非线性分类的分类应用,并且也能够直接将SVM应用于回归应用中,同时通过OvR或者OvO的方式我们也可以将SVM应用在多元分类领域中。在不考虑集成学习算法,不考虑特定的数据集的时候,在分类算法中SVM可以说是特别优秀的。
线性可分SVM
在感知器模型中,算法是在数据中找出一个划分超平面,让尽可能多的数据分布在这个平面的两侧,从而达到分类的效果,但是在实际数据中这个符合我们要求的超平面是可能存在多个的。
在感知器模型中,可以找到多个可以分类的超平面将数据分开,并且优化时希望所有的点都离超平面尽可能的远,但是实际上离超平面足够远的点基本上都是被正确分类的,所以这个是没有意义的;反而比较关心那些离超平面很近的点,这些点比较容易分错。所以说我们只要让离超平面比较近的点尽可能的远离这个超平面。
- 线性可分(Linearly Separable):在数据集中,如果可以找出一个超平面,将两组数据分开,那么这个数据集叫做线性可分数据。
- 线性不可分(Linear Inseparable):在数据集中,没法找出一个超平面,能够将两组数据分开,那么这个数据集就叫做线性不可分数据。
- 分割超平面(Separating Hyperplane):将数据集分割开来的直线/平面叫做分割超平面。
- 间隔(Margin):数据点到分割超平面的距离称为间隔。
- 支持向量(Support Vector):离分割超平面最近的那些点叫做支持向量。
支持向量到超平面的距离为:
备注:在SVM中支持向量到超平面的函数距离一般设置为1。
SVM模型是让所有的分类点在各自类别的支持向量的两边,同时要求支持向量尽可能的原理这个超平面,用数学公式表示如下:
将上式子优化为SVM的损失函数为:
将此时的目标函数和约束条件使用KKT条件转换为拉格朗日函数,从而转换为无约束的优化函数。
引入拉格朗日乘子后,优化目标变成:
根据拉格朗日对偶化特性,将该优化目标转换为等价的对偶问题来求解,从而优化目标变成:
所以对于该优化函数而言,可以先求优化函数对于w和b的极小值,然后再求解对于拉格朗日乘子β的极大值。
首先求让函数L极小化的时候w和b的取值,这个极值可以直接通过对函数L分别求w和b的偏导数得到:
将求解出来的w和b带入优化函数L中,定义优化之后的函数如下:
通过对w、b极小化后,我们最终得到的优化函数只和β有关,所以此时我们可以直接极大化我们的优化函数,得到β的值,从而可以最终得到w和b的值。
假设存在最优解β*; 根据w、b和β的关系,可以分别计算出对应的w值和b值(一般使用所有支持向量的计算均值来作为实际的b值);
这里的(xs,ys)即支持向量,根据KKT条件中的对偶互补条件(松弛条件约束),支持向量必须满足一下公式:
2.1.1 算法流程
输入线性可分的m个样本数据{(x1,y1),(x2,y2),…,(xm,ym)},其中x为n维的特征向量,y为二元输出,取值为+1或者-1;SVM模型输出为参数w、b以及分类决策函数。
构造约束优化问题;
使用SMO算法求出上式优化中对应的最优解β*;
找出所有的支持向量集合S;
更新参数w*、b*的值;
构建最终的分类器。
算法总结
- 要求数据必须是线性可分的;
- 纯线性可分的SVM模型对于异常数据的预测可能会不太准;
- 对于线性可分的数据,SVM分类器的效果非常不错。
2.2 SVM的软间隔模型
线性可分SVM中要求数据必须是线性可分的,才可以找到分类的超平面,但是有的时候线性数据集中存在少量的异常点,由于这些异常点导致了数据集不能够线性划分;直白来讲就是:正常数据本身是线性可分的,但是由于存在异常点数据,导致数据集不能够线性可分;
如果线性数据中存在异常点导致没法直接使用SVM线性分割模型的时候,可以通过引入软间隔的概念来解决这个问题;
硬间隔:可以认为线性划分SVM中的距离度量就是硬间隔,在线性划分SVM中,要求函数距离一定是大于1的,最大化硬间隔条件为:
软间隔:SVM对于训练集中的每个样本都引入一个松弛因子(ξ),使得函数距离加上松弛因子后的值是大于等于1;这表示相对于硬间隔,对样本到超平面距离的要求放松了。
松弛因子(ξ)越大,表示样本点离超平面越近,如果松弛因子大于1,那么表示允许该样本点分错,所以说加入松弛因子是有成本的,过大的松弛因子可能会导致模型分类错误,所以最终的目标函数就转换成为:
备注:函数中的C>0是惩罚参数,是一个超参数,类似L1/L2 norm的参数;C越大表示对误分类的惩罚越大,C越小表示对误分类的惩罚越小;C值的给定需要调参。
同线性可分SVM,构造软间隔最大化的约束问题对应的拉格朗日函数如下:
从而将我们的优化目标函数转换为:
优化目标同样满足KKT条件,所以使用拉格朗日对偶将优化问题转换为等价的对偶问题:
先求优化函数对于w、b、ξ的极小值,这个可以通过分别对优化函数L求w、b、ξ的偏导数得,从而可以得到w、b、ξ关于β和μ之间的关系。
将w、b、ξ的值带入L函数中,就可以消去优化函数中的w、b、ξ,定义优化之后的函数如下:
最终优化后的目标函数/损失函数和线性可分SVM模型基本一样,除了约束条件不同而已, 也就是说也可以使用SMO算法来求解。
在硬间隔最大化的时候,支持向量比较简单,就是离超平面的函数距离为1的样本点就是支持向量。
在软间隔中,根据KKT条件中的对偶互补条件: β(y(wx+b)-1+ξ)=0,从而有:当0<β i ≤C的时候,并且ξ i =0的样本点均是支持向量(即所有的0<β i <C)。即满足|wx+b|=1的所有样本均是支持向量。
备注:软间隔和硬间隔中的支持向量的规则是一样的;
算法流程
输入线性可分的m个样本数据{(x1,y1),(x2,y2),…,(xm,ym)},其中x为n维的特征向量,y为二元输出,取值为+1或者-1;SVM模型输出为参数w、b以及分类决策函数。
选择一个惩罚系数C>0,构造约束优化问题;
使用SMO算法求出上式优化中对应的最优解β*;
找出所有的支持向量集合S;
更新参数w*、b*的值;
构建最终的分类器。
算法总结
- 可以解决线性数据中携带异常点的分类模型构建的问题;
- 通过引入惩罚项系数(松弛因子),可以增加模型的泛化能力,即鲁棒性;
- 如果给定的惩罚项系数越小,表示在模型构建的时候,就允许存在越多的分类错误的样本, 也就表示此时模型的准确率会比较低;如果惩罚项系数越大,表示在模型构建的时候,就越不允许存在分类错误的样本,也就表示此时模型的准确率会比较高。
非线性可分SVM
不管是线性可分SVM还是加入惩罚系数后的软间隔线性可分SVM其实都要求数 据本身是线性可分的,对于完全不可以线性可分的数据,这两种算法模型就没法 解决这个问题了。
在线性回归中,我们可以通过多项式扩展将低维度的数据扩展成为高维度的数据,从而可以使用线性回归模型来解决问题。 也就是说对于二维空间中不是线性可分的数据,将其映射到高维空间中后,变成了线性可分的数据。
结合多项式回归在处理非线性可分数据时候的作用,在SVM的线性不可分的数据上,如果将数据映射到高维空间中,那么数据就会变成线性可分的,从而就可以使用线性可分SVM模型或者软间隔线性可分SVM模型。
也就是说,对于线性不可分SVM模型来讲,重点在于低维特征数据到高维特征数据之间的映射。
定义一个从低维特征空间到高维特征空间的映射函数Ф,非线性可分SVM的优化目标函数:
可以看到的是,只需要将原来的低维空间中的两个向量的点积转换为高维空间中两个向量的点积即可。
这样一来问题就解决了吗?似乎是的:拿到非线性数据,就找一个映射,然后一股脑把原来的数据映射到新空间中,再做线性 SVM 即可。不过事实上没有这么简单!其实刚才的方法稍想一下就会发现有问题:在最初的例子里做了一个二阶多项式的转换,对一个二维空间做映射,选择的新空间是原始空间的所有一阶和二阶的组合,得到了5个维度;如果原始空间是三维,那么我们会得到9维的新空间;如果原始空间是n维,那么我们会得到一个n(n+3)/2维的新空间;这个数目是呈爆炸性增长的,这给计算带来了非常大的困难,而且如果遇到无穷维的情况, 就根本无从计算。
核函数
假设函数Ф是一个从低维特征空间到高维特征空间的一个映射,那么如果存在函数K(x,z), 对于任意的低维特征向量x和z,都有:
称函数K(x,z)为核函数(kernal function);
核函数:在低维空间上的计算量等价于特征做维度扩展后的点乘的结果。
核函数在解决线性不可分问题的时候,采取的方式是:使用低维特征空间上的计算来避免在高维特征空间中向量内积的恐怖计算量;也就是说此时SVM模型可以应用在高维特征空间中数据可线性分割的优点,同时又避免了引入这个高维特征空间恐怖的内积计算量。
即:用低维空间中少的内积的计算量来让模型具有高维空间中的线性可分的优点。
不妨还是从最开始的简单例子出发,设两个向量
而即是到前面说的五维空间的映射,因此映射过后的内积为:
而同时我们可以发现有一下公式:
可以发现两者之间非常相似,所以我们只要乘上一个相关的系数,就可以让这两个式子的值相等,这样不就将五维空间的一个内积转换为两维空间的内积的运算。
现有有两个两维的向量,进行二阶多项式扩展,然后进行内积计算,这个时候映射高维后计算的计算量为:11次乘法+4次加法;采用近似计算的计算量为:3次乘法+2次加法;采用加系数后的近似计算的计算量为:4次乘法+2次加法;
线性核函数(Linear Kernel):
多项式核函数(Polynomial Kernel):其中γ、r、d属于超参,需要调参定义;
高斯核函数(Gaussian Kernel):其中γ属于超参,要求大于0,需要调参定义;
Sigmoid核函数(Sigmoid Kernel):其中γ、r属于超参,需要调参定义;
核函数总结
核函数可以自定义;核函数必须是正定核函数,即Gram矩阵是半正定矩阵;
核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算;
通过核函数,可以将非线性可分的数据转换为线性可分数据;
核函数的优先选择
- 分类:线性核函数、多项式核函数(poly)、高斯核函数(rbf)
- 回归:高斯核函数
高斯核公式证明(扩展)
令z=x;那么进行多维变换后,应该是同一个向量,从而可以得到以下公式:
SMO
序列最小优化算法(Sequential minimal optimization, SMO)是一种用于解决 SVM训练过程中所产生的优化问题的算法。 于1998年由John Platt发明
假定存在一个β* =(β1 ,β2 ,...,βm)是我们最终的最优解,那么根据KKT条件我们可以 计算出w和b的最优解,如下:
进而我们可以得到最终的分离超平面为:
拉格朗日乘子法和KKT的对偶互补条件为:
β、μ和C之间的关系为:
根据这个对偶互补条件,我们有如下关系式:
也就是说我们找出的最优的分割超平面必须满足下列的目标条件(g(x)):
拉格朗日对偶化要求的两个限制的初始条件为:
从而可以得到解决问题的思路如下:
- 首先,初始化后一个β值,让它满足对偶问题的两个初始限制条件;
- 然后不断优化这个β值,使得由它确定的分割超平面满足g(x)目标条件;而且在优化过程中,始终保证β值满足初始限制条件。
- 备注:这个求解过程中,和传统的思路不太一样,不是对目标函数求最小值,而是 让g(x)目标条件尽可能的满足。
在这样一个过程中,到底如何优化这个β值呢???整理可以发现β值的优化必 须遵循以下两个基本原则:
- 每次优化的时候,必须同时优化β的两个分量;因为如果只优化一个分量的话,新的β值就没法满足初始限制条件中的等式约束条件了。
- 每次优化的两个分量应该是违反g(x)目标条件比较多的。也就是说,本来应当是大于等于1的,越是小于1违反g(x)目标条件就越多。
或者换一种思路来理解,因为目标函数中存在m个变量,直接优化比较难,利用启发式的方法/EM算法的思想,每次优化的时候,只优化两个变量,将其它的变量看成常数项,这样SMO算法就将一个复杂的优化算法转换为一个比较简单的两变量优化问题了。
认为β1、β2是变量,其它β值是常量,从而将目标函数转换如下(C是常数项):
由于β1y1 + β2y2 = k ,并且y1=1或者-1,也就是我们使用β2来表示β1的值:
将上式带入目标优化函数,就可以消去β1,从而只留下仅仅包含β2的式子。
考虑β1和β2的取值限定范围,假定新求出来的β值是满足我们的边界限制的,即 如下所示:
当y1=y2的时候,β1+β2=k; 由于β的限制条件,我们可以得到:
当y1≠y2的时候,β1 - β2=k; 由于β的限制条件,我们可以得到:
结合β的取值限制范围以及函数W的β最优解,我们可以得带迭代过程中的最优 解为:
然后根据β1和β2的关系,从而可以得到迭代后的β1的值:
求解β的过程中,相关公式如下:
可以发现SMO算法中,是选择两个合适的β变量做迭代,其它变量作为常量来进 行优化的一个过程,那么这两个变量到底怎么选择呢???
- 每次优化的时候,必须同时优化β的两个分量;因为如果只优化一个分量的话,新的β值就没法满足初始限制条件中的等式约束条件了。
- 每次优化的两个分量应该是违反g(x)目标条件比较多的。也就是说,本来应当是大于等于1的,越是小于1违反g(x)目标条件就越多。
第一个β变量的选择
SMO算法在选择第一个β变量的时候,需要选择在训练集上违反KKT条件最严重的样本点。一般情况下,先选择0<β<C的样本点(即支持向量),只有当所有的支持向量都满足KKT条件的时候,才会选择其它样本点。因为此时违反KKT条件越严重,在经过一次优化后,会让变量β尽可能的发生变化,从而可以以更少的迭代次数让模型达到g(x)目标条件。
在选择第一个变量β1后,在选择第二个变量β2的时候,希望能够按照优化后的β1和β2有尽可能多的改变来选择,也就是说让|E1-E2 |足够的大,当E1为正的时候, 选择最小的Ei作为E2;当E1为负的时候,选择最大的Ei作为E2。
备注:如果选择的第二个变量不能够让目标函数有足够的下降,那么可以通过遍历所有样本点来作为β2,直到目标函数有足够的下降,如果都没有足够的下降的话,那么直接跳出循环,重新选择β1;
在每次完成两个β变量的优化更新之后,需要重新计算阈值b和差值Ei。当0<β1new<C时,有:
化简可得:
计算阈值b和差值Ei
同样的当β2的取值为: 0<β2<C的时候,我们也可以得到:
最终计算出来的b为:
当更新计算阈值b后,就可以得到差值Ei为:
SMO算法流程总结
输入线性可分的m个样本数据{(x1 ,y1,(x2 ,y2),...,(xm ,ym)},其中x为n维的特征向量, y为二元输出,取值为+1或者-1;精度为e。
- 取初值β0=0,k=0;
- 选择需要进行更新的两个变量: β1k和β2k ,计算出来新的β2new,unt;
- 按照下列式子求出具体的β2k+1;
- 按照 β1k和β2k的关系,求出β1k+1的值:
- 按照公式计算bk+1和Ei的值;
- 检查函数y(i)*Ei的绝对值是否在精度范围内,并且求解出来的β解满足KKT相关约束条件,那么此时结束循环,返回此时的β解即可,否则继续迭代计算β2new,unt的值。
SVR
SVM和决策树一样,可以将模型直接应用到回归问题中;在SVM的分类模型 (SVC)中,目标函数和限制条件如下:
在SVR中,目的是为了尽量拟合一个线性模型y=wx+b;从而我们可以定义常量eps>0,对于任意一点(x,y),如果|y-wx-b|≤eps,那么认为没有损失,从而我们可以得到目标函数和限制条件如下:
加入松弛因子ξ>0,从而我们的目标函数和限制条件变成:
构造拉格朗日函数:
拉格朗日函数对偶化
首先来求优化函数对于w、b、ξ的极小值,通过求导可得:
将w、b、ξ的值带入函数L中,就可以将L转换为只包含β的函数,从而我们可以得到最终的优化目标函数为(备注:对于β的求解照样可以使用SMO算法来求解):
分类算法模型的选择方式
比较逻辑回归、KNN、决策树、随机森林、GBDT、Adaboost、SVM等分类算 法的效果,数据集使用sklearn自带的模拟数据进行测试。
我们首先看数据量,如果数据量多,那使用简单算法(eg: KNN、Logtistic);如果数据量少,首先使用简单执行速度快的算法(Logitsic回归、LinearSVC、决策树),然后如果基础算法效果不好,那么考虑集成算法或者SVC(rbf)。