代码与数据请见:https://download.csdn.net/download/weixin_43521269/12345138
主要对svm支持向量机进行一些粗浅的研究,对svm的原理进行了解后,尝试编写基于matlab的svm代码,然后进行实验。主要采取matlab中自带的数据集:鸢尾花数据集,有三个类别且每个类别具有4个属性,先建立三个二分类向量机,采用K-fold(交叉验证)对数据集进行划分,获取训练数据和测试数据,使用训练集进行训练,得出超平面的方程,对测试集进行测试,最终与原标签进行比较,计算准确率。最后再将测试集分别带入三个向量机,得到观测值最大的即为最终分类结果。
关键词: svm 鸢尾花 交叉验证
一.简介
支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。最基础的便是二分类问题,给定一个数据集,含有多个属性,通过这些属性,建立超平面,使得这些点分为2类,定义标签1与-1,然后对其他的点进行预测。
本文进行了一些相关的实验,实现svm分类程序对鸢尾花数据集进行分类,并分析结果与得出相关的结论。
二.问题描述与数据描述
1.问题描述
本次主要是在二分类的基础上实现一个多分类问题,即鸢尾花的分类。使用一对多的方法,
训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。有三类要划分(也就是3个Label),记为A、B、C。于是抽取训练集的时候,分别抽取
(1)A所对应的向量作为正集,B,C所对应的向量作为负集;
(2)B所对应的向量作为正集,A,C所对应的向量作为负集;
(3)C所对应的向量作为正集,A,B所对应的向量作为负集;
使用这四个训练集分别进行训练,然后的得到四个训练结果文件。在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试。最后每个测试都有一个结果f1(x),f2(x),f3(x)。最终的结果便是这三个值中最大的一个作为分类结果。
2.数据描述
matlab中有自带的鸢尾花数据集,且都是已经处理好成mat格式,故只要直接导入便可。它是很常用的一个数据集,鸢尾花有三个分类,分别是山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。而且只有四个属性,分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度。总共150条数据。
三.如何解决问题
(一)模型假设
将鸢尾花的属性以坐标形式表示,建立以下支持向量机模型:
参数C代表的是在线性不可分的情况下,对分类错误的惩罚程度。C值越大,分类器就越不愿意允许分类错误(“离群点”)。如果C值太大,分类器就会竭尽全力地在训练数据上少犯错误,造成过拟合实际上这是没有意义的。而C值过小时,分类器就会过于“不在乎”分类错误,于是分类性能就会较差。
i 是对于第i样本点的分类损失,如果分类正确则是0,如果分类有所偏差则对应一个线性的值,i的求和是总误差,优化的目标当这个值越小越好,越小代表对训练集的分类越精准。目标函数中的另一项(常数1/2是为了方便求导加上去的)的最小化的优化方向则是使间隔大小最大。
本次实验使用的是径向核函数。
(二)实现代码步骤
1.导入数据集
鸢尾花数据集在matlab中为fisheriris,故使用load fisheriris即可。
2.数据预处理
(1)转化标签
matlab自带的鸢尾花数据集的标签为setosa、versicolo和Iris-virginica,在建立支持向量机的时候,要将其转化为+1,-1。如先建立变色鸢尾versicolor的支持向量机时,使用ismember()函数对标签进行转化。
(2)划分训练集与测试集
交叉验证来选取训练集与测试集,将原始数据分成5组(K-Fold),将每个子集数据分别做一次验证集,其余的4组子集数据作为训练集,这样会得到5个模型。这5个模型分别在验证集中评估结果,最后的误差MSE(Mean Squared Error)加和平均就得到交叉验证误差。交叉验证有效利用了有限的数据,使得评估结果能够尽可能接近模型在测试集上的表现。流程如下:
通过K-Fold 多次划分的形式进行训练是为了获取某个模型的性能指标,单一K-Fold训练的模型无法表示总体性能,但是通过K-Fold训练的训练记录下来较为优异的超参数,然后再以最优模型最优参数进行重新训练,将会取得更优结果。
(3)加入径向核函数(RBF)
对参数进行调试,寻找最优的惩罚参数C与径向核函数中的常数,代码中用r表示。
(4)获得问题矩阵H与求解二次规划参数
用matlab中的x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)函数来求解参数。
(5)使用测试集测试,计算函数值并判断类别
(6)分别实现三个分类器
(7)实现多分类,取得最优值,并得出准确率
四.数值实验
(一)分析结果
1.编程实现svm结果
类别:
(1)versicolor,最优惩罚参数C为6,最优径向核函数常数r为3,训练得到的准确率为98%;
(2)virginica,最优惩罚参数C为1,最优径向核函数常数r为2,训练得到的准确率为97.33%;
(3)setosa,最优惩罚参数C为1,最优径向核函数常数r为1,训练得到的准确率为100%;
建立的多分类向量机的结果:准确率为90%;
五.总结
实现了svm多分类,准确率也是达到了90%。不过还有很多地方可以优化,而且还是有很多不足的,比如只使用了径向核函数,没有使用其他核函数进行对比,之后可以考虑在添加其他的核函数进行比较,看哪种比较适合。