模式识别课程大作业报告.docx

上传人:b****7 文档编号:23994026 上传时间:2023-05-23 格式:DOCX 页数:23 大小:766.56KB
下载 相关 举报
模式识别课程大作业报告.docx_第1页
第1页 / 共23页
模式识别课程大作业报告.docx_第2页
第2页 / 共23页
模式识别课程大作业报告.docx_第3页
第3页 / 共23页
模式识别课程大作业报告.docx_第4页
第4页 / 共23页
模式识别课程大作业报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

模式识别课程大作业报告.docx

《模式识别课程大作业报告.docx》由会员分享,可在线阅读,更多相关《模式识别课程大作业报告.docx(23页珍藏版)》请在冰豆网上搜索。

模式识别课程大作业报告.docx

模式识别课程大作业报告

模式识别课程大作业报告

-支持向量机(SVM的实现

姓名:

学号:

专业:

任课教师:

研究生导师:

内容摘要

支持向量机是一种十分经典的分类方法,它不仅是模式识别学科中的重要内容,而且在图像处理领域中得到了广泛应用。

现在,很多图像检索、图像分类算法的实现都以支持向量机为基础。

本次大作业的内容以开源计算机视觉库OpenCV为基础,编程实现支持向量机分类器,并对标准数据集进行测试,分别计算出训练样本的识别率和测试样本的识别率。

本报告的组织结构主要分为3大部分。

第一部分简述了支持向量机的原理;第二部分介绍了如何利用OpenCV来实现支持向量机分类器;第三部分给出在标准数据集上的测试结果。

、支持向量机原理概述

在高维空间中的分类问题实际上是寻找一个超平面,将两类样本分开,这个

超平面就叫做分类面。

两类样本中离分类面最近的样本到分类面的距离称为分类间隔。

最优超平面指的是分类间隔最大的超平面。

支持向量机实质上提供了一种利用最优超平面进行分类的方法。

由最优分类面可以确定两个与其平行的边界超平面。

通过拉格朗日法求解最优分类面,最终可以得出结论:

实际决定最优分类面位置的只是那些离分类面最近的样本。

这些样本就被称为支持向量,它们可能只是训练样本中很少的一部分。

支持向量如图1所示。

O

图1

图1中,H是最优分类面,H1和H2别是两个边界超平面。

实心样本就是支持向量。

由于最优超平面完全是由这些支持向量决定的,所以这种方法被称作支持向量机

(SVM)。

以上是线性可分的情况,对于线性不可分问题,可以在错分样本上增加一个惩罚因子来干预最优分类面的确定。

这样一来,最优分类面不仅由离分类面最近的样本决定,还要由错分的样本决定。

这种情况下的支持向量就由两部分组成:

一部分是边界支持向量;另一部分是错分支持向量。

对于非线性的分类问题,可以通过特征变换将非线性问题转化为新空间中的线性问题。

但是这样做的代价是会造成样本维数增加,进而导致计算量急剧增加,这就是所谓的“维度灾难”。

为了避免高维空间中的计算,可以引入核函数的概念。

这样一来,无论变换后空间的维数有多高,这个新空间中的线性支持向量机求解都可以在原空间通过核函数来进行。

常用的核函数有多项式核、高斯核(径向基

核)'Sigmoid函数。

、支持向量机的实现

OpenCV是开源计算机视觉库,它在图像处理领域得到了广泛应用。

OpenCV中包含许多计算机视觉领域的经典算法,其中的机器学习代码部分就包含支持向量机的相尖内容。

OpenCV中比较经典的机器学习示例是“手写字母分类”。

OpenCV中给出了用支持向量机实现该示例的代码。

本次大作业的任务是研究OpenCV中的支持向量机代码,然后将其改写为适用于所有数据库的通用程序,并用标准数据集对算法进行测试。

本实验中使用的OpenCV版本是244,实验

平台为VisualStudio2010软件平台。

OpenCV读取的输入数据格式为“.data”文件。

该文件记录了所有数据样本的特征向量和标签。

OpenCV自带的“letter-recognition”数据集是手写字母数据集。

其中共包含20000个样本,前16000个用来训练,后4000个用来测试。

样本是16维的特征向量。

每条样本在文件中按行存放。

每行共有17个字段,第1个字段是样本的标签,以字符形式给出;后面16个字段分别是样本的16个特征,以数字形式给出。

所有字段之间均以逗号分隔。

Tj2a8j3j5打&130,6八1Oj比0』&0,8

I,512a3,7,£10,5,5,431333』9,Z8,£10

D,£11,6,&6,10,6.2E10,3一九3,7,3_9N.L11,6・6,3,5玄4,乞4,4,珂6」10,2sQ&1,3L,1,8,6,6>6f6,5,9』1』J5,10

St<11,5,8j3j8j&6,9,5,6,6jOj&9;7氐4,2,54,48,J6,6.7.6.6理&7,10hLf1,3,2,1,&N2,2,8j2,&1j6j2,7

J,ZN24,210,6,Z6,12,4,&b6,1,T

JI,11,15,13,9,7,13,Z6,2,12.1,9,8,1,h3X,3,9,5,7,&7,3,8,5,6,&N&6f7

Q6,13,47,£6*7,氐3.10.J玄5』9,5「8

图2

图2中展示了“・dat*文件中样本的存储样式。

自行生成“.data”文件的过程十分简单。

只需要新建一个“.txt”文件,对其内容进行修改之后,直接把后缀改为".data'即可。

在OpenCV给出的支持向量机示例程序中5可调参数大约有十多个5这些参数的调整比较复杂。

为了方便使用该程序,可以将其中重要的参数从程序段中挑选出来,并制作宏定义。

这些重要参数包括:

总样本个数、用于训练的样本个数

(总样本个数-训练样本个数二测试样本个数)、特征向量的维数、选取的核函数类

型。

可调参数如图3所示:

/**«**殳置文f牛3&径*»**1*卜1*******:

***#***/

#deflnePATH11./letter-teccgnition.data"

/*****水******$「******)殳皆样本个数**木釈*********木****:

+*/

JfdeflneSAMPLE20000

/*****************:

殳詈|练样本个勘*****床*****农**

AdefineTRAIN16000

/*****************设養特征向蛍维數**c********B******B*7

AdefineVECTOR16

/*和****和******和*诜軽核頤埶类理**卜[****************/

#definaKERNEL1"KERNEL養数说明;佃纸性檢攻i压參项式核函繳;左遵向葛(高斷)核函册4勺1師0诃函数图3

在更换新的数据集时,只需要在宏定义部分修改“PATH”后的路径即可,其他

参数的修改也都在这里进行,无需再到代码段内进行修改。

其中,宏定义

“KERNEL"用来确定SVM采用何种核函数。

执行程序后,可以显示出训练样本和测试样本的识别率。

通过将程序中分类

数组的值输出,还可以在原有程序基础上添加显示测试样本标签的功能。

 

uletter-recognitioif数据集进行分类得到的结果如图4所示:

八5980=W:

;

A98L=B:

;r39ft2=F

|:

;A984-F■/

R39H54

:

;八98&=M

JT3997-

c:

;5时・i

J.阳翊・fl

■2r3990-P

图4展示了4000个测试样本标签和训练样本识别率以及测试样本识别率。

可以

观察到训练样本的识别率为64.36%,测试样本的识别率为60.75%。

将图4中展

徨试祥丿⑥鹑廡I诲书》3?

99领且梯*4盹()严zc逅不识号钟识另

L

示的测试样本标签与“.data"文件中的标签对比,可以直观地观察到哪个数据判断错误。

图5展示了程序输出的测试样本标签与

•data”文件中标签的对应尖

 

观察图5可以发现,第一行字母P的识别是正确的,而第三行的预测出现了错误。

样本集中的数据为“0”,但支持向量机将其错分为“B”。

按上述方法可以

对照测试样本的预测结果是否正确。

接下来,采用其他核函数进行分类。

图6

展示的是径向基函数的分类效果。

观察图6可以看出,采用径向基函数可以获得极高的样本识别率,可达100%。

但是测试样本的识别率为51.25%,比起线性基函数有所下降,说明其泛化能力

(即推广能力)有限。

测试表明,对于“letter-recognition',采用多项式基函数

和Sigmoid基函数分类的识别率更低,因此对此数据集的分类应该采用线性核函数。

三、标准数据集测试

前一部分展示了OpenCV自带的"letter-recognition"数据集的测试效果。

为了测试编写的程序的通用性,接下来对其他标准数据集进行测试。

数据集可以从

“”下载,这个网址上提供了上万个用于机器学习的数据集。

接下来分别展示

“iris”数据集和“wine”数据集上的测试结果。

(1)“iris"数据集

“iris”数据集是莺尾花数据集。

其中共包含150个样本,每个样本是一个4维的特征向量,这4个特征分别是萼片长度、萼片宽度、花瓣长度和花瓣宽度。

数据的标签总共有三类:

“S”代表刺芒野古草,“E”代表杂色莺尾花,“厂代表维尔吉尼卡。

它们分别是三种不同的莺尾花品种。

该数据集如图7所示:

iriS.ddta_i斥事本

在本实验中,用前130个数据作为训练样本,后20个数据作为测试样本选定相

应的参数如图8所示:

/:

籽尊水草朮3|:

席电斗東朮當斗字呻家斗車1殳羞文件路怪尊*尊*專床事*專*尊*尊*專水尊槪專除/

#definePATH”./iris,data'r

/草*尊*」广當*專4cjfc*專*案琢案珮常设蚤样本个救珮*事*审常4严4c*暮噹*車*尊暮窗可

*/

#defineSAMPLE150

^defineTRAIN130

#defineVECTOR4

IlEIr]WASAfc*****A***********A/

/**#*#*#*#*jK****5ic*iA

★★*****★★★*先*****

/•常M當*當當當當*幕當當*當酩當*选择核函数类型*寓*曹*幫*倉常曹*塞常勒*事塞堂常厂

#defineKERNEL1

//KERNEL蜃数说明:

“线性複函数*凸多顼式樓函埶;孔轻向墓〈高斯)核画数*“酣酣01硒数*/童噹常******案*字老*忒*忒*电*电*嘩*电*电*策常巔*當當當常期*聚*當常秦常聚*:

机麒*(

图8中,选取核函数为线性核函数。

按照图8所示的参数执行程序,得到的结果

如图9所示:

图9

由图9可知,对于“iris”数据集,训练样本的识别率为98.46%,测试样本的识别率为90.00%。

由数据可以看出,支持向量机对“ids”数据集的分类效果显然要优于Mletter-recognition,数据集。

这可能和数据集本身有尖,“iris”数据集特征的可分性更好。

接下来,变换核函数来观察分类效果。

图10是采用径向基核函数得到的结

果。

图10

图10中,训练样本的识别率比采用线性核函数时略有提升,但测试样本的识别率没有变化,因此可以认为采用径向基核函数与线性核函数的分类效果是基本相同的。

当采用Sigmoid函数进行分类时,分类效果显然要差很多。

该分类效果如图11所示。

 

9/201.

图11中,训练样本和测试样本的识别率都很低,因此“iris"数据集显然不适合

用Sigmoid函数进行分类。

以上实验结果表明,核函数的选取对于支持向量机的分类效果有至尖重要的影响。

(2)“wine”数据集

“wine”数据集是红酒数据集。

其中共包含178个样本,每个样本是一个

13维的特征向量,其中包含酒精度、年份等特征。

数据的标签总共有三类:

“M”、

“H”、“L”。

它们分别代表三类不同的红酒。

该数据集如图12所示:

L13.58.2.5&2.S9.24.5.1Q5-1.55…因…39h54.8.66..74.1.8.750L13-4.4.6,2.瓯

25,112,1.9&.27,1.11,8.5,.67,1.92.(30

L12.2,3,03,2.32,1A睥!

_2瓦・4%,,73,反5』托£83,510

U12-77,2.39,S.2D,19.瓦86,1.39..51,.43,.妣9.899993,.57,1.63,4T01,13.77,1.9,2.68,17.L115,3.2.

T9_・1.68f氐3,1.13,2.93,1375

1,13.1.6T,2.Z5,1&出113,2.&.2,也.21,1•也,乩鬲…羁3.2,1060

1,13.56」・73,2-46,20.5116,2”96j2.73,.2,2.45,6.25•9&3.03,1120L14,2Z1.7,2.3,16.3,11出3.Z3,・碱2.D3,6*3&—94,3,31,970A13.29,1.97,2.碣16.&10A3,3.23,.31.1.66,$1.07,2.84,12T07,13.72,1.

4%S.E;*1E-厶108j3,4,3.67,.19,2.04,&&.S缶2.87,1235比11*87,4.31,S.39,21,82,2.85f3.03,.21,

2.91,2.8t.75,3.64,380庄12.JL2.16,2.LT,21,85,2.6,2.隔.37,L35,2.76,.86,3.28,3T8H,12.43,].53,2.29?

21.5,86,2.74,3.15,.3%1.F7,3.処.檢込84,352All.79,2.13,2.78,28.反92,込13f2,24..5&1.76,3...9化2.44,466H,12.37,1.鸥3.£24.S,呕2.22,2.酝.4昇.爲2.12,.89,272,342比12.04,4.3,2.3S,22,80,2.1丄理.42,1.3反2.瓦.7%2.硏,580U14.1&2.51,2.4&20,91,1.63,.7,.44,1.24,9.7,.6&1.71,660U13.17,5.隔2.45,20.玄951.憾.61,.鸥1.06,7.7..鸥1.珂T®L.13-4,3.91,2.48,23,102,1.8,.75,.43,1,41,7,

3,.7,1,56J50

图12

本实验用前125个数据作为训练样本,后53个数据作为测试样本。

选定相应

的参数如图13所示:

/*******************i殳蛊文F牛貉彳圣*************相#*****

#definePATH"・/wine.datX

/*******************设蛊木韦不吓数**»*w********4cw**4nk#y

«d«fineSAMPLE178

/»***»*»***»*****”设養训镰样本个敎*****************审/

#deflneTRAIN125

/**************#+:

.+ixS特征向量维數***********壮*****!

./

#defineVECTOR13

/****:

**************选择核函数类型He**#********:

+:

#水*朮*・

#defineKEKHEL1

nKEEHEL番数说明;二结■,性檢函数iN多项式檢函数丨奔径向棊〔高斯)核函制H:

sigmoid囲数。

田田田用田曰a田qr布:

田用田十手^bhH3m-M*esrmmmm目minmTuea-H-上卜r

图13中,核函数选定为线性核函数。

按照上述参数设置执行程序,得到的结果

如图14所不:

if/

不识号〔率训怨悴卞识另■悻二8&BWK漂谥

标*识島垒二37.74X

图14

由图14可得,对于“winen数据集,训练样本的识别率为88.00%,测试样本的识别率为37.74%。

训练样本的识别率较高,但测试样本的识别率却较低。

这说明该学习过程的泛化能力较差。

这可能由于样本数量有限,支持向量机方法很难从这么有限的样本中训练出较为理想的分类器。

接下来,尝试采用其他核函数的分类效果。

结果发现,其他和函数的分类效果并没有线性核函数的分类效果好。

当采用径向基核函数时,训练样本的识别率可达100%,但测试样本的识别率变得非常低。

该结果如图15所示。

图15

可见,对于“wine”数据集来讲,采用径向基核函数虽然能使训练样本识别率最高,但其泛化能力最差,因此对解决实际问题没有任何帮助。

综合比较上述结果,可以发现径向基函数在大多数情况下都可以获得较高的训练样本识别率,即经验风险很小。

但是,测试样本的识别率无法保证,对于某些数据集的泛化能力有限。

致谢

今后,我会从事机器学习方向的研究。

模式识别课程的内容对我的专业方向有很大帮助,令我受益匪浅。

尤其是在本次大作业过程中,支持向量机的编程实现工作大大加深了我对支持向量机原理的理解,为我今后的研究工作打下了坚实基础。

模式识别课程的学习是我研究道路上的一个良好幵端,具有十分重要的意义。

本学期的模式识别课程令我受益颇多。

在此,诚挚地感谢李建更老师的辛勤付出!

附录:

源程序代码

#ineludeHopencv2/core/corec.hH

#ineludenopencv2/ml/ml.hppH

#inelude

#inelude

 

/*******************

N[^^^■^|/|"^^.********************/

#definePATH,f./letter-recognition.datan

 

/*******************

N^j^********************/

#defineSAMPLE20000

 

/*****************

人设置训幺练样本个“*"决女“*"^女"/

 

#defineTRAIN16000

 

/*****************

人设置特征向量维女*舟***舟舟*★******"**/

#defineVECTOR16

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★it*

y****/

staticintread_num_class_data(constchar*,intvar_count,

CvMat**data,CvMat**responses){

constintM=1024;

FILE*f=fopen(,nrt");

CvMemStorage*storage;

CvSeq*seq;

charbuf[M+2];

float*el_ptr;

CvSeqReaderreader;

inti,j;

if(!

f)

return0;

el_ptr=newfloat[var_count+1];

storage=cvCreateMemStorage();

seq=cvCreateSeq(0,sizeof(*seq),(var_count+1)*sizeof(float),storage);

char*ptr;

if(!

fgets(buf,M,f)||!

strchr(buf/,'))break;

el_ptr[0]=buf[O];

ptr=buf+2;

for(i=1;i<=var_count;i++)

{

intn=0;

sscanf(ptr,H%f%nf,,el_ptr+i,&n);ptr+=n+1;

if(i<=var_count)

break;

cvSeqPush(seq,el_ptr);

fclose(f);

*data=cvCreateMat(seq->total5var_count,CV_32F);

*responses=cvCreateMat(seq->total,1,CV_32F);

cvStartReadSeq(seq,&reader);

for(i=0;itotal;i++)

{

constfloat*sdata=(float*)reader.ptr+1;float*ddata=data[0]->data.fl+var_counfl;

float*dr=responses[0]->data.fl+i;

for(j=0;j

ddata[j]=sdata[j];

*dr=sdata[-1];

CV_NEXT_SEQ_ELEM(seq->elem_size,reader);

cvReleaseMemStorage(&storage);

delete[]el_ptr;

return1;

}staticintbuild_svm_classifier(char*data_)

支持向量机分类器**/

CvMat*data=0;

CvMat*responses=0;

CvMattrain_data;

intnsamples_all=0,ntrain_samples=0;

intvar_count;

CvSVMsvm;

intok=read_num_class_data(data_,VECTOR,&data,&responses);

if(!

ok)

%s\rT,data_);

printf(”无法读取数据库return-1;

SVM

CvSVMParamsparam;

param.kernel_type=CvSVM:

:

LINEAR;

param.svm_type=CvSVM:

:

C_SVC;

param.C=1;

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★it***

printfC*数据库%s已经被加载\n”,data_);nsamples_all=SAMPLE;

ntrain_samples=TRAIN;

var_count=data->cols;

★★★★★★★★★★★★★★★★★if****

训1练分类人器

printfC*正在训练SVM分类器...\n”);

cvGetRows(data,&train_data,0,ntrain_samples);

CvMat*train_resp=cvCreateMat(ntrain_samples,1,for

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

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1