资源描述:
《r语言与机器学习支持向量机》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、算法四:支持向量机 说到支持向量机,必须要提到july大神的《支持向量机通俗导论》,个人感觉再怎么写也不可能写得比他更好的了。这也正如青莲居士见到崔颢的黄鹤楼后也只能叹“此处有景道不得”。不过我还是打算写写SVM的基本想法与libSVM中R的接口。 一、SVM的想法回到我们最开始讨论的KNN算法,它占用的内存十分的大,而且需要的运算量也非常大。那么我们有没有可能找到几个最有代表性的点(即保留较少的点)达到一个可比的效果呢?要回答这个问题,我们首先必须思考如何确定点的代表性?我想关于代表性至少满足这样一个条件:无论非代表性点存在多少,存在与否都不会影响我们的决策结果。显然如果仍旧使用KNN算法的
2、话,是不会存在训练集的点不是代表点的情况。那么我们应该选择一个怎样的“距离”满足仅依靠代表点就能得到全体点一致的结果?我们先看下面一个例子:假设我们的训练集分为正例与反例两类,分别用红色的圆圈与蓝色的五角星表示,现在出现了两个未知的案例,也就是图中绿色的方块,我们如何去分类这两个例子呢?在KNN算法中我们考虑的是未知样例与已知的训练样例的平均距离,未知样例与正例和反例的“距离”谁更近,那么他就是对应的分类。同样是利用距离,我们可以换一个方式去考虑:假设图中的红线是对正例与反例的分类标准(记为wx+b=0),那么我们的未知样例与红线的“距离”就成了一个表示分类信度的标准,而wy+b(y为未知样例
3、的数据)的符号则可以看成是分类的标识。但是遗憾的是我们不知道这样的一条分类标准(分类线)是什么,那么我们一个比较自然的想法就是从已知的分类数据(训练集)里找到离分割线最近的点,确保他们离分割面尽可能的远。这样我们的分类器会更稳健一些。从上面的例子来看,虚线穿过的样例便是离分割线最近的点,这样的点可能是不唯一的,因为分割线并不确定,下图中黑线穿过的训练样例也满足这个要求: 所以“他们离分割面尽可能的远”这个要求就十分重要了,他告诉我们一个稳健的超平面是红线而不是看上去也能分离数据的黄线。这样就解决了我们一开始提出的如何减少储存量的问题,我们只要存储虚线划过的点即可(因为在wx+b=-1左侧,wx
4、+b=1右侧的点无论有多少都不会影响决策)。像图中虚线划过的,距离分割直线(比较专业的术语是超平面)最近的点,我们称之为支持向量。这也就是为什么我们这种分类方法叫做支持向量机的原因。至此,我们支持向量机的分类问题转化为了如何寻找最大间隔的优化问题。 二、SVM的一些细节 支持向量机的实现涉及许多有趣的细节:如何最大化间隔,存在“噪声”的数据集怎么办,对于线性不可分的数据集怎么办等。我这里不打算讨论具体的算法,因为这些东西完全可以参阅july大神的《支持向量机通俗导论》,我们这里只是介绍遇到问题时的想法,以便分析数据时合理调用R中的函数。几乎所有的机器学习问题基本都可以写成这样的数学表达式:
5、给定条件:n个独立同分布观测样本(x1,y1),(x2,y2),……,(xn,yn)目标:求一个最优函数f(x,w*)最理想的要求:最小化期望风险R(w) 不同的是我们如何选择f,R。对于支持向量机来说,f(x,w*)=wx+b,最小化风险就是最大化距离
6、wx
7、/
8、
9、w
10、
11、,即argmax{min(label(wx+b))/
12、
13、w
14、
15、}(也就是对最不confidence的数据具有了最大的confidence)这里的推导涉及了对偶问题,拉格朗日乘子法与一堆的求导,我们略去不谈,将结果叙述如下: 我们以鸢尾花数据来说说如何利用svm做分类,由于svm是一个2分类的办法,所以我们将鸢尾花数据也分为两
16、类,“setosa”与“versicolor”(将后两类均看做一类),那么数据按照特征:花瓣长度与宽度做分类,有分类: 从上图可以看出我们通过最优化原始问题或者对偶问题就可以得到w,b,利用sign(w.x+b)就可以判断分类了。我们这里取3,10,56,68,107,120号数据作为测试集,其余的作为训练集,我们可以看到:训练集setosavirginicasetosa480virginica096测试集setosavirginicasetosa20virginica04也就是完全完成了分类任务。我们来看看鸢尾花后两类的分类versicolor和virginica的分类,我们将数据的散点图描
17、绘如下:(我们把第一类“setosa“看做”versicolor“) 不难发现这时无论怎么画一条线都无法将数据分开了,那么这么办呢?我们一个自然的办法就是允许分类有一部分的错误,但是错误不能无限的大。我们使用一个松弛项来分类数据。最优化问题转变为: 当我们确定好松弛项C后,就可以得到分类: 我们还是先来看看分类的效果:(C=10)训练集versicolorvirginicaversicolor93