支持向量机的介绍.docx

上传人:奥沙丽水 文档编号:480220 上传时间:2025-07-29 格式:DOCX 页数:17 大小:103.89KB
下载 相关 举报
支持向量机的介绍.docx_第1页
第1页 / 共17页
支持向量机的介绍.docx_第2页
第2页 / 共17页
支持向量机的介绍.docx_第3页
第3页 / 共17页
支持向量机的介绍.docx_第4页
第4页 / 共17页
支持向量机的介绍.docx_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、支持向量机(SVM)介绍目标本文档尝试解答如下问题:如何使用OPenCV函数CvSVMhrain训练一个SVM分类器,以及用CvSVIVkpredict测试训练结果。什么是支持向量机(SVM)?支持向量机(SVM)是一个类分类器,正式的定义是一个能够将不同类样本在样本空间分隔的超平面。换句话说,给定一些标记(Iabel)好的训练样本(谧督式学习),SVM算法输出一个最优化的分隔超平面。如何来界定一个超平面是不是最优的呢?考虑如下问题:假设给定一些分属于两类的2维点,这些点可以通过直线分割,我们要找到一条最优的分割线.Note在这个例如中,我们考虑卡迪尔平面内的点与线,而不是高维的向量与超平面。

2、这一简化是为了让我们以更加直觉的方式建立起对SVM概念的理解,但是其根本的原理同样适用于更高维的样本分类情形。在上面的图中,你可以直觉的观察到有多种可能的直线可以将样本分开。那是不是某条直线比其他的更加适宜呢?我们可以凭直觉来定义一条评价直线好坏的标准:距离样本太近的直线不是最优的,因为这样的直线对噪声敏感度高,泛化性较差。因此我们的目标是找到一条直线,离所有点的距离最远。由此,SVM算法的实质是找出一个能够将某个值最大化的超平面,这个值就是超平面离所有训练样本的最小距离。这个最小距离用SVM术语来说叫做间隔(margin)。概括一下,最优分割超平面最大化训练数据的间隔。如何计算最优超平面?下

3、面的公式定义了超平面的表达式:f(x)=o+位X,叫做权重向量,BO叫做偏置(bias)0Seealso关于超平面的更加详细的说明可以参考T.Hastie,R.Tibshirani和J.H.Friedman的书籍ElementsofStatisticalLearning,section4.5(SeperatingHyperplanes)o最优超平面可以有无数种表达方式,即通过任意的缩放B和%。习惯上我们使用以下方式来表达最优超平面o+=l式中X表示离超平面最近的那些点。这些点被称为支持向量*。该超平面也称为*canonical超平面.通过几何学的知识,我们知道点X到超平面(B,BO)的距离为:

4、孑*o+distance=Mp特别的,对于canonical超平面,表达式中的分子为1,因此支持向量到canonical超平面的距离是o+1distancesupportVeCtOrS=ipii=jjjj刚刚我们介绍了间隔(margin),这里表示为M,它的取值是最近距离的2倍:M=ll最后最大化M转化为在附加限制条件下最小化函数L(B)0限制条件隐含超平面将所有训练样本Xi正确分类的条件,minL()=-2subjecttoyi(xi+o)1i,式中Ui表示样本的类别标记。这是一个拉格朗日优化问题,可以通过拉格朗日乘数法得到最优超平面的权重向量B和偏置%。源码include#includei

5、nclude4usingnamespacecv;678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152intmain()/Dataforvisualrepresentationintwidth=512,height=512;Matimage=Mat:zeros(height,width,CV8UC3);/Setuptrainingdatafloatlabels4=1.0,-1.0,-1.0,-1.0;MatIabelsMat(3,1,CV_32FC1,labels);f

6、loattrainingData42=501,10,255,10,501,255,10,501;MattrainIngDataMat(3,2,CV32FC1,trainingData);/SetupSVMsparametersCvSVMParamsparams;params,svmtype=CvSVM:C_SVC;params,kernel=CvSVM:LINEAR;params,termcrit=CvTermCriteria(CVTERMCRITITER,100,le-6);/TraintheSVMCvSVMSVM;SVM.train(traiFiingDataMat,IabelsMat,M

7、at(),Mat(),params);Vec3bgreen(0,255,0),blue(255,O,O);/ShowthedecisionregionsgivenbytheSVMfor(inti=0;iimage,rows;+i)for(intj=0;jimage,cols;+j)MatSampleMat=(Mat(1,2)i,j);floatresponse=SVM.predict(sampleMat);if(response=1)image.at(j,i)二green;elseif(response二二-1)image.at(j,i)二blue;)/Showthetrainingdatai

8、ntthickness=-1;intIineType=8;thickness,thickness,thickness,circle(image,Point(501,10),5,Scalar(0,0,0),IineTyPe);circle(image,Point(255,10),5,Scalar(255,255,255),IineType);circle(image,Point(501,255),5,Scalar(255,255,255),IineTyPe);circle(image,Point(10,501),5,Scalar(255,255,255),thickness,51IineType

9、);5556 Showsupportvectors57 thickness=2;58 IineType=8;intc=SVM.getsupportvectorcount();6061 for(inti=0;i2)。这个参数定义在CVSVMParamS.svm_type属性中.NoteCvSVM:C_SVC类型的重要特征是它可以处理非完美分类的问题(及训练数据不可以完全的线性分割)。在本例中这一特征的意义并不大,因为我们的数据是可以线性分割的,我们这里选择它是因为它是最常被使用的SVM类型。oSVM核类型.我们没有讨论核函数,因为对于本例的样本,核函数的讨论没有必要。然而,有必要简单说一下核函数

10、背后的主要思想,核函数的目的是为了将训练样本映射到更有利于可线性分割的样本集。映射的结果是增加了样本向量的维度,这一过程通过核函数完成。此处我们选择的核函数类型是CvsvM-LINEAR表示不需要进行映射。该参数由CVSVMParamS.kereLtyPe属性定义。O算法终止条件SVM训寮的过程就是一个通过迭代方式解决约束条件下的二次优化问题,这里我们指定一个最大迭代次数和容许误差,以允许算法在适当的条件下停止计算。该参数定义在CVTermCriteria结构中。3 .训练支持向量机调用函数CvSVhZLtrain来建立SVM模型。CvSVMSVM;SVM.train(trainingData

11、Mat,IabelsMat,Mat(),Mat(),params);4 .SVM区域分割函数CVSVMpredict通过重建训练完毕的支持向量机来将输入的样本分类。本例中我们通过该函数给向量空间着色,及将图像中的每个像素当作卡迪尔平面上的一点,每一点的着色取决于SVM对该点的分类类别:绿色表示标记为1的点,蓝色表示标记为-1的点。Vec3bgreen(0,255,0),blue(255,0,0);for(inti=0;iimage,rows;+i)for(intj=0;jimage,cols;+j)(MatSampleMat=(Mat_(1,2)i,j);floatresponse=SVM.p

12、redict(sampleMat);if(response=1)image.at(j,i)=green;elseif(response=-1)image.at(j,i)-blue;)5 .支持向量这里用了几个函数来获取支持向量的信息。函数CVSVM:SUPPortVeCtOrCOUE输出支持向量的数量,函数CvSVtVhqetSUDPortVeCtOr根据输入支持向量的索引来获取指定位置的支持向量。通过这一方法我们找到训练样本的支持向量并突出显示它们。intc-SVM.get_support_vector_count();for(inti=0;ioz-I关于参数C的选择,明显的取决于训练样本的

13、分布情况。尽管并不存在一个普遍的答案,但是记住下面几点规那么还是有用的:-C比拟大时分类错误率较小,但是间隔也较小。在这种情形下,错分类对模型函数产生较大的影响,既然优化的目的是为了最小化这个模型函数,那么错分类的情形必然会受到抑制。-C比拟小时间隔较大,但是分类错误率也较大。在这种情形下,模型函数中错分类之和这一项对优化过程的影响变小,优化过程将更加关注于寻找到一个能产生较大间隔的超平面。源码你可以从OPenCV源码库文件夹samples/cpptutorial_code/gpunon_linear-svms/non_linear_svms下载源码和视频,或者从此处下载.!include#i

14、nclude#include#include56#CIefineNTRAINING_SAMPLES100/Numberoftrainingsamplespericlass#defineFRAC_LINEAR_SEP0.9f/Fractionofsampleswhich0composethelinearseparablepart1()usingnamespacecv;12usingnamespacestd;13Iintmain()15 16 DataforvisualrepresentationconstintWIDTH=512,HEIGHT=512;18 MatI=Mat:zeros(HEIG

15、HT,WIDTH,CV_8UC3);192()/、7.Setuptrainingdatarandomly21MattrainData(2*NTRAINING_SAMPLES,2,CV_32FC1);Matlabels(2*NTRAINING_SAMPLES,1,CV_32FC1);24RNGrng(100);Randomvaluegenerationclass2627SetupthelinearlyseparablepartofthetrainingdataintnLinearSamples(int)(FRAC_LINEAR_SEP*NTRAINING_SAMPLES);293Generate

16、randompointsfortheclass1MattrainClasstrainData.rowRange(0,nLinearSamples);32Thexcoordinateofthepointsisin0,0.4)Matc二trainClass.colRange(0,1);rng.fill(c,RNG:UNIFORM,Scalar(I),Scalar(0.4*WIDTH);35TheycoordinateofthepointsisinO,1)c二trainClass.colRange(l,2);rng.fill(c,RNG:UNIFORM,Scalar(I),Scalar(HEIGHT

17、);3839Generaterandompointsfortheclass2trainClasstrainData.rowRange(2*NTRAINING_SAMPLES-nLinearSamples,412*NTRAINING_SAMPLES);12/Thexcoordinateofthepointsisin0.6,1c二trainClass.colRange(0,1);rng.fill(c,RNG:UNIFORM,Scalar(0.6*WIDTH),Scalar(WIDTH);IbTheycoordinateofthepointsisinO,1)c二trainClass.colRange

18、l,2);47484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192-rng.fill(c,RNG:UNIFORM,Scalar(I),Scalar(HEIGHT);Setupthenon-HnearIyseparablepartofthetrainingdata/Generaterandompointsfortheclasses1and2trainClass=trainData.rowRange(nLinearSamples,2*NTRAINING_SAMPLES-

19、nLinearSamples);/Thexcoordinateofthepointsisin0.4,0.6)c二trainClass.colRange(0,1);rng.fill(c,RNG:UNIFORM,Scalar(0.4WIDTH),Scalar(0.6WIDTH);/TheycoordinateofthepointsisinOf1)c二trainClass.colRange(l,2);rng.fill(c,RNG:UNIFORM,Scalar(I),Scalar(HEIGHT);/,Setupthelabelsfortheclasseslabels.rowRange(0,NTRINI

20、NG,SMPLES).setTo(l);/Class1labels.rowRange(NTRAINING_SAMPI,ES,2*NTRAINING.SAMPLES),setTo(2);/Class2/-2,SetupthesupportvectormachinesparametersCvSVMParamsparams;params,svmtype=SVM:CSVC;params.C=0.1;ParamS.kerneltype=SVM:LINEAR;params,termcrit二TermCriteria(CVTERMCRITITER,(int)le7,le-6);/-3.Trainthesvm

21、cout”Startingtrainingprocessendl;CvSVMsvm;svm.train(trainData,labels,Mat(),Mat(),params);cout,Finishedtrainingprocessendl;/、4.ShowthedecisionregionsVec3bgreen(0,100,0),blue(100,0,0);for(inti=0;iI.rows;+i)for(intj=0;jI.cols;+j)IMatSampleMat二(Mat(l,2)i,j);floatresponse=svm.predict(sampleMat);939495969

22、79899100101102103104105106107108109110111112113114115116117118解释/-if (response = 1)else if (response = 2) I. at(j, i) = green;I. at(j, i)= blue;5. Showthetrainingdataintthick=-1;intIineType=8;floatpx,py;/Class1for(inti=0;iNTRAINING_SAMPLES;+i)(px二trainData.at(i,0);py二trainData.at(i,1);circle(I,Point

23、int)px,(int)py),3,Scalar(0,255,0),thick,IineType);)/Class2for(inti=NTRAINING_SAMPLES;i2*NTRAINING_SAMPLES;i)(px二trainData.at(i,0);py二trainData.at(i,1);circle(I,Point(int)px,(int)py),3,Scalar(255,0,0),thick,IineType);)/6.Showsupportvectorsthick=2;IineType=8;intx=svm.getsupportvector_count();for(inti

24、0;ix;+i)(constfloat*v=svm.get_supportvector(i);circle(I,Point(int)v0,(int)vl),6,Scalar(128,128,128),thick,IineType);imwrite(z,result.pngzz,I);/savetheImageimshow(z,SVMforNon-LinearTrainingData,I);/showittotheuserWaitKey(O);1.建立训练样本本例中的训练样本由分属于两个类别的2维点组成。为了让程序更加吸引人,我们用均匀概率密度函数(PDF)随机生成样本.我们将样本的生成代码分

25、成两局部。在第一局部我们生成两类线性可分样本/class1随机样本生成MattrainClasstrainData.rowRange(0,nLinearSamples);/X坐标范围Of0.4)Matc二trainClass.ColRange(0,1);rng.fill(c,RNG:UNIFORM,Scalar(I),Scalar(0.4*WIDTH);y坐标范围0,1)c二trainClass.ColRange(1,2);rng.fill(c,RNG:UNIFORM,Scalar(I),Scalar(HEIGHT);Z/class2随机样本生成trainClass二trainData.row

26、Range(2*NTRAINING_SAMPLES-nLinearSamples,2*NTRAINING,SAMPLES);/X坐标疝围0.6f1c=trainClass.ColRange(0,1);rng.fill(c,RNG:UNIFORM,Scalar(0.6*WIDTH),Scalar(WIDTH);y坐标范围0,1)c二trainClass.ColRange(1,2);rng.fill(c,RNG:UNIFORM,Scalar(I),Scalar(HEIGHT);在第二局部我们同时生成重叠分布线性不可分的两类样本./classes1,2随机样本生成trainClass-trainDa

27、ta.rowRange(nLinearSamples,2*NTRAINING_SAMPLES-nLinearSamples);/x坐标范围0.4,0.6)c=trainClass.ColRange(0,1);rng.fill(c,RNG:UNIFORM,Scalar(0.4*WIDTH),Scalar(0.6*WIDTH);y坐标范围0f1)c-trainClass.colRange(l,2);rng.fill(c,RNG:UNIFORM,Scalar(I),Scalar(HEIGHT);2 .设置SVM参数Seealso前一节支持向量机(SVM)介绍提到r类CVSVMParamS中的一些参数

28、需要在训练SVM之前设置。CvSVMParamsparams;params.svm_typeSVM:C_SVC;params.CO.1;params.kernel_typeSVM:LINEAR;params,termcrit=TermCriteria(CVTERMCRITITER,(int)le7,le-6);这里的设置和前一方的设置有两处不一样的地方CvSVM:C_SVC.此处取值较小,目的是优化时不过分惩罚分类错误。这样做的目的匈了得到一个与直觉预期比拟接近的分隔线。您可以通过调整该参数来加深你对问题的理解。Note这里在两类之间重叠区域的点比拟少,缩小FRACJJNEAR-SEP会增加不

29、可分区域的点数,此时CvSVM:C_SVC参薮的调整后结果的影响深远。算法终止条件.最大迭代次数需要显著增加来容许非线性可分的训练数据,这里的最大迭代设置是前一节的10的5次方倍。3 .训练支持向量机调用函数CvSVhZLtrain来建立SVM模型。注意训练过程可能耗时比拟长,您需要多一点耐心来等待。CvSVMsvm;svm.train(trainData,labels,Mat(),Mat(),params);4 .SVM区域分割函数CVSVMpredict通过重建训练完毕的支持向量机来将输入的样本分类。本例中我们通过该函数给向量空间着色,即将图像中的每个像素当作卡迪尔平面上的一点,每一点的着

30、色取决于SVM对该点的分类类别:深绿色表示分类为1的点,深蓝色表示分类为2的点。Vec3bgreen(0,100,0),blue(100,0,0);for(inti=0;iI.rows;+i)for(intj=0;jI.cols;+j)(MatSampleMat=(Mat_(1,2)i,j);floatresponse=svm.predict(sampleMat);if(response=1)I.at(j,i)二green;elseif(response-2)Lat(j,i)=blue;)5 .显示训练样本日数drc被用来显示训练样本。标记为1的样本用浅绿表示,标记为2的样本用浅蓝表ZjSoi

31、ntthick=-1;intIineType=8;floatpx,py;/Class1for(inti=O;iNTRAINING_SAMPLES;+i)(px=trainData.at(i,O);py-trainData.at(i,1);circled,Point(int)px,(int)py),3,Scalar(O,255,O),thick,IineType);/Class2for(inti=NTRAINING_SAMPLES;i2*NTRAINING_SAMPLES;+i)(px=trainData.at(i,O);py-trainData.at(i,1);circled,Point(in

32、t)px,(int)py),3,Scalar(255,O,O),thick,IineType);)6 .支持向量这里用了几个函数来获取支持向量的信息。函数CVSVM:qetSUPPortVeCtorCOUm输出支持向量的数量,函数CVSVM:qetSUPPortVeCtor根据输入支持向量的索引来获取指定位置的支持向量。通过这一方法我们找到训练样本的支持向量并突出显示它们。thick=2;IineType=8;intX=SVin.getsupportvectorcount();for(inti=O;ix;+i)(constfloat*v=svm.getsupportvector(i);circle(I,Point(int)v0,(int)vl),6,Scalar(128,128,128),thick,IineType);结果- 程序创立了一张图像,在其中显示了训练样本,其中一个类显示为浅绿色圆圈,另一个类显示为浅蓝色圆圈。- 训练得到SVM,并将图像的每一个像素分类。分类的结果将图像分为蓝绿两局部,中间线就是最优分割超平面。由于样本非线性可分,自然就有一些被错分类的样本。一些绿色点被划分到蓝色区域,一些蓝色点被划分到绿色区域。- 最后支持向量通过灰色边框加重显示。你可以在YoUTUbe观看本程序的实时运行.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 数据结构与算法

宁ICP备18001539号-1