支持向量机(SVM)的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模式识别课程大作业报告——支持向量机(SVM)的实现
:
学号:
专业:
任课教师:
研究生导师:
容摘要
支持向量机是一种十分经典的分类方法,它不仅是模式识别学科中的重要容,而且在图像处理领域中得到了广泛应用。现在,很多图像检索、图像分类算法的实现都以支持向量机为基础。本次大作业的容以开源计算机视觉库OpenCV 为基础,编程实现支持向量机分类器,并对标准数据集进行测试,分别计算出训练样本的识别率和测试样本的识别率。
本报告的组织结构主要分为3大部分。第一部分简述了支持向量机的原理;第二部分介绍了如何利用OpenCV来实现支持向量机分类器;第三部分给出在标准数据集上的测试结果。
一、支持向量机原理概述
在高维空间中的分类问题实际上是寻找一个超平面,将两类样本分开,这个超平面就叫做分类面。两类样本中离分类面最近的样本到分类面的距离称为分类间隔。最优超平面指的是分类间隔最大的超平面。支持向量机实质上提供了一种利用最优超平面进行分类的方法。由最优分类面可以确定两个与其平行的边界超平面。通过拉格朗日法求解最优分类面,最终可以得出结论:实际决定最优分类面位置的只是那些离分类面最近的样本。这些样本就被称为支持向量,它们可能只是训练样本中很少的一部分。支持向量如图1所示。
图1
图1中,H是最优分类面,H1和H2别是两个边界超平面。实心样本就是支持向量。由于最优超平面完全是由这些支持向量决定的,所以这种方法被称作支持向量机(SVM)。
以上是线性可分的情况,对于线性不可分问题,可以在错分样本上增加一个惩罚因子来干预最优分类面的确定。这样一来,最优分类面不仅由离分类面最近的样本决定,还要由错分的样本决定。这种情况下的支持向量就由两部分组成:一部分是边界支持向量;另一部分是错分支持向量。
对于非线性的分类问题,可以通过特征变换将非线性问题转化为新空间中的线性问题。但是这样做的代价是会造成样本维数增加,进而导致计算量急剧增加,这就是所谓的“维度灾难”。为了避免高维空间中的计算,可以引入核函数的概念。这样一来,无论变换后空间的维数有多高,这个新空间中的线性支持向量机求解都可以在原空间通过核函数来进行。常用的核函数有多项式核、高斯核(径向基核)、Sigmoid函数。
二、支持向量机的实现
OpenCV是开源计算机视觉库,它在图像处理领域得到了广泛应用。OpenCV中包含许多计算机视觉领域的经典算法,其中的机器学习代码部分就包含支持向量机的相关容。OpenCV中比较经典的机器学习示例是“手写字母分类”。OpenCV中给出了用支持向量机实现该示例的代码。本次大作业的任务是研究OpenCV中的支持向量机代码,然后将其改写为适用于所有数据库的通用程序,并用标准数据集对算法进行测试。本实验中使用的OpenCV版本是2.4.4,实验平台为Visual Studio 2010软件平台。
OpenCV读取的输入数据格式为“.data”文件。该文件记录了所有数据样
本的特征向量和标签。OpenCV自带的“letter-recognition”数据集是手写字母数据集。其中共包含20000个样本,前16000个用来训练,后4000个用来测试。样本是16维的特征向量。每条样本在文件中按行存放。每行共有17个字段,第1个字段是样本的标签,以字符形式给出;后面16个字段分别是样本的16个特征,以数字形式给出。所有字段之间均以逗号分隔。
图2
图2中展示了“.data”文件中样本的存储样式。自行生成“.data”文件的过程十分简单。只需要新建一个“.txt”文件,对其容进行修改之后,直接把后缀改为“.data”即可。
在OpenCV给出的支持向量机示例程序中,可调参数大约有十多个,这些参数的调整比较复杂。为了方便使用该程序,可以将其中重要的参数从程序段中挑选出来,并制作宏定义。这些重要参数包括:总样本个数、用于训练的样本个数(总样本个数-训练样本个数=测试样本个数)、特征向量的维数、选取的核函数类型。可调参数如图3所示:
图3
在更换新的数据集时,只需要在宏定义部分修改“PATH”后的路径即可,其他参数的修改也都在这里进行,无需再到代码段进行修改。其中,宏定义“KERNEL”用来确定SVM采用何种核函数。
执行程序后,可以显示出训练样本和测试样本的识别率。通过将程序中分类数组的值输出,还可以在原有程序基础上添加显示测试样本标签的功能。对“letter-recognition”数据集进行分类得到的结果如图4所示:
图4
图4展示了4000个测试样本标签和训练样本识别率以及测试样本识别率。可以观察到训练样本的识别率为64.36%,测试样本的识别率为60.75%。将图4中
展示的测试样本标签与“.data”文件中的标签对比,可以直观地观察到哪个数据判断错误。图5展示了程序输出的测试样本标签与“.data”文件中标签的对应关系。
(a) (b)
图5
观察图5可以发现,第一行字母P的识别是正确的,而第三行的预测出现了错误。样本集中的数据为“O”,但支持向量机将其错分为“B”。按上述方法可以一一对照测试样本的预测结果是否正确。接下来,采用其他核函数进行分类。图6展示的是径向基函数的分类效果。
图6
观察图6可以看出,采用径向基函数可以获得极高的样本识别率,可达100%。但是测试样本的识别率为51.25%,比起线性基函数有所下降,说明其泛化能力(即推广能力)有限。测试表明,对于“letter-recognition”,采用多项式基函数和Sigmoid基函数分类的识别率更低,因此对此数据集的分类应该采用线性核函数。
三、标准数据集测试
前一部分展示了OpenCV自带的“letter-recognition”数据集的测试效果。为了测试编写的程序的通用性,接下来对其他标准数据集进行测试。数据集可以从“/ml/”下载,这个网址上提供了上万个用于机器学习的数据集。接下来分别展示“iris”数据集和“wine”数据集上的测试结果。
(1)“iris”数据集
“iris”数据集是鸢尾花数据集。其中共包含150个样本,每个样本是一个4