1.引言
随着网络技术的飞速发展和普及,进入了信息大爆炸的时代。信息无处不在,给我们的学习生活带来了诸多便捷,由于堪称海量的信息量,我们从中获取有用的信息变得困难,解决这一难题就是要对这些大量的信息进行分类。SVM就是一种很好的信息分类方法。SVM技术在解决小样本、非线性及高维度的模式识别问题中表现出许多优势,在许多领域,如文本分类、图像识别、生物信息学等领域中得到了成功的应用。
2.SVM的发展
SVM,是基于模式识别方法和统计学习理论的一种全新的非常有潜力的分类技术,主要用于模式识别领域。1963年,ATE-T Bell实验室研究小组在Vanpik的领导下,首次提出了支持向量机(SVM)理论方法。这种方法是从样本集中选择一组样本,对整个样本集的划分可以等同于对这组样本的划分,这组样本子集就被形象地称之为支持向量(SV)。但在当时,SVM在数学上不能明晰地表示,人们对模式识别问题的研究很不完善,因此SVM的研究没有得到进一步的发展与重视。
1971年,Kimeldorf提出了使用线性不等约束重新构造SV的核空间,使一部分线性不可分的问题得到了解决。
20世纪90年代,一个比较完善的理论体系——统计学习理论(Statistical Learning Theory,SLT)形成了,此时一些新兴的机器学习方法(如神经网络等)的研究遇到了一些重大的困难,比如欠学习与过学习问题、如何确定网络结构的问题、局部极小点问题等,这两方面的因素使得SVM迅速发展和完善,并在很多问题的解决中表现出许多特有优势,而且能够推广应用到函数拟合等其他机器学习问题中,从此迅速发展了起来,目前已经成功地在许多领域里得到了成功应用。
3.SVM的应用
SVM的主要思想可以概括为如下两点:
(1)它是针对线性可分的情况进行分析的。对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间,使其线性可分,从而使得在高维特征空间中采用线性算法对样本的非线性特征进行线性分析成为可能。(2)它基于结构风险最小化理论,在特征空间中构建最优分类面,使得学习器能够得到全局最优化,并且使整个样本空间的期望风险以某个概率满足一定上界。
从上面的两点基本思想来看,SVM没有使用传统的推导过程,简化了通常的分类和回归等问题;少数的支持向量确定了SVM 的最终决策函数,计算的复杂性取决于支持向量,而不是整个样本空间,这就可以避免“维数灾难”。少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。
3.1人脸检测、验证和识别
Osuna最早将SVM应用于人脸检测,取得了较好的效果。其方法是直接训练非线性SVM分类器完成人脸与非人脸的分类。由于SVM的训练需要大量的存储空间,并且非线性SVM分类器需要较多的支持向量,速度很慢,因此,他提出了一种层次性结构的SVM分类器,它由一个线性SVM的组合和一个非线性SVM组成。检测时,由前者快速排除掉图像中绝大部分背景窗日,而后者只需对少量的候选区域做出确认。
3.2说话人/语音识别
说话人识别属于连续输入信号的分类问题,SVM是一个很好的分类器,但不适合连续输入样本。为此,引入了隐式马尔可夫模型HMM,建立了SVM和HMM的混合模型。HMM适合处理连续信号,而SVM适合分类问题;HMM的结果反映了同类样本的相似度,而SVM的输出结果则体现了异类样本间的差异。为了方便与HMM组成混合模型,需要首先将SVM的输出形式改为概率输出。
3.3文字/手写体识别
贝尔实验室对美国邮政手写数字库进行的实验中,人工识别平均错误率为2.500,专门针对该特定问题设计的5层神经网络错误率为5.100(其中利用了大量先验知识),而用3种SVM方法(采用3种核函数)得到的错误率分别为2.000、2.1%和2.200,且SVM是直接采用16X 16的字符点阵作为输入的,表明了SVM的优越性能。
3.4图像处理
3.4.1图像过滤。一般的针对互联网色情图像的过滤软件主要采用网址库的形式封锁色情网址或采用人工智能方法对接收到的中、英文信息进行分析甄别。学者们提出了一种多层次特定类型图像过滤法,即综合肤色模型检验、支持向量机分类和最近邻方法校验的多层系图像处理框架,此方法能够达到85%以上的准确率。
3.4.2视频字幕提取。视频字幕蕴含了丰富的语义,可用于对相应视频流进行高级语义标注。研究人员提出并实践了基于SVM的视频字幕自动定位和提取的方法,该方法首先将原始图像的帧分割为NXN的子块,提取每个子块的灰度特征,然后使用预先训练好的SVM分类机进行字幕子块和非字幕子块的分类,最后结合金字塔模型和后期处理,实现视频图像字幕区域的自动定位提取。
3.4.3图像分类和检索。由于计算机自动抽取的图像特征和人所理解的语义间存在巨大差异,图像检索的结果难以令人满意。近年来出现了相关反馈方法,以SVM为分类器,在每次反馈中对用户标记的正例和反例样本进行学习,并根据学习所得的模型进行检索。相关研究人员使用了由9918幅图像组成的图像库进行了实验,结果表明,这种方法在训练样本有限的情况下具有良好的泛化功能。
3.5其他方面的应用
SVM除了在上述领域中得到了成功的应用外,在其他领域,如汽轮发电机组的故障诊断,金融工程,生物医药信号处理,生物信息,自适应信号处理,手写体相似字识别,岩爆预测的支持向量机,缺陷识别等领域都有成功的应用。
4.结语
目前,国际上关于SVM理论的讨论和深入的研究在逐渐广泛发展,我国国内在此领域的研究尚处在萌芽状态,需要及时学习掌握有关的理论知识,开展有效的研究工作,使国内在这个具有重要意义的领域中尽快赶上国际水平,跟上国际发展步伐。
SVM分类算法的基本理论问题,它分类的基本思想是利用最大间隔进行分类,处理非线性问题是通过核函数将特征向量映射到高维空间,从而变成线性可分的,但是运算却是在低维空间运行的。考虑到数据中可能存在噪音,还引入了松弛变量。
理论是抽象的,问题是具体的。站在岸上学不会游泳,光看着梨子不可能知道梨子的滋味。本篇博客就是用SVM分类算法解决一个经典的 机器学习 问题–手写数字识别。体会一下SVM算法的具体过程,理理它的一般性的思路。问题的提出
人类视觉系统是世界上众多的奇迹之一。看看下面的手写数字序列:
大多数人毫不费力就能够认出这些数字为504192。如果尝试让计算机程序来识别诸如上面的数字,就会明显感受到视觉模式识别的困难。关于我们识别形状——–“9顶上有一个圈,右下方则是一条竖线”这样的简单直觉,实际上算法很难轻易表达出来。
SVM分类算法以另一个角度来考虑问题。其思路是获取大量的手写数字,常称作训练样本,然后开发出一个可以从这些训练样本中进行学习的系统。换言之,SVM使用样本来自动推断出识别手写数字的规则。随着样本数量的增加,算法可以学到更多关于手写数字的知识,这样就能够提升自身的准确性。
本文采用的数据集就是著名的“MNIST数据集”。这个数据集有60000个训练样本数据集和10000个测试用例。直接调用scikit-learn库中的SVM,使用默认的参数,1000张手写数字图片,判断准确的图片就高达9435张。
SVM的算法过程
通常,对于分类问题。我们会将数据集分成三部分,训练集、测试集、交叉验证集。用训练集训练生成模型,用测试集和交叉验证集进行验证模型的准确性。
加载数据的代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
SVM算法进行训练和预测的代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
以上代码没有用验证集进行验证。这是因为本例中,用测试集和验证集要判断的是一个东西,没有必要刻意用验证集再来验证一遍。事实上,我的确用验证集也试了一下,和测试集的结果基本一样。呵呵
直接运行代码,结果如下:
- 1
- 2
- 3
- 1
- 2
- 3
在我的ubuntu上,运行11分钟左右就可以完成训练,并预测测试集的结果。
需要说明的是,svm.SVC()函数的几个重要参数。直接用help命令查看一下文档,这里我稍微翻译了一下:
C : 浮点型,可选 (默认=1.0)。误差项的惩罚参数C
kernel : 字符型, 可选 (默认=’rbf’)。指定核函数类型。只能是’linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ 或者自定义的。如果没有指定,默认使用’rbf’。如果使用自定义的核函数,需要预先计算核矩阵。
degree : 整形, 可选 (默认=3)。用多项式核函数(‘poly’)时,多项式核函数的参数d,用其他核函数,这个参数可忽略
gamma : 浮点型, 可选 (默认=0.0)。’rbf’, ‘poly’ and ‘sigmoid’核函数的系数。如果gamma是0,实际将使用特征维度的倒数值进行运算。也就是说,如果特征是100个维度,实际的gamma是1/100。
coef0 : 浮点型, 可选 (默认=0.0)。核函数的独立项,’poly’ 和’sigmoid’核时才有意义。
可以适当调整一下SVM分类算法,看看不同参数的结果。当我的参数选择为C=100.0, kernel=’rbf’, gamma=0.03时,预测的准确度就已经高达98.5%了。
SVM参数的调优初探
SVM分类算法需要调整的参数就只有几个。那么这些参数如何选取,有没有一些经验性的规律呢?
- 核函数选择
如上图,线性核函数的分类边界是线性的,非线性核函数分类边界是很复杂的非线性边界。所以当能直观地观察数据时,大致可以判断分类边界,从而有倾向性地选择核函数。
- 参数gamma和C的选择
机器学习大牛Andrew Ng说,关于SVM分类算法,他一直用的是高斯核函数,其它核函数他基本就没用过。可见,这个核函数应用最广。
gamma参数,当使用高斯核进行映射时,如果选得很小的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果gamma选得很大,则可以将任意的数据映射为线性可分——这样容易导致非常严重的过拟合问题。
C参数是寻找 margin 最大的超平面”和“保证数据点偏差量最小”)之间的权重。C越大,模型允许的偏差越小。
下图是一个简单的二分类情况下,不同的gamma和C对分类结果的影响。
相同的C,gamma越大,分类边界离样本越近。相同的gamma,C越大,分类越严格。
下图是不同C和gamma下分类器交叉验证准确率的热力图
由图可知,模型对gamma参数是很敏感的。如果gamma太大,无论C取多大都不能阻止过拟合。当gamma很小,分类边界很像线性的。取中间值时,好的模型的gamma和C大致分布在对角线位置。还应该注意到,当gamma取中间值时,C取值可以是很大的。
在实际项目中,这几个参数按一定的步长,多试几次,一般就能得到比较好的分类效果了。
小结
回顾一下整个问题。我们进行了如下操作。对数据集分成了三部分,训练集、测试集和交叉验证集。用SVM分类模型进行训练,依据测试集和验证集的预测结果来优化参数。依靠sklearn这个强大的机器学习库,我们也能解决手写识别这么高大上的问题了。事实上,我们只用了几行简单代码,就让测试集的预测准确率高达98.5%。
SVM算法也没有想象的那么高不可攀嘛,呵呵!
事实上,就算是一般性的机器学习问题,我们也是有一些一般性的思路的,如下: