SVM: 实际中使用SVM的一些问题

使用SVM包来求θ,选择C与核函数算法

咱们使用已经编写好的软件包(这些软件包效率高,用得多,是经无数人证实已经很好的可使用的软件包)来求θ,而不是本身去编写软件来求它们(就像咱们如今不多编写软件来求x½).常用的是liblinear和libsvm网络

虽然不用咱们本身来写optimize函数,可是须要咱们肯定的是要选择C(cost function里面bias与variance权衡的参数=1/λ),以及选择什么样的kernel函数机器学习

一种选择是不使用kernel(也称为linear kernel),直接使用x: 这种状况是当咱们的n很大(即维度很高,features不少)可是训练样本却不多的状况下,咱们通常不但愿画出很复杂的边界线(由于样本不多,画出很复杂的边界线就会过拟合),而是用线性的边界线函数

一种选择是使用Gaussian kernel: 这种状况须要肯定σ2(平衡bias仍是variance)。这种状况是当x的维度不高,可是样本集不少的状况下。如上图中,n=2,可是m却不少,须要一个相似于圆的边界线。(即须要一个复杂的边界)学习

若是features的范围差异很大,在执行kernel以前要使用feature scaling优化

咱们须要本身编写kernel函数,固然许多SVM都包含了高斯kernel和linear kernel(由于这两个是最多见的);本身编写kernel函数时,将x1,x2(landmarks)作为输入输出features f(f1,f2.........fm)spa

在使用高斯kernel时,若是features之间的范围相差太大,要先作feature scaling。由于若是不作feature scaling 的话,在求范数时,则范数主要取决于大的数值的features,而不会去关注小数值的features,这样致使不均衡。如房子价格的预测,有面积与房间个数的话,则范数主要与房子的面积相关,由于房间个数对于范数的贡献过小。设计

成为有效的kernels须要知足的条件以及其它的一些kernel函数调试

咱们最经常使用的是高斯kernel和linear kernel(即不使用kernel),可是须要注意的是否是任何类似度函数都是有效的核函数,它们(包括咱们常使用的高斯kernel)须要知足一个定理(默塞尔定理),这是由于SVM有不少数值优化技巧,为了有效地求解参数Θ,须要类似度函数知足默塞尔定理,这样才能确保SVM包可以使用优化的方法来求解参数Θ对象

一些其它可能会被用到的kernels(不多使用): 多项式核函数,将x与l(landmark)的内积作为一种类似度的度量,如上图所示,它的通常形式为(xTl+constant)degree,有两个参数,一个是constant,一个是degree。多项式核函数通常会要求x与l都是非负的,这样它们的内积才是正的

一些更少用到的核函数:字符串核函数-若是你输入的数据为字符串的话,有时会用到这个核函数,来比较两个对象之间的类似度。卡方核函数,直方图交叉核函数。

咱们基本上不多用到这些核函数(用得最多的是高斯kernel与linear kernel),可是碰到它们时,要知道它们为核函数的定义.

SVM中的多分类问题

当咱们遇到多分类的问题时,如何有效地画出多分类的边界呢?

大多数的SVM都已经内置了多分类问题的软件包,咱们能够直接使用。

另外一种方法时使用one-vs.-all方法(参考以前的),训练K个SVM(若是有K个分类的话),这样得出K个参数θ向量(每个参数θ都是将这一类与其它类分别时所求的θ),而后预测时选择最大时的θTx所表示的那个class

logistic regression/SVM/神经网络比较

咱们将logistic regression的cost function进行了修改得出了SVM,那么咱们在什么状况下应该使用什么算法呢?

若是咱们的features要比样本数要大的话(如n=10000,m=10-1000),咱们使用logistic regression或者linear kernel,由于在样本较少的状况下,咱们使用线性分类效果已经很好了,咱们没有足够多的样原本支持咱们进行复杂的分类

若是n较小,m大小适中的话,使用SVM with Gaussion kernel.如咱们以前讲的有一个二维(n=2)的数据集,咱们可使用高斯核函数很好的将正负区分出来.

若是n较小,m很是大的话,会建立一些features,而后再使用logistic regeression 或者linear kernel。由于当m很是大的话,使用高斯核函数会较慢

logistic regeression 与linear kernel是很是类似的算法,若是其中一个适合运行的话,那么另外一个也颇有可能适合运行。

咱们使用高斯kernel的范围很大,当m多达50000,n在1-1000(很常见的范围),均可以使用SVM with 高斯kernel,能够解决不少logistic regression不能解决的问题。

神经网络在任何状况下都适用,可是有一个缺点是它训练起来比较慢,相对于SVM来讲

SVM求的不是局部最优解,而是全局最优解

相对于使用哪一种算法来讲,咱们更重要的是掌握更多的数据如何调试算法(bias/variance),如何设计新的特征变量,这些都比是使用SVM仍是logistic regression重要。

可是SVM是一种被普遍使用的算法,而且在某个范围内,它的效率很是高,是一种有效地学习复杂的非线性问题的学习算法。

logistic regression,神经网络,SVM这三个学习算法使得咱们能够解决不少前沿的机器学习问题。

相关文章
相关标签/搜索