背景知识:
我们拿到一个有标记的数据集后,会想,如果我能有个数学公式来预测lable就好了。
这个数学公式可能长这样:wTx。
接下来我们就想,我们预测的准确吗?于是我们想到了一些验证准确性的函数,或者换句话,预测结果与真实结果误差的函数,也就是损失函数。
我们可能会找到很完美的数学公式,让损失函数最小,但是这仅仅是训练集上的。。。可能在测试集或其他数据集上就会表现很差,这个现象就是过拟合。
一方面我们想最小化损失函数,另一方面又想不要过拟合,于是正则化项的引入对这两者做了trade off。
现在我们的目标不是最小化损失函数了,而是最小化 损失函数+正则化项。名曰:目标函数。
这是个最优化问题,我们有梯度下降法,坐标下降法,牛顿法和拟牛顿法等算法求解。
对于损失函数:
对于正则化项
最终我们拿着心满意足的目标函数去预测未知lable的样本。
Linear SVM:
它的损失函数就是L(w;x,y):=max{0,1−ywTx}.
Scala代码:
http://spark.apache.org/docs/1.6.3/mllib-linear-methods.html
可修改参数:迭代次数、正则化L1、L2选择、正则化参数
理论知识:
支持向量机的基本模型是定义在特征空间上的间隔最大的线性分类器(这一点跟感知机不同)。
学习策略:间隔最大化,可以形式化为求解凸二次规划。
包括三种形式:线性可分支持向量机(数据集完全线性可分,硬间隔最大化)、线性支持向量机(软间隔最大化)、非线性支持向量机(核技巧&软间隔最大化)
核函数,将特征空间映射到高维的特征空间,从非线性可分转化为近似线性可分,学习线性支持向量机。
线性可分支持向量机:
对于线性可分数据集,线性可分支持向量机寻找最优分离超平面。
分隔超平面 可以形式化表示为 wx + b = 0 ,分类y = sign(wx + b) 。
下面讨论间隔是什么,如何最大化:
1、函数间隔:
我们知道|wxi + b| 可以代表点xi到分割面的距离,yi(wxi + b) 在分类正确的情况下 大于0,可同时表示分类准确性和 距离,此为函数间隔。
2、几何间隔:
那么是不是我们最大化这个函数间隔就可以了呢?其实不然,我们同时将w,b扩大2倍,函数间隔变大了,但是 2wx + 2b = 0 与 wx + b = 0 表示的是同一条线!!
于是我们想到将w规范化,使得 ||w|| = 1. 则 yi(wxi + b) 可以转化为 yi(wxi / ||w|| + b / ||w||) 这就是几何距离,细心的你也许发现了 这正是 点xi 到分隔直线的距离公式呀~
我们定义r = min ri = min ri` / ||w|| = r` / ||w||
线性支持向量机(软间隔最大化):
对于线性不可分训练数据,线性可分支持向量机是不适用的。通常情况是,训练数据中有一些特异点,将这些特异点剔除后,便成为线性可分了。
换句话说,yi(wxi + b) 不再是 大于等于1了。而是大于等于 1- 某个松弛变量。
- 当松弛变量 = 0,这些特异点正好是支持向量。
- 当松弛变量在0-1之间,则分类正确,在间隔边界与分隔超平面之间。
- 当松弛变量等于1,在超平面上。
- 当松弛变量大于1,分类错误。
这时候我们需要讲硬间隔最大化,修改成软间隔最大化。
引入松弛变量 和 惩罚因子。
b的取值为所有支持向量算出的平均值。
注意:这里的优化目标函数可以转化成 合页函数:
非线性支持向量机(核函数与软间隔最大化):
上面我们讲到线性支持向量机,可以对部分特异点进行一个惩罚,转化为线性的方法求解。
但如果训练数据集的特异点太多(或者说根本就没法用直线进行分割),这时候数据集就是非线性可分。
这时候,我们需要将样本空间进行转化,通过映射函数,转化至高维,使其在高维线性可分。如下图:
我们可以发现上一节中介绍的 线性支持向量机 在求解对偶问题中,对样本数据的计算形式 是两两之间的内积:
于是我们将核函数定义为:
那么到时候求解对偶问题时,我们只要将核函数代入进去就可以了(因为代入后,样本空间就变成线性可分的了)。
那么问题来了:
1、既然是映射函数将 训练集变的可分的,为什么不直接找映射函数就行了?
答:因为数据量很大时,你无法观测训练集的分布,也就不知道什么样的函数可以完全分割正负样本。
2、那么核函数是自己设定的吗?如何选取核函数?为什么这个核函数一定有对应的映射函数?(为什么一定可以将非线性变成线性?)
答:是自己设定的;一般构造核函数比较困难,都是套用前人设计好的几个核函数;可以证明 正定核函数 具备这样的性质(证明略)
常用核函数:
到这里,我们已经将SVM的三种形式都介绍了,我们再来讲讲求解的几种方法:
1、凸二次规划最优化解法有很多,可以参考《运筹学》。
2、利用拉格朗日对偶性,求解对偶问题。
- 对偶问题,我们可以通过对参数进行求导求解;
- 但当样本量变的很大时,这种算法变的非常低效(你要对很多的拉格朗日乘子进行求导,迭代),SMO算法是一种快速实现发法。
SMO算法(序列最小最优化算法):
目标:求解对偶问题的。
思想:如果是最优解,那么所有的拉格朗日乘子都会满足KKT条件。那么我每次选定两个变量,固定其他变量,求解。不断重复,直到所有的变量都满足KKT条件。
好处:每次求解两个变量,可以通过解析方法求解,大大提高算法的计算速度。
问题:如何求解?如何选两个变量?
1、为了求解子问题,首先分析约束条件,然后在此约束条件下求极小。
2、变量的选择:
先选第一个变量a1:
外层循环,遍历所有样本,找到最违反KKT条件的那个样本的某个变量的乘子。具体地,先遍历支持向量,再遍历其他样本。
选第二个变量a2:
目的使其变化最大,通过公式7.106,可以发现a2由|E1-E2|决定,a1确定后,E1就知道了,如果E1正,那么E2越小越好,如果E1负,E2越大越好,为了计算节省时间,通常将Ei放入列表中,
如果上面找不到a2,就从支持向量中找;其次其他样本;再其次返回重新找个a1.。。。。
3、每次找到a1、a2,迭代优化后,都要更新阈值b。
SVM的优劣性:
优点:范化能力强,小样本表现好,既能线性、又能处理非线性可分数据集。
SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
缺点:如果数据量很大,SVM的训练时间就会比较长,如垃圾邮件的分类检测,没有使用SVM分类器,而是使用了简单的naive bayes分类器,或者是使用逻辑回归模型分类。
用SVM解决多分类问题存在困难,经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。
疑惑点:
1、我们知道满足f(x),g(x)为凸函数,h(x)为仿射函数,则可求解拉格朗日对偶问题。既然原问题和对偶问题都有最优解,那为什么还要引入KKT条件呢?
2、我们知道最优化问题有多种求解方式,为什么要引入拉格朗日对偶问题求解呢?
答:对偶问题往往更容易求解;自然引入核函数,进而推广到非线性分类问题。
参考:
《统计学习方法》