机器学习之支持向量机
支持向量机(support vector machines,SVM)是一种二类分类模型。
代价函数:
我们回忆一下逻辑回归。其代价函数如下:
我们要实现我们的目标,就要把$-\log(1-\frac{1}{1+e^{-z}})$一点一点修改,修改为下两图的紫色直线函数,左边的函数,称之为${\cos}t_1{(z)}$,同时,右边函数称它为${\cos}t_0{(z)}$。
最后SVM代价函数变为:
最后有别于逻辑回归输出的概率。在这里,我们的代价函数,当最小化代价函数,获得参数$\theta $时,支持向量机所做的是它来直接预测$y$的值等于1,还是等于0。因此,这个假设函数会预测1。当$\theta^Tx$大于或者等于0时,或者等于0时,所以学习参数$\theta $就是支持向量机假设函数的形式。
大间距分类器:
支持向量机的目标是找到一个能正确划分数据集且间隔最大的超平面。
如该图所示,黑线比红线有着更大的距离。
核函数:
核函数可以看成是判断近似程度的函数。
为了获得上图所示的判定边界,我们的模型可能是
$$
\theta _0+\theta _1x_1+\theta _2x_2+\theta _3x_1x_2+\theta _4x_1^2+\theta _5x_2^2+\cdots
$$
的形式。
我们可以用一系列的新的特征$f$来替换模型中的每一项。例如令:
$$
f_1=x_1,f_2=x_2,f_3=x_1x_2,f_4=x_1^2,f_5=x_2^2
$$
…得到:
$$
h_θ(x)=\theta _1f_1+\theta _2f_2+…+\theta _nf_n
$$
。然而,除了对原有的特征进行组合以外,有没有更好的方法来构造$f_1,f_2,f_3$?我们可以利用核函数来计算出新的特征。
给定一个训练样本$x$,我们利用$x$的各个特征与我们预先选定的地标(landmarks)$l^{(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}
$$
上例中的$similarity(x,l^{(1)})$就是核函数,具体而言,这里是一个高斯核函数(Gaussian Kernel)。 注:这个函数与正态分布没什么实际上的关系,只是看上去像而已。
这些地标的作用是什么?如果一个训练样本$x$与地标$l$之间的距离近似于0,则新特征 $f$近似于$e^{-0}=1$,如果训练样本$x$与地标$l$之间距离较远,则$f$近似于$e^{-(一个较大的数)}=0$。
支持向量机参数的影响:
两个参数$C$和$\sigma$的影响:
$C=1/\lambda$
$C$ 较大时,相当于$\lambda$较小,可能会导致过拟合,高方差;
$C$ 较小时,相当于$\lambda$较大,可能会导致低拟合,高偏差;
$\sigma$较大时,可能会导致低方差,高偏差;
$\sigma$较小时,可能会导致低偏差,高方差。
另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而样本非常少的时候,可以采用这种不带核函数的支持向量机。
一些核函数
除了上文提到的高斯核函数外还有:
多项式核函数(Polynomial Kernel)
字符串核函数(String kernel)
卡方核函数( chi-square kernel)
直方图交集核函数(histogram intersection kernel)
一些软件库和好的软件包
吴恩达推荐:liblinear和libsvm
多类分类问题:
我们同样也可以训练个支持向量机来解决多类分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。
尽管你不去写你自己的SVM的优化软件,但是你也需要做几件事:
1、是提出参数的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。
2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的SVM(支持向量机),这就意味这他使用了不带有核函数的SVM(支持向量机)
一些普遍使用的准则:
$n$为特征数,$m$为训练样本数。
(1)如果相较于$m$而言,$n$要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2)如果$n$较小,而且$m$大小中等,例如$n$在 1-1000 之间,而$m$在10-10000之间,使用高斯核函数的支持向量机。
(3)如果$n$较小,而$m$较大,例如$n$在1-1000之间,而$m$大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。