ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:36.81KB ,
资源ID:4808688      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4808688.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(SVM算法实验实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

SVM算法实验实验报告.docx

1、SVM算法实验实验报告svm分类算法 一、 数据源说明 1、 数据源说远和理解: ticeval2000.txt: 这个数据集是需要预测( 4000个客户记录)的数据集。它和ticdata2000.txt它具有相同的格式,只是没有最后一列的目标记录。我们只希望返回预测目标的列表集,所有数据集都用制表符进行分隔。共有4003(自己加了三条数据),根据要求,用来做预测。 tictgts2000.txt:最终的目标评估数据。这是一个实际情况下的目标数据,将与我们预测的结果进行校验。我们的预测结果将放在result.txt文件中。 数据集理解:本实验任务可以理解为分类问题,即分为2类,也就是数据源的第

2、86列,可以分为0、1两类。我们首先需要对ticdata2000.txt进行训练,生成model,再根据model进行预测。 2、 数据清理 代码中需要对数据集进行缩放的目的在于: a、避免一些特征值范围过大而另一些特征值范围过小; b、避免在训练时为了计算核函数而计算内积的时候引起数值计算的困难。因此,通常将数据缩放到 -1,1 或者是 0,1 之间。 二、 数据挖掘的算法说明 1、 svm算法说明 2、 实现过程 在源程序里面,主要由以下2个函数来实现: (1) struct svm_model *svm_train(const struct svm_problem *prob, cons

3、t struct svm_parameter *param); 该函数用来做训练,参数prob,是svm_problem类型数据,具体结构定义如下: struct svm_problem /存储本次参加运算的所有样本(数据集),及其所属类别。 int n; /记录样本总数 double *y; /指向样本所属类别的数组 struct svm_node *x; /指向一个存储内容为指针的数组 ; 其中svm_node的结构体定义如下: struct svm_node /用来存储输入空间中的单个特征 int index; /输入空间序号,假设输入空间数为m double value; /该输入空间

4、的值 ; 所以,prob也可以说是问题的指针,它指向样本数据的类别和输入向量,在内存中的具体结构图如下: 图1.1libsvm训练时,样本数据在内存中的存放结构 只需在内存中申请n*(m+1)*sizeof(struct svm_node)大小的空间,并在里面填入每个样本的每个输入空间的值,即可在程序中完成prob参数的设置。 参数param,是svm_parameter数据结构,具体结构定义如下: struct svm_parameter / 训练参数 int svm_type; /svm类型, int kernel_type; /核函数类型 int degree; /* for poly

5、*/ double gamma; /* for poly/rbf/sigmoid */ double coef0; /* for poly/sigmoid */ /* these are for training only */ double cache_size; /* in mb 制定训练所需要的内存*/ double eps; /* stopping criteria */ double c; /* for c_svc, epsilon_svr and nu_svr ,惩罚因子*/ int nr_weight; /* for c_svc 权重的数目*/ int *weight_label

6、; /* for c_svc 权重,元素个数由nr_weight 决定*/ double* weight; /* for c_svc */ double nu; /* for nu_svc, one_class, and nu_svr */ double p; /* for epsilon_svr */ int shrinking; /* use the shrinking heuristics 指明训练过程是否使用压缩*/ int probability; /* do probability estimates 指明是否要做概率估计*/ 其中,svm类型和核函数类型如下: 设定完这两个参数,

7、就可以直接在程序中调用训练函数进行训练了,该其函数返回一个struct svm_model *svm模型的指针,可以使用svm_save_model(const char *model_file_name, const struct svm_model *model)函数,把这个模型保存在磁盘中。至此,训练函数的移植已经完成。 (2) double svm_predict(const struct svm_model *model, const struct svm_node *x); 参数model,是一个svm模型的指针,可以使用函数struct svm_model *svm_load_m

8、odel(const char *model_file_name),导入训练时保存好的svm模型,此函数返回一个svm模型的指针,可以直接赋值给变量model。 参数x,是const struct svm_node结构体的指针,本意是一个输入空间的指针,但实际上,该函数执行的时候,是从参数x处计算输入空间,直到遇到单个样本数据结束标记-1才结束,也就是说,该函数运算了单个样本中的所有输入空间数据。因此,在调用此函数时,必须先把预测样本的数据按图3.4中的固定格式写入内存中。另外,该函数只能预测一个样本的值,本文需要对图像中的所有像数点预测,就要使用for循环反复调用。 该函数返回一个doubl

9、e类型,指明被预测数据属于哪个类。面对两分类问题的时候,通常使用+1代表正样本,即类1;-1代表负样本,即类2。最后根据返回的double值就可以知道预测数据的类别了。 三、 算法源代码及注释说明 1、 需要在工程中添加头文件 svm.h 和源文件svm.cpp 2、 自己编写的源代码(c+实现)(共230行): #include svm.h #include <iostream> #include <list> #include <iterator> #include <vector> #include <string> #incl

10、ude <ctime> using namespace std; #ifdef win32 #pragma warning (disable: 4514 4786) #endif svm_parameter param; svm_problem prob; svm_model *svmmodel; list<svm_node*> xlist; list<double> ylist ; const int max=10; const int ntsttimes=10; vector<int> predictvalue; vector<int&

11、gt; realvalue; int trainnum=0; /设置参数 void setparam() param.svm_type = c_svc; param.kernel_type = rbf; param.degree = 3; param.gamma = 0.5; param.coef0 = 0; param.nu = 0.5; param.cache_size = 40; param.c = 500; param.eps = 1e-3; param.p = 0.1; param.shrinking = 1; / param.probability = 0; param.nr_we

12、ight = 0; param.weight = null; param.weight_label =null; void train(char *filepath) file *fp; int k; int line=0; int temp; if(fp=fopen(filepath,rt)=null) return ; while(1) svm_node* features = new svm_node85+1; for(k=0;k<85;k+) fscanf(fp,%d,&temp); featuresk.index = k + 1; featuresk.value = t

13、emp/(max*1.0) ; features85.index = -1; fscanf(fp,%d,&temp); xlist.push_back(features); ylist.push_back(temp); line+; trainnum=line; if(feof(fp) break; setparam(); prob.l=line;篇二:svm分类器-人脸识别专题报告 svm分类器-人脸识别专题报告 摘要:本次试验报告,介绍了人脸识别方法分类器的设计并进行人脸识别。主要是设计svm分类器,并用来进行人脸分类识别,并对分类器实验结果做出分析。实验主要步骤:首先对图像预处理

14、,转换成向量,再通过pca算法对orl人脸数据库图像进行降维特征提取,运用svm工具箱对数据进行训练,再利用svm分类方法对特征向量进行分类识别,寻找和待识别图片最为接近的训练样本第一张图片。最后在matlab上进行实验仿真,分析实验结果。 关键字:最近邻法、pca算法、多类svm、人脸识别 1.引言 人脸识别是模式识别的一个发展方向和重要应用,人脸检测和识别在安全识别、身份鉴定、以及公安部门的稽查活动中有重要作用。本文主要使用pca算法、多类svm训练和svm分类器设计人脸识别算法。从orl人脸图像数据库中,构建自建人脸训练数据库和测试数据库,采用k-l变换进行特征脸提取,并实现人脸识别。通

15、过k-l变换在人脸识别中的应用,加深对所学内容的理解和认识,进一步加深理解模式识别的算法。 2.人脸识别系统 完整的人脸识别系统至少包括两个主要环节。首先在输入图像中找到人脸的位置即人脸检测,将人脸从背景中检测出来;其次,将检测到的人脸图像进行预处理、特征提取和识别。如下图1所示: 图 1 人脸识别系统虽然有诱人的应用前景,但是在现实中却还没有开始大规模的使用。目前,国内外多所大学和研究机构已研制出一些较好的人脸识别原型系统,一些较成熟的商业人脸识别系统也已投入应用,但从技术的角度来看,大样本集、非可控条件下的稳健识别技术仍不成熟,用计算机自动进行人脸的定位和识别十分困难,目前的识别效果(正确

16、率,速度)不如其他的生物识别技术,如指纹识别,视网膜识别等等。人们在日常生活中就进行了大量的人脸定位和识别工作,当然全部是由人的视觉系统和大脑自动进行的。目前还不清楚人的视觉系统和大脑的工作原理,因此这项人可以轻而易举完成的任务,牵涉到模式识别、图 象处理及生理、心理学等方面的诸多知识,对于目前还只会死板地执行程序指令的计算机来说却是极端困难。 3.算法简述 3.1 pca算法 3.2 svm算法 支持向量机(support vector machine,svm)是在统计学理论的基础上发展起来的新一代学习算法,它在文本分类、手写识别、图像分类、生物信息学等领域中获得较好的应用。相比于容易过度拟

17、合训练样本的人工神经网络,支持向量机对于未见过的测试样本具有更好的推广能力。 svm是一个二分器,只能用于2类样本的分类,现在我们将它推广到多类问题。本文是对svm进行推广到能够处理多类问题。采用一对一的投票策略。将a、 b、c、d 4类样本两类两类的分成训练集,即(a,b)、(a,c)、(a,d)、(b,c)、(b,d)、(c,d),得到6个(对于n类问题,为n(n-1)/2个)svm二分器。在测试的时候,把测试样本x依次送入这6个二分器,采取投票形式,最后得到一组结果。投票是以如下方式进行。 初始化:vote(a)=vote(b)=vote(c)=vote(d)=0. 投票过程:如果使用训

18、练集(a,b)得到的分类器将x判定为a类,则vote(a)=vote(a)+1,否则 vote(b)=vote(b)+1;如果使用(a,c)训练的分类器将x判定为a类,则vote(a)=vote(a)+1,否则vote(c)=vote(c)+1;.;如果使用(c,d)训练的分类器将x判定为c类,则vote(c)=vote(c)+1,否则vote(d)=vote(d)+1。 最终判决:max(vote(a),vote(b),vote(c),vote(d)。如有两个以上的最大值,则一般可以简单地取第一个最大值所对应的类别。 4.实验步骤 该实验选取的是orl人脸数据库作为实验样本,总共40个人,实

19、验样本分为训练样本和测试样本。首先设置训练样本集,选择40个人前5张图片作为训练样本,进行训练,并将训练后的数据存放到multisvmtrain.mat中保存。然后设置测试样本集,将40个人后5张图片作为测试样本,进行选取识别。 实验流程图如下: 整个训练过程,包括读入图像,pca降维,以及多类svm训练,实现的关键代码如下: display(读入人脸数据.); imgrow,imgcol,facecontainer,facelabel=readfaces(nfacesperperson,nperson); . display(pca降维.); pcafaces, w = fastpca(fa

20、cecontainer, 20); % 主成分分析pca % pcafaces是200*20的矩阵, 每一行代表一张主成分脸(共40人,每人5张),每个脸20个维特征 . %数据规格化 display(scaling.); x,a0,b0 = scaling(x); 训练完毕后,将数据保存。 (2)开始识别: 打开一张图片(每个人的后5张中选择),然后对该图片进行pca变换降维,特征提取、规格化,从保存的训练数据库中读取数据,通过svm分类器识别该测试样本的类别,并显示该图片对应人的第一张图片和类别。主要代码如下: % 读入相关训练结果 display(载入训练参数.); load(mat/m

21、ultisvmtrain.mat); xnewface = readaface(newfacepath); % 读入一个测试样本 xnewface = double(xnewface); xnewface = (xnewface-meanvec)*v; % 经过pca变换降维 xnewface = scaling(xnewface,1,a0,b0); xnewface = readaface(newfacepath); % 读入一个测试样本 xnewface = double(xnewface); xnewface = (xnewface-meanvec)*v; % 经过pca变换降维 xne

22、wface = scaling(xnewface,1,a0,b0); (3)最后进行测试: 测试是指分类所有的测试样本(40个人的后50张图像,共200个样本),并计算识别率。主要实现代码如下: nfacesperperson = 5; nperson = 40; btest = 1; % 读入测试集合 display(读入测试集合.); imgrow,imgcol,testface,testlabel = readfaces(nfacesperperson, nperson, btest); % 读入相关训练结果 display(载入训练参数.); load(mat/pca.mat); lo

23、ad(mat/scaling.mat); load(mat/traindata.mat); load(mat/multisvmtrain.mat); % pca降维 display(pca降维处理.); m n = size(testface); testface = (testface-repmat(meanvec, m, 1)*v; % 经过pca变换降维 testface = scaling(testface,1,a0,b0); % 多类 svm 分类 display(测试集识别中.); classes = multisvmclassify(testface); display(.);

24、% 计算识别率 nerror = sum(classes = testlabel); accuracy = 1 - nerror/length(testlabel); display(对于测试集200个人脸样本的识别率为, num2str(accuracy*100), %); 5.实验仿真 该实验在matlab上进行实验仿真,主要包括样本的训练、保存,打开一张待识别图片,然后调用训练数据库,对该图片进行识别,并显示出该人的第一张图片和该人的类别,以及对全部测试样本进行分类,并计算识别率。 实验仿真结果图如下: 篇三:svm算法简介 (一)svm的简介 支持向量机(support vector

25、machine)是cortes和vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。 支持向量机方法是建立在统计学习理论的vc 维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力 (或称泛化能力)。 以上是经常被有关svm 的学术文献引用的介绍,我来逐一分解并解释一下。 vapnik是统计机器学习的大牛,这想必都不用说,他出版的statistical learn

26、ing theory是一本完整阐述统计机器学习思想的名著。在该书中详细的论证了统计机器学习之所以区别于传统机器学习的本质,就在于统计机器学习能够精确的给出学习效果,能够解答需要的样本数等等一系列问题。与统计机器学习的精密思维相比,传统的机器学习基本上属于摸着石头过河,用传统的机器学习方法构造分类系统完全成了一种技巧,一个人做的结果可能很好,另一个人差不多的方法做出来却很差,缺乏指导和原则。 所谓vc维是对函数类的一种度量,可以简单的理解为问题的复杂程度,vc维越高,一个问题就越复杂。正是因为svm关注的是vc维,后面我们可以看到,svm解决问题的时候,和样本的维数是无关的(甚至样本是上万维的都

27、可以,这使得svm很适合用来解决文本分类的问题,当然,有这样的能力也因为引入了核函数)。 结构风险最小听上去文绉绉,其实说的也无非是下面这回事。 机器学习本质上就是一种对问题真实模型的逼近(我们选择一个我们认为比较好的近似模型,这个近似模型就叫做一个假设),但毫无疑问,真实模型一定是不知道的(如果知道了,我们干吗还要机器学习?直接用真实模型解决问题不就可以了?对吧,哈哈)既然真实模型不知道,那么我们选择的假设与问题真实解之间究竟有多大差距,我们就没法得知。比如说我们认为宇宙诞生于150亿年前的一场大爆炸,这个假设能够描述很多我们观察到的现象,但它与真实的宇宙模型之间还相差多少?谁也说不清,因为

28、我们压根就不知道真实的宇宙模型到底是什么。 这个与问题真实解之间的误差,就叫做风险(更严格的说,误差的累积叫做风险)。我们选择了一个假设之后(更直观点说,我们得到了一个分类器以后),真实误差无从得知,但我们可以用某些可以掌握的量来逼近它。最直观的想法就是使用分类器在样本数据上的分类的结果与真实结果(因为样本是已经标注过的数据,是准确的数据)之间的差值来表示。这个差值叫做经验风险remp(w)。以前的机器学习方法都把经验风险最小化作为努力的目标,但后来发现很多分类函数能够在样本集上轻易达到100%的正确率,在真实分类时却一塌糊涂(即所谓的推广能力差,或泛化能力差)。此时的情况便是选择了一个足够复

29、杂的分类函数(它的vc维很高),能够精确的记住每一个样本,但对样本之外的数据一律分类错误。回头看看经验风险最小化原则我们就会发现,此原则适用的大前 提是经验风险要确实能够逼近真实风险才行(行话叫一致),但实际上能逼近么?答案是不能,因为样本数相对于现实世界要分类的文本数来说简直九牛一毛,经验风险最小化原则只在这占很小比例的样本上做到没有误差,当然不能保证在更大比例的真实文本上也没有误差。 统计学习因此而引入了泛化误差界的概念,就是指真实风险应该由两部分内容刻画,一是经验风险,代表了分类器在给定样本上的误差;二是置信风险,代表了我们在多大程度上可以信任分类器在未知文本上分类的结果。很显然,第二部

30、分是没有办法精确计算的,因此只能给出一个估计的区间,也使得整个误差只能计算上界,而无法计算准确的值(所以叫做泛化误差界,而不叫泛化误差)。 置信风险与两个量有关,一是样本数量,显然给定的样本数量越大,我们的学习结果越有可能正确,此时置信风险越小;二是分类函数的vc维,显然vc维越大,推广能力越差,置信风险会变大。 泛化误差界的公式为: r(w)remp(w)+(n/h) 公式中r(w)就是真实风险,remp(w)就是经验风险,(n/h)就是置信风险。统计学习的目标从经验风险最小化变为了寻求经验风险与置信风险的和最小,即结构风险最小。 svm正是这样一种努力最小化结构风险的算法。 svm其他的特点就比较容易理解了。 小样本,并不是说样本的绝对数量少(实际上,对任何算法来说,更多的样本几乎总是能带来更好的效果),而是说与问题的复杂度比起来,svm算法要求的样本数是相对比较少的。 非线性,是指svm擅长应付样本数据线性不可分的情况,主要通过松弛变量(也有人叫惩罚变量)和核函数技术来实现,这一部分是svm的精髓,以后会详细讨论。多说一句,关于文本分类这

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

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