机器学习算法与python实践之支持向量机(svm).doc
机器学习算法与PYTHON实践之支持向量机(SVM)目录一、引入二、线性可分SVM与硬间隔最大化三、DUAL优化问题31、对偶问题32、SVM优化的对偶问题四、松弛向量与软间隔最大化五、核函数六、多类分类之SVM61、“一对多”的方法62、“一对一”的方法七、KKT条件分析八、SVM的实现之SMO算法81、坐标下降算法82、SMO算法原理83、SMO算法的PYTHON实现一、引入支持向量机(SUPPORTVECTORMACHINES),这个名字可是响当当的,在机器学习或者模式识别领域可是无人不知,无人不晓啊。八九十年代的时候,和神经网络一决雌雄,独领风骚,并吸引了大批为之狂热和追随的粉丝。虽然几十年过去了,但风采不减当年,在模式识别领域依然占据着大遍江山。王位稳固了几十年。当然了,它也繁衍了很多子子孙孙,出现了很多基因改良的版本,也发展了不少裙带关系。但其中的睿智依然被世人称道,并将千秋万代好了,买了那么久广告,不知道是不是高估了。我们还是脚踏实地,来看看传说的SVM是个什么东西吧。我们知道,分类的目的是学会一个分类函数或分类模型(或者叫做分类器),该模型能把数据库中的数据项映射到给定类别中的某一个,从而可以用于预测未知类别。对于用于分类的支持向量机,它是个二分类的分类模型。也就是说,给定一个包含正例和反例(正样本点和负样本点)的样本集合,支持向量机的目的是寻找一个超平面来对样本进行分割,把样本中的正例和反例用超平面分开,但是不是简单地分看,其原则是使正例和反例之间的间隔最大。学习的目标是在特征空间中找到一个分类超平面WXB0,分类面由法向量W和截距B决定。分类超平面将特征空间划分两部分,一部分是正类,一部分是负类。法向量指向的一侧是正类,另一侧为负类。用一个二维空间里仅有两类样本的分类问题来举个小例子。假设我们给定了下图左图所示的两类点CLASS1和CLASS2(也就是正样本集和负样本集)。我们的任务是要找到一个线,把他们划分开。你会告诉我,那简单,挥笔一画,洋洋洒洒五颜六色的线就出来了,然后很得意的和我说,看看吧,下面右图,都是你要的答案,如果你还想要,我还可以给你画出无数条。对,没错,的确可以画出无数条。那哪条最好呢你会问我,怎么样衡量“好”假设CLASS1和CLASS2分别是两条村子的人,他们因为两条村子之间的地盘分割的事闹僵了,叫你去说个理,到底怎么划分才是最公平的。这里的“好”,可以理解为对CLASS1和CLASS2都是公平的。然后你二话不说,指着黑色那条线,说“就它了正常人都知道在两条村子最中间画条线很明显对他们就是公平的,谁也别想多,谁也没拿少”。这个例子可能不太恰当,但道理还是一样的。对于分类来说,我们需要确定一个分类的线,如果新的一个样本到来,如果落在线的左边,那么这个样本就归为CLASS1类,如果落在线的右边,就归为CLASS2这一类。那哪条线才是最好的呢我们仍然认为是中间的那条,因为这样,对新的样本的划分结果我们才认为最可信,那这里的“好”就是可信了。另外,在二维空间,分类的就是线,如果是三维的,分类的就是面了,更高维,也有个霸气的名字叫超平面。因为它霸气,所以一般将任何维的分类边界都统称为超平面。好了。对于人来说,我们可以轻易的找到这条线或者超平面(当然了,那是因为你可以看到样本具体的分布是怎样的,如果样本的维度大于三维的话,我们就没办法把这些样本像上面的图一样画出来了,这时候就看不到了,这时候靠人的双眼也无能为力了。“如果我能看得见,生命也许完全不同,可能我想要的,我喜欢的我爱的,都不一样”),但计算机怎么知道怎么找到这条线呢我们怎么把我们的找这条线的方法告诉他,让他按照我们的方法来找到这条线呢呃,我们要建模把我们的意识“强加”给计算机的某个数学模型,让他去求解这个模型,得到某个解,这个解就是我们的这条线,那这样目的就达到了。那下面就得开始建模之旅了。二、线性可分SVM与硬间隔最大化其实上面这种分类思想就是SVM的思想。可以表达为SVM试图寻找一个超平面来对样本进行分割,把样本中的正例和反例用超平面分开,但是不是很敷衍地简单的分开,而是尽最大的努力使正例和反例之间的间隔MARGIN最大。这样它的分类结果才更加可信,而且对于未知的新样本才有很好的分类预测能力(机器学习美其名曰泛化能力)。我们的目标是寻找一个超平面,使得离超平面比较近的点能有更大的间距。也就是我们不考虑所有的点都必须远离超平面,我们关心求得的超平面能够让所有点中离它最近的点具有最大间距。我们先用数学公式来描述下。假设我们有N个训练样本{X1,Y1,X2,Y2,,XN,YN},X是D维向量,而YI∊{1,1}是样本的标签,分别代表两个不同的类。这里我们需要用这些样本去训练学习一个线性分类器(超平面)FXSGNWTXB,也就是WTXB大于0的时候,输出1,小于0的时候,输出1。SGN表示取符号。而GXWTXB0就是我们要寻找的分类超平面,如上图所示。刚才说我们要怎么做了我们需要这个超平面最大的分隔这两类。也就是这个分类面到这两个类的最近的那个样本的距离相同,而且最大。为了更好的说明,我们在上图中找到两个和这个超平面平行和距离相等的超平面H1YWTXB1和H2YWTXB1。好了,这时候我们就需要两个条件(1)没有任何样本在这两个平面之间;(2)这两个平面的距离需要最大。(对任何的H1和H2,我们都可以归一化系数向量W,这样就可以得到H1和H2表达式的右边分别是1和1了)。先来看条件(2)。我们需要最大化这个距离,所以就存在一些样本处于这两条线上,他们叫支持向量(后面会说到他们的重要性)。那么它的距离是什么呢我们初中就学过,两条平行线的距离的求法,例如AXBYC1和AXBYC2,那他们的距离是|C2C1|/SQRTX2Y2(SQRT表示开根号)。注意的是,这里的X和Y都表示二维坐标。而用W来表示就是H1W1X1W2X21和H2W1X1W2X21,那H1和H2的距离就是|11|/SQRTW12W122/||W||。也就是W的模的倒数的两倍。也就是说,我们需要最大化MARGIN2/||W||,为了最大化这个距离,我们应该最小化||W||,看起来好简单哦。同时我们还需要满足条件(2),也就是同时要满足没有数据点分布在H1和H2之间也就是,对于任何一个正样本YI1,它都要处于H1的右边,也就是要保证YWTXB1。对于任何一个负样本YI1,它都要处于H2的左边,也就是要保证YWTXB1。所以我们的问题就变成这是个凸二次规划问题。什么叫凸凸集是指有这么一个点的集合,其中任取两个点连一条直线,这条线上的点仍然在这个集合内部,因此说“凸”是很形象的。例如下图,对于凸函数(在数学表示上,满足约束条件是仿射函数,也就是线性的AXB的形式)来说,局部最优就是全局最优,但对非凸函数来说就不是了。二次表示目标函数是自变量的二次函数。好了,既然是凸二次规划问题,就可以通过一些现成的QPQUADRATICPROGRAMMING的优化工具来得到最优解。所以,我们的问题到此为止就算全部解决了。虽然这个问题确实是一个标准的QP问题,但是它也有它的特殊结构,通过LAGRANGEDUALITY变换到对偶变量DUALVARIABLE的优化问题之后