SVM分类算法的基本理论问题

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对分类结果的影响。 
gamma和C 
相同的C,gamma越大,分类边界离样本越近。相同的gamma,C越大,分类越严格。 
下图是不同C和gamma下分类器交叉验证准确率的热力图 
gamma和C 
由图可知,模型对gamma参数是很敏感的。如果gamma太大,无论C取多大都不能阻止过拟合。当gamma很小,分类边界很像线性的。取中间值时,好的模型的gamma和C大致分布在对角线位置。还应该注意到,当gamma取中间值时,C取值可以是很大的。 
在实际项目中,这几个参数按一定的步长,多试几次,一般就能得到比较好的分类效果了。

小结

回顾一下整个问题。我们进行了如下操作。对数据集分成了三部分,训练集、测试集和交叉验证集。用SVM分类模型进行训练,依据测试集和验证集的预测结果来优化参数。依靠sklearn这个强大的机器学习库,我们也能解决手写识别这么高大上的问题了。事实上,我们只用了几行简单代码,就让测试集的预测准确率高达98.5%。 
SVM算法也没有想象的那么高不可攀嘛,呵呵! 
事实上,就算是一般性的机器学习问题,我们也是有一些一般性的思路的,如下: 
这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

决策树案例理解

小王是一家著名高尔夫俱乐部的经理。但是他被雇员数量问题搞得心情十分不好。某些天好像所有人都來玩高尔夫,以至于所有员工都忙的团团转还是应付不过来,而有些天不知道什么原因却一个人也不来,俱乐部为雇员数量浪费了不少资金。 小王的目的是…

剑指offer-反转链表

反转链表 一、题目描述 输入一个链表,反转链表后,输出新链表的表头。 (看过答案和测试之后,题目隐藏条件是要求链表是不带头结点的) 二、题目思路 就是用三个指针,head、pre、next,head之前都是…

从决策树学习谈到贝叶斯分类算法、EM、HMM

引言 最近在面试中(点击查看:我的个人简历,求职意向,择司标准),除了基础 & 算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全不代表你将来的面试中会遇…

计算机网络与协议

计算机网络: TCP/IP中只要是能够设定IP地址的计算机就成为主机 网络按其规模可分为: WAN(广域网):覆盖多个远距离区域的远程网络 MAN(城域网):比广域网小一级,连接整个城…

对线性回归、逻辑回归、各种回归的概念学习

回归问题的条件/前提: 1) 收集的数据 2) 假设的模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数。然后利用这个模型去预测/分类新的数据。 1. 线性回归 假设 特征 和 结果 都…

XGBoost入门及实战

kaggle比赛必备算法XGBoost入门及实战 xgboost一直在kaggle竞赛江湖里被传为神器,它在对结构化数据的应用占据主导地位,是目前开源的最快最好的工具包,与常见的工具包算法相比速度提高了10倍以上! XGBoost is an implementation o…

几个常用算法的适应场景及其优缺点

机器学习算法太多了,分类、回归、聚类、推荐、图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验。通常最开始我们都会选择大家普遍认同的算法,诸如SVM&#x…

EM算法 案例量则

例子一:理论: 简版:猜(E-step),反思(M-step),重复; 啰嗦版: 你知道一些东西(观察的到的数据), 你不知道一些东西(观察不到…

C#编写TensorFlow人工智能应用 TensorFlowSharp

TensorFlowSharp入门使用C#编写TensorFlow人工智能应用学习。 TensorFlow简单介绍 TensorFlow 是谷歌的第二代机器学习系统,按照谷歌所说,在某些基准测试中,TensorFlow的表现比第一代的DistBelief快了2倍。 TensorFlow 内建深度学习的扩展支持…

马尔可夫链 (Markov Chain)是什么鬼

作者:红猴子链接:https://www.zhihu.com/question/26665048/answer/157852228来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。马尔可夫链 (Markov Chain)是什么鬼 它是随机…

主题模型-LDA浅析

个性化推荐、社交网络、广告预测等各个领域的workshop上都提到LDA模型,感觉这个模型的应用挺广泛的,会后抽时间了解了一下LDA,做一下总结: (一)LDA作用 传统判断两个文档相似性的方法是通过查看两个文档共…

dorado-SplitSpanel控件

1.这是一个界面布局控件 2.分为SideControl边区域和MainControl主区域 3.常用属性 3.1 collapsed:打开页面时,边区域是否显示 3.2 position:边区域占总的大小 转载于:https://www.cnblogs.com/ergougougou/p/10438752.html

CAFFE怎样跑起来

0、参考文献 [1]caffe官网《Training LeNet on MNIST with Caffe》; [2]薛开宇《读书笔记4学习搭建自己的网络MNIST在caffe上进行训练与学习》([1]的翻译版,同时还有作者的一些注解,很赞); 1、*.sh文件如何执行? ①方…

运行caffe自带的两个简单例子

为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载。但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了。 注意:在caffe中运…

运行caffe自带的mnist实例详细教

为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载。但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了。 Mnist介绍:mnist是…

caffe路径正确,却读不到图片

调试caffe,用已有的网络训练自己的数据集的时候(我这里做的是二分类)。在生成均值文件之后,开始train,发现出现了这个问题。 1,路径正确,却读不到图片。 [db_lmdb.hpp:15] Check failed: mdb_st…

Eclipse可以执行jsp文件却无法访问Tomcat主页

点击Servers,然后双击本地的Tomcat服务器 出现如下界面 这里要选择第二项 再重新启动Tomcat就行了 转载于:https://www.cnblogs.com/lls1350767625/p/10452565.html

caffe调用的一个例子

本文是学习Caffe官方文档"ImageNet Tutorial"时做的,同样由于是Windows版本的原因,很多shell脚本不能直接使用,走了不少弯路,但是收获也不少。比如:如何让shell脚本在Windows系统上直接运行、如何去用Caffe给…

孔铜的铜厚

---恢复内容开始--- 表面处理方式注释&#xff1a; 喷锡 喷锡铅合金是一种最低成本PCB表面有铅工艺&#xff0c;它能保持良好的可焊接性。但对于精细引脚间距(<0.64mm)的情况&#xff0c;可能导致焊料的桥接和厚度问题。 无铅喷锡 一种无铅表面处理工艺&#xff0c;符合“环…