笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。
我的公众号为:livandata
Ø 在对复杂的数据进行分类的时候,如果维度过高,数据分布过于复杂,往往很难用一个超平面将所有数据切分开,此时需要将低纬度的数据,投射到高纬度上;
高纬度上的数据能够通过一个超平面划分出一个个的类别;
此时需要计算的即为这个超平面;
由于这个超平面的运算非常复杂,需要有一个简单运算的方法,于是用到了核函数;
核函数能够将高维度上的数据转换到低纬度,并进行计算,运算的结果与高纬度一致;
Ø 步骤:
一、低纬度为n的数据,通过变换函数t转换到高维m+n维上;
二、在高纬度上数据可以通过一个超平面f(x)=wx+b实现分类,分类的方法为:F(X)=sign(f(x));
三、超平面的计算主要是假设存在一个超平面,求这个平面与其他点的最大间隔,用到||w||平方求最小值,确定超平面的参数;
四、在计算这个分类器的时候,为简化运算,寻找一个核函数,将f(x)转换到低纬度,使低纬度的向量值=高纬度的f(x);
五、运算之后的F(X)即为SVM构建的分类器;
Ø 主要有三个地方需要注意:
一、低维到高维的变换函数t;
二、高维超平面函数的构建;
三、通过核函数,实现超平面向量的计算;
推导过程为:
一、对于能够进行线性切分的数据,假设存在一个平面能够将数据切分开,这个超平面可以用分类函数表示,当f(x) 等于0的时候,x便是位于超平面上的点,而f(x)大于0的点对应 y=1 的数据点,f(x)小于0的点对应y=-1的点,如下图所示:
二、在超平面w*x+b=0确定的情况下,|w*x+b|能够表示点x到距离超平面的远近,而通过观察w*x+b的符号与类标记y的符号是否一致可判断分类是否正确,因此引发出函数间隔概念:
但是这个间隔值会随着w和b的变化而变化,因此需要引入几何间隔,即:
从这一公式可以看出:几何间隔就是函数间隔除以||w||,而且函数间隔y*(wx+b) = y*f(x)实际上就是|f(x)|,只是人为定义的一个间隔度量,而几何间隔|f(x)|/||w||才是直观上的点到超平面的距离。
于是最大间隔分类器(maximum margin classifier)的目标函数可以定义为:
同时需满足一些条件,根据间隔的定义,有作为条件, 为了方便运算可以另函数间隔为1,则有 = 1 / ||w||且
,从而上述目标函数转化成了:
相当于在相应的约束条件下,最大化这个1/||w||值,而1/||w||便是几何间隔。
三、由上面的推论可以得到优化的目标函数为:
由于求的最大值相当于求
的最小值,所以上述目标函数等价于(w由分母变成分子,从而也有原来的max问题变为min问题,很明显,两者问题等价):
在求解上面函数的最优解的过程中,需要用到拉格朗日对偶法进行计算,即将约束条件通过一个参数结合成一个完整的函数:
然后令:
在要求约束条件得到满足的情况下最小化,实际上等价于直接最小化
(当然,这里也有约束条件,就是≥0,i=1,…,n),因为如果约束条件没有得到满足,
会等于无穷大,自然不会是我们所要求的最小值。
具体写出来,目标函数变成了:
这里用表示这个问题的最优值,且和最初的问题是等价的。如果直接求解,那么一上来便得面对w和b两个参数,而又是不等式约束,这个求解过程不好做。不妨把最小和最大的位置交换一下,变成:
交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用来表示。而且有
≤
,在满足某些条件的情况下,这两者相等,这个时候就可以通过求解对偶问题来间接地求解原始问题。
换言之,之所以从minmax的原始问题,转化为maxmin的对偶问题
,一者因为
是
的近似解,二者,转化为对偶问题后,更容易求解。
下面可以先求L 对w、b的极小,再求L 对的极大。
四、对上述函数的求解需要用到KKT条件,此时需要先了解KKT条件:
一般地,一个最优化数学模型能够表示成下列标准形式:
其中,f(x)是需要最小化的函数,h(x)是等式约束,g(x)是不等式约束,p和q分别为等式约束和不等式约束的数量。
同时,得明白以下两点:
凸优化的概念: 为一凸集,
为一凸函数。凸优化就是要找出一点
,使得每一
满足
。
KKT条件的意义:
它是一个非线性规划(Nonlinear Programming)问题能有最优化解法的必要和充分条件。
而KKT条件就是指上面最优化数学模型的标准形式中的最小点 x* 必须满足下面的条件:
经过论证,我们这里的问题是满足 KKT 条件的(首先已经满足Slater条件,再者f和gi也都是可微的,即L对w和b都可导),因此现在我们便转化为求解第二个问题。
也就是说,原始问题通过满足KKT条件,已经转化成了对偶问题。而求解这个对偶学习问题,分为3个步骤:首先要让L(w,b,a) 关于 w 和 b 最小化,然后求对的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子。
五、对偶问题的求解需要有三个步骤:
(1)、首先固定,要让 L 关于 w 和 b 最小化,我们分别对w,b求偏导数,即令 ∂L/∂w 和 ∂L/∂b 等于零:
将以上结果代入之前的L:
得到:
从上面的最后一个式子,我们可以看出,此时的拉格朗日函数只包含了一个变量,那就是(求出了
便能求出w和b,由此可见,上文第1.2节提出来的核心问题:分类函数
也就可以轻而易举的求出来了)。
(2)、求对的极大,即是关于对偶问题的最优化问题。经过上面第一个步骤的求w和b,得到的拉格朗日函数式子已经没有了变量w,b,只有
。从上面的式子得到:
这样,求出了,根据
,即可求出w,然后通过
,即可求出b,最终得出分离超平面和分类决策函数。
(3)、在求得L(w, b, a) 关于 w 和 b 最小化,以及对的极大之后,最后一步则可以利用SMO算法求解对偶问题中的拉格朗日乘子
。
上述式子要解决的是在参数上求最大值W的问题,至于
和
都是已知数。对于SMO算法可得:
等价于求解:
具体的计算步骤为:
第一步:选取一对和
,选取方法使用启发式方法;
第二步,固定除和
之外的其他参数,确定W极值条件下的
,
由
表示。
假定在某一次迭代中,需要更新,
对应的拉格朗日乘子
,
那么这个小规模的二次规划问题写为:
知道了如何更新乘子,那么选取哪些乘子进行更新呢?具体选择方法有以下两个步骤:
步骤1:先“扫描”所有乘子,把第一个违反KKT条件的作为更新对象,令为a1;
步骤2:在所有不违反KKT条件的乘子中,选择使|E1 −E2|最大的a2进行更新,使得能最大限度增大目标函数的值(类似于梯度下降. 此外,而
,求出来的E代表函数ui对输入xi的预测值与真实输出类标记yi之差)。
最后,每次更新完两个乘子的优化后,都需要再重新计算b,及对应的Ei值。
六、对于线性不可分的情况只需要做以下的变更:
对于一个数据点 x 进行分类,实际上是通过把 x 带入到算出结果然后根据其正负号来进行类别划分的。前面的推导中我们得到
;
因此线性数据的分类函数为:
这里的形式的有趣之处在于,对于新点 x的预测,只需要计算它与训练数据点的内积即可(表示向量内积),但是在非线性的数据中,如果进行非线性处理,则需要进行转换,上面的内积运算需要经过核函数转换,然后才可以使用,即:
为我们讨论的核函数,核函数的目标是将低维的非线性数据,转化到高维的线性数据,经过这样的转换也可以实现SVM的分类,但是随之而来的即为维度灾难的问题,由于这一运算会导致数据的无限上升,因此需要一个方式来降维运算,此时核函数的第二个功能就显示出来了。
可以定义核函数的内积为如下公式:
而这一公式可以进行相应的变换,为:K(x,z)=f(<x,z>)
比如用到线性核的函数,可以变换为:
而对应的上式也可以变化为:
此公式即为运算的过程,将低维的数据带入到上面的核函数(K(x,z))中,通过训练数据集来实现分类训练,然后调整分类器的参数。
对应的高斯核为:这个核就是最开始提到过的会将原始空间映射为无穷维空间的那个家伙。不过,如果
选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果
选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数
,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。
如何选择核函数:
Ø 如果特征维数很高,往往线性可分(SVM解决非线性分类问题的思路就是将样本映射到更高维度的特征空间中),可以采用LR或者线性核(Linear核)的SVM;
Ø 如果样本数量很多,由于求解最优化问题的时候,目标函数涉及两两样本计算内积,使用高斯核(RBF核)明显计算量会大于线性核,所以手动添加一些特征,使得线性可分,然后可以使用LR或者线性核(Linear核)的SVM;
Ø 如果不满足上述两点,即特征维数少,样本数量正常,可以使用高斯核(RBF核)的SVM;
线性核:
用于线性可分的情况,参数少,速度快,对于一般数据分类效果较好;
高斯核:
主要用于线性不可分的情况,参数多,分类结果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时;