SVM分类器设计.docx
《SVM分类器设计.docx》由会员分享,可在线阅读,更多相关《SVM分类器设计.docx(16页珍藏版)》请在冰豆网上搜索。
SVM分类器设计
SVM分类器设计
1.引言
支撑矢量机(SVM)是90年代中期发展起来的基于统计学习理论的一种机器学习方法,通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的情况下,亦能获得良好统计规律的目的。
SVM分类器在推广性和经验误差两方面能达到平衡,是目前比较盛行的分类器。
1.1什么是SVM分类器
所谓支持向量机,顾名思义,分为两个部分了解,一什么是支持向量,简单来说,就是支持或者是支撑平面上把两类类别划分开来的超平面的向量点;二这里的“机”是什么意思。
“机(machine,机器)”便是一个算法。
在机器学习领域,常把一些算法看做是一个机器,如分类机(当然,也叫做分类器),而支持向量机本身便是一种监督式学习的方法它广泛的应用于统计分类以及回归分析中。
SVM的主要思想可以概括为两点:
⑴它是针对线性可分情况进行分析;
(2)对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能。
1.2SVM分类器的优点和缺点
优点:
(1)由于核函数隐含一个复杂映射,经验误差小,因此针对小样本数据利用支持向量能够完成线性或非线性规划问题;推广性和经验误差平衡。
(2)SVM的最终决策函数只由靠近边界的少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
(3)少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。
这种“鲁棒”性主要体现在:
①增、删非支持向量样本对模型没有影响;②支持向量样本集具有一定的鲁棒性;
③有些成功的应用中,SVM方法对核的选取不敏感
缺点:
(1)在训练分类器时,SVM的着眼点在于两类的交界部分,那些混杂在另一类中的点往往无助于提高分类器的性能,反而会大大增加训练器的计算负担,同时它们的存在还可能造成过学习,使泛化能力减弱.为了改善支持向量机的泛化能力。
(2)SVM算法对大规模训练样本难以实施。
由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。
(3)用SVM解决多分类问题存在困难。
经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。
可以通过多个二类支持向量机的组合来解决。
主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。
主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。
如:
与粗集理论结合,形成一种优势互补的多类问题的组合分类器
1.3SVM分类器当前研究热点
(1)针对大样本数据训练难度问题,对SVM算法的改进。
例如J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法。
(2)如何降低边界混杂点(即所谓统计误差导致的“不干净”点)导致的不必要的训练计算负担,增强泛化能力。
这种思路聚焦于样本数据预处理的探索,例如NN-SVM。
(3)分类器设计思想之间的融合以及取长补短。
例如[2]采样支撑矢量机和最近邻分类相结合的方法,在提高支撑矢量机的精度的同时,也较好的解决了核参数的问题。
1.4本文所解决的问题
本文对所给的二类样本,随机生成等容量的训练样本和测试样本,利用训练样本使用三种核函数生成最优决策超平面,对测试样本进行判决,将测试结果与训练目标进行比较。
使用“特异性”和“敏感度”两个指标评估不同核函数的下支撑矢量机的性能。
2.SVM方法论述
支持向量机中对于非线性可分的情况,可使用一个非线性函数
把数据映射到一个高维特征空间,在高维特征空间建立优化超平面,判决函数变为:
一般无法知道
的具体表达,也难以知晓样本映射到高维空间后的维数、分布等情况,不能再高维空间求解超平面。
由于SVM理论只考虑高维特征空间的点积运算
,而点积运算可由其对应的核函数直接给出,即
,用内积
代替最优分类面中的点积,就相当于把原特征空间变换到了某一新的特征空间,得到新的优化函数:
Max:
Subjectto
,
求解上述问题后得到的最优分类函数是:
b是分类阀值,可以用任一个支持向量求得,或通过两类中任意一对支持向量取中值求得。
其中核函数
可以有多种形式,常用的有:
(1)线性核,Linear:
;线性分类时使用
(2)多项式核,Poly:
,d是自然数;
(3)径向基核,RadialBasisFuction(RBF)核
(4)sigmoid核:
,其中k,δ均是常数
3.实验及验证
3.1流程图及其解释
Fig1支撑矢量机训练以及测试设计流程图
实验步骤:
1.将数据随机分为两组,一组用来训练一组用来测试;
2.分别使用三种核函数对训练样本进行SVM训练;
3.将三种核函数的结果分别针对测试集测试;
4.分析测试的结果。
3.2实验衡量指标
本文使用三个指标定义参数的影响:
敏感度(sensitivity)、特异性(specificity),耗时长(time-consumption)。
1.敏感度:
2.特异性:
3.耗时长:
其中,a定义为类1判定为类1的样本数目,b为类1判定为类2的样本数目,c为类2判定为类1的样本数目,d为类2判定为类2的样本数目。
Tstart为程序自二次优化开始的时间,Tend为程序计算出所有参数后的时间。
3.3实验结果分析
Fig2训练集得到的决策超平面,红色‘O’标定支撑矢量
Fig3对应利用决策平面对测试集的分类效果
红色‘O’标定错误分类样本
Fig2和Fig3是在定义拉格朗日乘子上界为C=100,径向基核参数gp=2的分类效果。
那么涉及到径向基核参数gp和拉格朗日乘子上界C最优问题,本实验以这两者为自变量,以敏感度,特异性,耗时长为因变量。
在gp
的范围内寻找最优点,结果画图如下。
Fig4.敏感度随拉格朗日乘子上界C和径向基核参数gp的变化
Fig5.特异性随拉格朗日乘子上界C和径向基核参数gp的变化
Fig6.耗时长随拉格朗日乘子上界C和径向基核参数gp的变化
敏感度(sensitivity):
反应实际为真(训练目标表征为1)且检测出来也为真的概率,值越大说明分类器越灵敏。
从Fig4我们可以很明显看出,固定核参数gp,当上界为400时,敏感度达到谷底,故朗格朗日乘子上界C应该尽量偏离这个值。
特异性(specificity):
反应实际为假(训练目标表征为-1)检测也为假的概率,此值越大说明分类越精确。
从图Fig5可以看出,固定核参数时gp时,在100<=C<=800时候,特异性较强,而大于800的时候,有明显的快速下降趋势。
耗时长(Time-consumption):
反应算法的运行时间。
由图Fig6可以很清楚的看出固定径向基参数,耗时长波动较大。
综上所述,径向基核的核参数gp对分类器影响并不是最直观的,相反,朗格朗日乘子的上界对于分类效果有着很大的影响。
对于本次分类实验,设定径向基参数gp=2,C=800效果较好。
3.3实验不足
实际上,本次实验并没能利用多项式核和sigmoid核获得较好的分类效果,其中多项式核尚能出现分类决策面,而sigmiod核完全无法获得优化效果。
其中利用多项式核获得的结果如下:
Fig7训练集得到的决策超平面,红色‘O’标定支撑矢量
Fig8对应利用决策平面对测试集的分类效果
红色‘O’标定错误分类样本
如上所述,利用sigmoid核并未获得期望的结果,故此处未说明并展示。
4.实验结论以及后期探索
本次实验有分别利用三种核函数对训练集训练得到SVM分类器,继而对测试集进行测试,其中定义了敏感度、特异性和耗时长三种指标定义分类器性能。
结论如下:
1.本实验的样本集近似于高斯分布,采用径向基核(RBF)取得了较满意的效果;其次是多项式核,sigmoid核并未展示出较好的性能。
2.对于径向基核函数。
相较于核参数,朗格朗日乘子上界对敏感度、特异性、耗时长有较为大的影响。
实验证明,当朗格朗日乘子上界C=800,核参数gp=2;时,三个衡量指标能够达到平衡。
3.核函数对于实验结果影响较大,核函数参数的设定需要一定的工作量。
本次实验最大失败是未能对多项式核和sigmiod核的性能作出探索,未达到预期的效果,未来的探索应该集中在:
1.SVM分类器的改进与加强,如样本的预处理;
2.核函数的本质与最新发展。
附录1主函数
%function[sensitivity,specificity,time]=svm(x,y,xtest,gp,C)
clc;
clearall;
%*************************************************************%
%获得数据
%*************************************************************%
[X1,X2]=getdata();
m=length(X1);
n=length(X2);
%*************************************************************%
%将数据的1,2类样本随机分为2组,一组训练一组测试
%*************************************************************%
x1=zeros(2,m/2);x2=zeros(2,n/2);%存储训练样本
x3=zeros(2,m/2);x4=zeros(2,n/2);%存储测试样本
temp1=randperm(m);%随机将数据分为两组,一组用于训练一组测试
temp2=randperm(n);
fori=1:
m/2
x1(:
i)=X1(:
temp1(i));%训练用
x3(:
i)=X1(:
temp1(i+m/2));%测试用
end
forj=1:
n/2
x2(:
j)=X2(:
temp2(j));%训练用
x4(:
j)=X2(:
temp2(j+n/2));%测试用
end
y1=ones(1,m/2);y2=-ones(1,n/2);
Y=[y1,y2];%训练目标1*n矩阵,n为样本个数,值为+1或-1
X=[x1,x2];%训练样本2*n矩阵
Xtest=[x3,x4];
%*************************************************************%
%获得训练结果并对测试样本分类
%*************************************************************%
t1=clock;
%四种核函数的调用格式:
%调用格式中的参数解释:
%degree-Degreedofpolynomialkernel(positivescalar).
%offset-Offsetcofpolynomialandtanhkernel(scalar,negativefortanh).
%width-WidthsofGausskernel(positivescalar).
%gamma-Slopegofthetanhkernel(positivescalar).
%ker=struct('type','linear');
%ker=struct('type','ploy','degree',2,'offset',1);
%ker=struct('type','gauss','width',2);
ker=struct('type','tanh','gamma',2,'offset',0);
%相应的核函数产生训练结果
svm=svmtrain(ker,X,Y,800);
%利用训练样本对测试样本分类
Ytest=svmtest(svm,Xtest);
g=Ytest-Y;
t2=clock;
%*************************************************************%
%性能指标计算
%*************************************************************%
fp=length(find(g==2));
fn=length(find(g==-2));
tp=length(find(g(1:
50)==0));
tn=length(find(g(51:
105)==0));
sensitivity=tp/(tp+fn);
specificity=tn/(tn+fp);
time=etime(t2,t1);
%*************************************************************%
%显示
%*************************************************************%
%显示训练样本
figure
(1);
plot(x1(1,:
),x1(2,:
),'b*',x2(1,:
),x2(2,:
),'g+')
xlabel('TrainingSetwithSVMakedby"redO"');
holdon;
%标记支撑矢量
a=svm.a;e=1e-8;
sv=find(abs(a)>e);
plot(X(1,sv),X(2,sv),'ro');
gridon;
%画出决策面
drawing(svm);
figure
(2);%画出错误分类的测试样本
temp=find(abs(g)>0);
plot(x3(1,:
),x3(2,:
),'*',x4(1,:
),x4(2,:
),'+');
holdon;
plot(Xtest(1,temp),Xtest(2,temp),'ro');
xlabel('TheTestResultwithErrorDotsmarkedby"O"');
%标记决策面
drawing(svm);
其中调用的子函数说明,子函数见压缩包
gedata.m读取样本数据子函数
smtrain.m训练SVM分类器子函数
svmtest.m使用已经训练出的分类器对测试样本进行测试子函数
kernel.m使用结构体变量为参数返回不同的kernel矩阵子函数