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的算法过程

通常,对于分类问题。我们会将数据集分成三部分,训练集、测试集、交叉验证集。用训练集训练生成模型,用测试集和交叉验证集进行验证模型的准确性。 
加载数据的代码如下:

"""
mnist_loader
~~~~~~~~~~~~
一个加载模式识别图片数据的库。
"""#### Libraries
# Standard library
import cPickle
import gzip# Third-party libraries
import numpy as npdef load_data():"""返回包含训练数据、验证数据、测试数据的元组的模式识别数据训练数据包含50,000张图片,测试数据和验证数据都只包含10,000张图片"""f = gzip.open('../data/mnist.pkl.gz', 'rb')training_data, validation_data, test_data = cPickle.load(f)f.close()return (training_data, validation_data, test_data)
  • 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算法进行训练和预测的代码如下:

"""
mnist_svm
~~~~~~~~~
使用SVM分类器,从MNIST数据集中进行手写数字识别的分类程序
"""#### Libraries
# My libraries
import mnist_loader # Third-party libraries
from sklearn import svm
import timedef svm_baseline():print time.strftime('%Y-%m-%d %H:%M:%S') training_data, validation_data, test_data = mnist_loader.load_data()# 传递训练模型的参数,这里用默认的参数clf = svm.SVC()# clf = svm.SVC(C=8.0, kernel='rbf', gamma=0.00,cache_size=8000,probability=False)# 进行模型训练clf.fit(training_data[0], training_data[1])# test# 测试集测试预测结果predictions = [int(a) for a in clf.predict(test_data[0])]num_correct = sum(int(a == y) for a, y in zip(predictions, test_data[1]))print "%s of %s test values correct." % (num_correct, len(test_data[1]))print time.strftime('%Y-%m-%d %H:%M:%S')if __name__ == "__main__":svm_baseline()
  • 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

以上代码没有用验证集进行验证。这是因为本例中,用测试集和验证集要判断的是一个东西,没有必要刻意用验证集再来验证一遍。事实上,我的确用验证集也试了一下,和测试集的结果基本一样。呵呵

直接运行代码,结果如下:

2016-01-02 14:01:46
9435 of 10000 test values correct.
2016-01-02 14:12:37
  • 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算法也没有想象的那么高不可攀嘛,呵呵! 
事实上,就算是一般性的机器学习问题,我们也是有一些一般性的思路的,如下: 

SVM分类算法的基本理论问题相关推荐

  1. [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  2. 机器学习—— SVM分类垃圾短信

    机器学习-- SVM分类算法 垃圾短信分类问题 Python语言凭借其强大的特性,其众多的外部库支持下,在机器学习和数据挖掘等领域发挥着强大的作用.本文基于python的机器学习库scikit-lea ...

  3. 时间序列分类算法_时间序列分类算法简介

    时间序列分类算法 A common task for time series machine learning is classification. Given a set of time serie ...

  4. 各常用分类算法的优缺点总结:DT/ANN/KNN/SVM/GA/Bayes/Adaboosting/Rocchio

    1决策树(Decision Trees)的优缺点 决策树的优点: 一. 决策树易于理解和解释.人们在通过解释后都有能力去理解决策树所表达的意义. 二. 对于决策树,数据的准备往往是简单或者是不必要的. ...

  5. 【Basic】SVM(支持向量机)分类算法

    支持向量机(Support Vector Machine,SVM)算法兼具形式优美和高效好用,难得地受到了跨学术界和工业界的好评. 一.SVM 算法介绍 在支持向量机中有三个重要概念,也是组成支持向量 ...

  6. 支持向量机分类示例python_分类算法-支持向量机 SVM

    SVM(Support Vector Machine) 指的是支持向量机,是常见的一种判别方法.在机器学习领域,是一个有监督的学习模型,通常用来进行模式识别.分类及回归分析.与其他算法相比,支持向量机 ...

  7. 分类算法-支持向量机(SVM)

    支持向量机(Support Vector Machine,SVM)是Corinna Cortes和Vapnik等于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能 ...

  8. svm多分类代码_监督学习——分类算法I

    本文是监督学习分类算法的第一部分,简单介绍对样本进行分类的算法,包括 判别分析(DA) 支持向量机(SVM) 随机梯度下降分类(SGD) K近邻分类(KNN) 朴素贝叶斯分类(NaiveBayes) ...

  9. 机器学习:分类算法SVM(支持向量机)

    支持向量机(Support Vector Machine ,SVM)的主要思想是:建立一个最优决策超平面,使得该平面两侧距离该平面最近的两类样本之间的距离最大化,从而对分类问题提供良好的泛化能力.对于 ...

最新文章

  1. Xamarin Essentials教程使用指南针Compass
  2. php 写 mysql 事件_PHP日歷,包含來自MySQL數據庫的重復事件
  3. Tensorflow安装问题解决(Anoconda)
  4. F. Ivan and Burgers(前缀线性基模板)
  5. leetcode 有效的数独
  6. dataframe根据时间戳timestamp切分成多个dataframe
  7. Scikit-learn库中的数据预处理(一)
  8. 《android深入探索》第四章心得
  9. wordpress发送测试邮件
  10. 静态页面 调用php数据,静态html页面如何更新点击数
  11. java鼠标变粗怎么办_java – 使用Apache POI使整行变粗
  12. ubuntu 20.04安装谷歌拼音输入法
  13. c语言象棋图片大全精美,【图片】象棋C语言【中国新象棋吧】_百度贴吧
  14. 单片机 取模软件:字模提取v2.1、PCtoLCD下载
  15. 简单版本CRM 客户管理系统设计
  16. 使用Python发送邮件(图片、表格、附件) 系列三: 发送工作报表之透视表自动刷新数据
  17. beyond compare软件安装与破解
  18. 什么是微信防火墙_【听课】第4节 什么是“合并单元”(MU)?智能站中的合并单元有什么作用?...
  19. PHP5 session 详解【经典】
  20. win2003能装mysql_win2003 安装2个mysql实例做主从同步服务配置

热门文章

  1. 习题6-3 使用函数输出指定范围内的完数 (20 分)
  2. bugfix:MySQL内存使用率无限增长以及kill手法
  3. 《MySQL——order by逻辑(全字段排序与rowid排序)》
  4. 显示照片的RGB直方图
  5. 实验9 SQL Server 的触发器
  6. 2019年的wps计算机考试题,2019年3月计算机一级WPS模拟题及答案(2.21)
  7. 标志寄存器EFLAGES
  8. java调用 solr集群_Solr集群安装Version5.5.2(cloud模式)
  9. 1356. 根据数字二进制下 1 的数目排序 golang
  10. C++ 常用算数生成算法