上一章说完了朴素贝叶斯,今天来说一个几乎最强的监督学习分类器--支持向量机SVM。SVM和Logistic 回归一样属于判别学习,朴素贝叶斯属于生成学习。
几乎所有详细讲SVM的讲义、书本都用很长的篇幅来讲SVM,所以这篇blog也分成上下篇来讲比较符合fashion(笑)本篇的SVM内容讲解包括:
i) SVM的基本思想
ii) SVM的框架: 输入,优化目标,输出等等内容
iiii) 数学工作全部做完之后一步一步来写最简单版本的代码
一. SVM基本思想
一上来断句的话很容易误读成“支持/向量机”,嗯...其实并没有向量机这个东西,正确的读法是“支持向量/机”,表明其主体是一系列“支持向量 support vectors”。
SVM的想法很朴素:对于二分类问题,目标是要找一个超平面把它们划分开来。假定二维平面那么就是寻找一条“好“”的直线分开它们。什么是好的直线?SVM认为,假如对于一条线,离它最近的点到直线的距离是“所有可能的直线候选的离它最近的点到它的距离”中最大的那一个,那么它就最优的。表现在图像上,可以理解为存在一条直线将两类点正确地划分成左右两边,而且离两边的点都比较远,这样就不错了。因为这样有很强的容错率,对于稍微分类模糊一点的点也能正确分类;否则其他直线很可能就错分了。
二.SVM基本框架(一直以二维平面为例,并略去大部分数学推导)
***
数学推导请参考吴恩达的机器学习讲义part V等资料以及该blog:
http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html
***
SVM的输入是一堆点。问题有了:寻找一条最优分隔直线 y = w_T*x + b(寻找一个最优的超平面),那么首先如何描述“间隔”以及“最优”呢?
函数间隔:
整个样本上的函数间隔是最小值:
这里需要注意我们在SVM里二分类的标签是 +1,-1,而不是0,1。原因之一是这样可以统一间隔的写法,其二观察公式可发现属于+1类的点,其值(w_T*x +b)越大,它的函数间隔越大,对于-1类同理。这样写是合乎历史发展逻辑的:我们先有了logistic回归,观察其中的sigmoid函数发现离原点越远的点其Y值越接近真实标签0/1,所以SVM继承了这个思想,并加以规范。
所以函数间隔并不表示真实的“距离”,而是可以描述分类预测的正确性的确信度。因为函数间隔成比例变化的时超平面不变的原因,我们对||w||施加约束,变成几何间隔。
几何间隔:
几何间隔就是朴素的“点到直线距离”,以向量形式描述。形式上把函数间隔除以||w||就得到了几何间隔。
接下来可以谈到我们要解决的问题是什么。其中用了两个数学算法:通过Lagrange对偶将原优化问题转化成对偶的凸优化问题【并附加KKT约束】,之后利用SMO算法求解参数。
原始最优问题: