吴恩达机器学习个人笔记(六)-支持向量机

       很早就听过支持向量机(SVM)这个算法的大名了,通过这周的学习了解大概是什么样子。吴恩达老师也说过这是最后一个详细讲解的算法了。支持向量机也是用于分类问题,并且多用于构建那种非线性模型进行分类,效果比较好。

1优化目标

     与逻辑回归和神经网络进行相比,支持向量机也就是svm, 在学习复杂的非线性方程时提供一种更为清晰,强大的方式。如之前的各种算法(线性回归、逻辑回归等)我们首先要弄明白要优化的目标是什么,之前算法的目标都为求最小的代价函数。吴恩达老师从逻辑回归开始讲述是怎样得到支持向量机模型的。

     之前都了解到逻辑回归的模型如下所示

                      

       在逻辑回归中,如果有一个y=1 的样本,那么我们希望假设函数的输出 h(x) 趋向1。假设函数如上图所示,h(x)趋向1那么我们的\theta ^{T}x应该远大于1。如果有另一个样本y=0,那么我们希望假设函数的输出值趋于0,这对应\theta ^{T}x或者z的值远小于0。逻辑回归的代价函数为

                       Cost(h_{\theta }(x),y)=-y\times log(h_{\theta }(x))-(1-y)\times log(1-h_{\theta }(x))

       现在考虑两种情况:一种为y等于1的情况,另一种为y等于0的情况。

       当 y=1 时只有第一项起作用,画出第一项也就是-log\frac{1}{1+e^{-z}}y=1 带入计算,并且z=\theta ^{T}x)的关于z的函数,如下所示

                                                  

        从上图中可以看出,随着z增大,即\theta ^{T}x增大,对应的值变得非常的小。对整个代价函数而言,影响也非常的小。这也就解释了在逻辑回归中观察到正样本y=1时,试图将\theta ^{T}x设置非常大,因为这样在代价函数中这一项会变得非常小。新的代价函数如上图中的紫色所示,是两条直线构成,先别考虑左边直线部分的斜率这并不重要,这是在y=1的前提下。

       可以以此讨论y=0的情况,当y=0时,逻辑回归中的第一项就为0,只留下第二项,我们可以如上所示画出-log(1-\frac{1}{1+e^{-z}})关于z的函数,时刻记住z=\theta ^{T}x

                                                  

       从上图也可以看出,当z远小于0时,对应点值趋于0,我们也使用紫色画出新的代价函数。现在将上述所讲的总结为一张图,如下所示

                    

给这两个方程命名,上图中左边的函数即y=1的函数,称之为 cost_{1}(z),右边的函数也就是y=0称之为 cost_{0}(z)。拥有这些定义后开始构建支持向量机。逻辑回归的代价函数如下所示(多个样本)

                            J(\theta)=\frac{1}{m}\sum_{i=1}^m[-y^{(i)}log(h_{\theta }(x^{(i)}))-(1-y^{(i)})log(1-h_{\theta }(x^{(i)}))]+\frac{\lambda }{2m}\sum_{j=1}^{n}\theta _{j}^{2}

根据上面描述我们可以替代为下列形式

                           J(\theta)=\frac{1}{m}\sum_{i=1}^m[-y^{(i)}cost_{1}(\theta ^{T}x^{(i)})-(1-y^{(i)})cost_{0}(\theta ^{T}x^{(i)})]+\frac{\lambda }{2m}\sum_{j=1}^{n}\theta _{j}^{2}

       我们的目标为最小化代价函数也就是minJ(\theta ),m在该过程中不会影响,同时可以两项同时除以\lambda得到下面的式子。该过程如下所示

                      

这只是在支持向量机中的使用习惯不同,可以将C=\frac{1}{\lambda },因此,这就得到了在支持向量机中我们的整个优化目标函数。然后最小化这个目标函数,得到SVM 学习到的参数C

                            

       最后与逻辑回归输出的概率不同,当最小化代价函数后,获取参数\theta,支持向量机直接预测y的值等于1,还是等于0。也就是讲直接输出结果。

2核函数

     之前我们使用高次的多项式来解决无法用直线进行分隔的分类问题,如下图所示

                                                            

       为了获取上图所示的判定边界,我们的模型可能是 \theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+\theta_{3}x_{1}x_{2}+\theta_{4}x_{1}^{2}+\theta_{5}x_{2}^{2}+\cdots 的形式,可以用一系列的特征f来替换模型中国的每一项,例如令: f_{1}=x_{1},f_{2}=x_{2},f_{3}=x_{1}x_{2},f_{4}=x_{1}^{2},f5=x_{2}^{2}。代入上式可以得到

                                                   h_{\theta }(x)=f_{1}\theta _{1}+f_{2}\theta _{2}+\cdots +f_{n}\theta _{n}

怎么得到这些f呢?我们可以通过核函数进行计算得出新的特征。

        给定一个训练实例x,利用x的特征与预先选定好的地标(landmarksl^{(1)},l^{(2)},l^{(3)} 的近似程度来选取新的特征f_{1},f_{2},f_{3}

例如:f_{1}=similarity(x,l^{(1)})=e(-\frac{\left \| x-l^{(1)} \right \|^{2}}{2\sigma ^{2}})

        其中 \left \| x-l^{(1)} \right \|^{2}=\sum _{j=1}^{n}(x_{j}-l_{j}^{(1)})^2为实例x中所有特征与地标l^{(1)}之间的距离的和。上式中similarity(x,l^{(1)})就是核函数,具体而言,这是一个高斯核函数(Gaussian Kernel)。

       地标的作用如下:如果一个训练实例x与地标l之间的距离近似于0,则新特征f近似于e^{-0}=1,如果训练实例x与地标l之间的距离较远,则f近似于e^{-(num)}=0,其中num是一个较大的数。

       假设我们的训练实例含有两个特征[x_{1},x_{2}],给定地标 l^{(1)} 与不同的\sigma值,如下所示

                      

       图中水平坐标为x_{1},x_{2} ,而垂直坐标代表f,只有当x与l^{(1)}重合时f才有最大值。随着x的变化f值改变的速率受到\sigma ^{2}的影响,\sigma ^{2}越大则变化越缓慢。在输入数据后进行预测时,我们采用的特征不是训练实例本身的特征,而是通过计算核函数计算出的新的特征f_{1},f_{2},f_{3}

      上述所讲的地标用于计算用于训练数据集的新特征,那么如何选择地标?我们通常时根据训练集的数量来选择地标的数量,即如果训练集中有m个实例,那么我们选取m个地标。并且令:l^{(1)}=x^{(1)},l^{(2)}=x^{(2)}\cdots l^{(m)}=x^{(m)},这样的好处为:得到的新特征时建立在原有特征与训练集中所有其他特征之间的距离的基础上,我们的新特征为:

                                          

        根据上述的情况,向量机的假设为:给定x,计算新特征f,当\theta ^{T}f>=0时,预测 y=1,否则反之。代价函数为:

                     min C\sum _{i=1}^{m}[y^{(i)}cost_{1}(\theta ^{T}f^{(i)})+(1-y^{(i)})cost_{0}(\theta ^{T}f^{(i)})]+\frac{1}{2}\sum _{j=1}^{m}\theta _{j}^{2}

在具体的实施过程中,我们还要对最后的正则化项进行微调整,在计算   \frac{1}{2}\sum _{j=1}^{m}\theta _{j}^{2}=\theta ^{T}\theta时,我们用\theta ^{T}M\theta代替\theta ^{T}\theta,其中M是根据我们选择核函数而不同的一个矩阵。

      在之前的机器学习算法中,我们都要最小化代价函数来获得参数,比如梯度下降。但是在支持向量机中,我们不需要自己来实现可以使用现有的软件包(如liblinear,libsvm等)在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的。

       另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而实例非常少的时候,可以采用这种不带核函数的支持向量机。

       下面是支持向量机的两个参数C\sigma的影响:

         C=\frac{1}{\lambda }

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

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

        \sigma较大时,可能会导致低方差,高偏差,欠拟合;

        \sigma较小时,可能会导致低偏差,高方差,过拟合。

猜你喜欢

转载自blog.csdn.net/Huang_cainiao/article/details/83151467