机器学习-Ng-week7-支持向量机(SVM)

支持向量机(SVM)有一个监督学习算法,是解决非线性问题的一个很好的方法。

(1)优化目标

我们通过逻辑回归来一点一点的修改得到本质上的支持向量机。



现在开始建造支持向量机,我们从代价函数开始,一点一点的修改,我们取z=1点,我先画出将要用的代价函数。先取z=1这一点,然后水平向右延伸,再画与逻辑回归十分相似的直线,改成这样的代价函数之后,会在后面的优化问题中更坚定,并且支持向量机带来了计算上的优势。同理,在y=0的情况下,,取到z=-1的这点,向左延伸,在做与逻辑回归相似度的直线。我将上图左边的式子称为,右边的式子称为

下面我们开始构建支持向量机:


是由逻辑回归变化而来的,我们看代价函数,我们需要在函数中添加,所以将负号提了进去,之后我们可以知道同乘上一个m,代价函数的取最小值的点(最优化参数)是不会变的,所以我们乘上了m消除了这项,但是正则化项还存在一个,所以我又将,在乘上C得到最终的结果!

(2)大边界的直观理解

支持向量机有时候被看做大间距分类器。


注意之前正样本y=1要求,但是现在SVM要求,同理负样本y=0之前要求的是,现在要求

所以在最优化的时候,你会发现如果输入一个y=1的训练集样本标签,想使得第一项为0,要求找到一个使得,同理输入一个y=0的训练集样本标签,想使得第一项为0,要求找到一个使得

决策边界



看到上面有三条决策边界,你会发现支持向量机会选择黑色的那个作为决策边界,黑色是更加稳定和健壮的决策边界,就是因为黑色有更大的距离,这个距离叫做间距(margin)


所以说支持向量机被称为大间距分类器-->SVM努力将正负样本以最大的间距分开。我将C=100000设置的非常大,所以在最优化的时候,希望找出y=1和y=0的两种情况下都使得代价函数的第一项尽可能的小的参数。如果我们找出这样的参数,则我们的最小化问题转变成

事实上,SVM现在要比大间距分类器更加的成熟,当你使用大间距分类器的时候,你的学习算法会受到异常点(outlier)的影响。如下如:仅仅因为一个红色的异常点,我们的分界线变成了粉色的线。对于SVM来说,当你把C设置的非常大的时候,他的决策边界由黑色变成粉色,但是C设置的相对小点,或者没有那么大,就会得到这条黑线。(大间距分类器只是直观的给出了正则化参数C特别大的情况,等价于lambda特别小)。所以在SVM下,当C不是非常大的情况下,它可以忽略掉一些异常点的影响,得到跟好的决策边界,计算不是线性可分的,SVM也可以得到很好地结果。只有当C特别大的时候,可以理解为大间距分类器。


(3)数学背后的大分界分类

这小节是为了帮助我们理解大间隔分类器背后的数学原理。

向量内积


我们有两个向量u和v,称为向量u和v的内积。|u|称为u的范数,也就是u的长度,。内积怎么计算你呢?首先将向量v投影到向量u上,我们做一个直角投影到u上,这段长度我们称为p(红色线),则=p|u|,其实也算是两个矩阵相乘得到的。如果交换u和c的位置,将u投影到v上,而不是将v投影到u上,得到的是一样的结果。(p是有符号的,上图的第二个图p就是负数)


为了得到上图,我们将忽略掉截距,这样容易绘制图形,也只假设n=2,可以得到上图的一些概率。SVM所做的事情,就是极小化参数向量范数的平方,或者说是长度的平方。进而如下图:


用下图来看支持向量机会选择怎么样的决策边界,假设第一张图绿色的那个是决策边界,这个选择很显然是不好的,我们怎么样来证明他呢?首先第一点,我们的代价函数需要找到最小值,那么我们就需要尽可能的小,同时我们选择红色为正样本y=1,那么则,但是我们知道p1很小,就要求足够的大,同理的对于负样本也是,但是代价函数的要求是相违背的。(注意我们要求theta0等于0,仅仅意味着决策界必须通过源点(0,0));相反的是如果我选择的是第二张图绿色的这个决策界,那么p1比较之前的更大了,那么可以小一点,所以SVM会选择第二张绿色的决策界!!!


:决策界不通过原点。

(4)核函数-1

前一个博客刚说过用多项式模型来非线性的问题,比如说下图这个模型,想要得到他,我们的模型可能是,但是除了对原来的特征进行组合外,也没有更好的方法来构造?我们可以利用核函数来计算出新的特征


我们给定一个训练集实例x,我们利用x的各个特征与我们预先选择的地标(landmarks),例如,其中:,上式中的就是核函数,具体而言,这里是一个高斯核函数(Gaussian kernel)(注:这个函数与正态分布没什么实际上的关系,只是看上去像)

如果一个训练实例x与地标L之间的距离近似于0,则新特征f近似于,如果训练实例x与地标L之间距离较远,则f近似于e^{-一个较大的数}=0


假设我们的训练实例包含两个特征[x1 x2],给定地标与不同的值,见下图:只有当x与重合时,f才取得最大值。随着x的改变f值改变的速率也受到了的影响。(越小越高瘦,越大越平滑


当实例处在洋红色的点的地方,距离更近,但是离较远。所以f1等于1,但是其他两个接近0,因此得到下图的表达式大于0,因此预测y=1,;对于离比较近的绿色点,也预测为1,但是对于蓝绿色的那个点,距离多个地标都比较的远,所以预测为y=0;图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练实例和我们选取的地标所得到的的判定边界,在预测时,我们采用的特征不是训练实例本身的特征,而是通过核函数计算得到的新特征


(5)核函数-2

1.如何选择地标?

我们通常根据训练集的数量选择地标的数量,即如果训练集中有m个实例,则我们选取m个地标,并且令,这样多的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有的其他特征之间距离的基础之上的,即:



下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:

给定x,计算新特征f,当,预测y=1,否则反之。修改代价函数为:,注意到我们的正则化项进行了微调整,在计算时候,我们使用代替,其中M是根据我们选择的核函数而不同的一个矩阵。这样做的目的是为了简化计算。(理论上说,我们也可以在逻辑回归中使用核函数,但是上面使用的M来简化计算的方法不适用与逻辑回归,因此计算将非常消耗时间)

另外,我们不像前面介绍的那些监督学习的算法优化的方法,比如梯度下降算法,我们使用现成的包liblinear,libsvm等。在使用这些包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那我们在使用前必须进行特征缩放!!!

另外,当然SVM可以不使用核函数,不使用核函数的又称为线性核函数。当我们不采用十分复杂的函数,或者我们的训练集特征十分的多,但是我们的实例很少的话,可以采用这种不带核函数的支持向量机。

C和对SVM的影响

1.C较大时,相当于较小,可能会导致过拟合,高方差;

2.C较小时,相当于较大,可能导致欠拟合,高偏差;

3.^2较小时,导致高方差,低偏差,更瘦高;(这里有点混。。。)

4.^2较大时,导致高偏差,低方差,更平滑。

(6)支持向量机的使用

我们不仅可以用高斯核函数来构建新的特征,还可以使用多项式核函数,字符串核函数,卡方核函数,直方图交集核函数等,这些核函数同样都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足mercer's定理,才能被支持向量机的优化软件正确使用!!!

多类分类问题,我们之前介绍的一对多的方法来解决一个多分类的问题。如果一共有k个类,则我们需要k个模型,已经k个参数向量theta。我们同样也可以训练出k个SVM来解决问题,但是其实很多支持SVM的软件包都存在内置多类分类问题,我们之间使用就行。虽然你不用自己写优化函数,但是你的做以下两点:

1.提出参数C的选择

2.选择核函数,当然你也可以不要,就是线性核函数。


我们如何在逻辑回归和支持向量机之间选择呢???下面是一些准则:

(1)相对于m而言n要大很多,即训练集的数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者是不带核函数的支持向量机。

(2)n较小,m大小中等,n在1-1000之间,m在10-10000之间,采用高斯核函数的支持向量机。

(3)n较小,m较大,n在1-1000之间,m大于50000,则使用支持向量机会很慢,解决方法是创造更多的特征,然后使用逻辑回归或者不带核函数的支持向量机。

当然神经网络对上诉三种情况都有好的表现。但是训练神经网络费时,但是SVM他的代价函数是凸函数,不存在局部最小值!!!

当我们是非常大的数据集且是高斯核函数的情况下,我们应该尝试手动的创造更多的特征变量,然后用逻辑回归或者不带核函数的支持向量机来完成。(你要知道:不带核函数的支持向量机和逻辑回归十分相似)

SVM具有优化问题,是一种凸优化问题。因此,好的SVM优化软件包总能找到全局最小值,或者接近他的值,SVM完全不用担心局部最优问题。