SVM算法实验实验报告Word文档格式.docx
- 文档编号:17756897
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:20
- 大小:36.81KB
SVM算法实验实验报告Word文档格式.docx
《SVM算法实验实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《SVM算法实验实验报告Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
intn;
//记录样本总数
double*y;
//指向样本所属类别的数组
structsvm_node**x;
//指向一个存储内容为指针的数组
};
其中svm_node的结构体定义如下:
structsvm_node//用来存储输入空间中的单个特征
{
intindex;
//输入空间序号,假设输入空间数为m
doublevalue;
//该输入空间的值
所以,prob也可以说是问题的指针,它指向样本数据的类别和输入向量,在内存中的具体结构图如下:
图1.1libsvm训练时,样本数据在内存中的存放结构
只需在内存中申请n*(m+1)*sizeof(structsvm_node)大小的空间,并在里面填入每个样本的每个输入空间的值,即可在程序中完成prob参数的设置。
参数param,是svm_parameter数据结构,具体结构定义如下:
structsvm_parameter//训练参数
intsvm_type;
//svm类型,
intkernel_type;
//核函数类型
intdegree;
/*forpoly*/
doublegamma;
/*forpoly/rbf/sigmoid*/
doublecoef0;
/*forpoly/sigmoid*/
/*thesearefortrainingonly*/
doublecache_size;
/*inmb制定训练所需要的内存*/
doubleeps;
/*stoppingcriteria*/
doublec;
/*forc_svc,epsilon_svrandnu_svr,惩罚因子*/
intnr_weight;
/*forc_svc权重的数目*/
int*weight_label;
/*forc_svc权重,元素个数由nr_weight决定*/double*weight;
/*forc_svc*/
doublenu;
/*fornu_svc,one_class,andnu_svr*/
doublep;
/*forepsilon_svr*/
intshrinking;
/*usetheshrinkingheuristics指明训练过程是否使用压缩*/
intprobability;
/*doprobabilityestimates指明是否要做概率估计*/}
其中,svm类型和核函数类型如下:
设定完这两个参数,就可以直接在程序中调用训练函数进行训练了,该其函数返回一个structsvm_model*svm模型的指针,可以使用svm_save_model(constchar*model_file_name,conststructsvm_model*model)函数,把这个模型保存在磁盘中。
至此,训练函数的移植已经完成。
(2)doublesvm_predict(conststructsvm_model*model,conststructsvm_node*x);
参数model,是一个svm模型的指针,可以使用函数structsvm_model*svm_load_model(constchar*model_file_name),导入训练时保存好的svm模型,此函数返回一个svm模型的指针,可以直接赋值给变量model。
参数x,是conststructsvm_node结构体的指针,本意是一个输入空间的指针,但实际上,该函数执行的时候,是从参数x处计算输入空间,直到遇到单个样本数据结束标记-1才结束,也就是说,该函数运算了单个样本中的所有输入空间数据。
因此,在调用此函数时,必须先把预测样本的数据按图3.4中的固定格式写入内存中。
另外,该函数只能预测一个样本的值,本文需要对图像中的所有像数点预测,就要使用for循环反复调用。
该函数返回一个double类型,指明被预测数据属于哪个类。
面对两分类问题的时候,通常使用+1代表正样本,即类1;
-1代表负样本,即类2。
最后根据返回的double值就可以知道预测数据的类别了。
三、算法源代码及注释说明
1、需要在工程中添加头文件svm.h和源文件svm.cpp
2、自己编写的源代码(c++实现)(共230行):
#includesvm.h
#include&
lt;
iostream&
gt;
list&
iterator&
vector&
string&
ctime&
usingnamespacestd;
#ifdefwin32
#pragmawarning(disable:
45144786)
#endif
svm_parameterparam;
svm_problemprob;
svm_model*svmmodel;
list&
svm_node*&
xlist;
double&
ylist;
constintmax=10;
constintntsttimes=10;
vector&
int&
predictvalue;
realvalue;
inttrainnum=0;
//设置参数
voidsetparam()
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_weight=0;
param.weight=null;
param.weight_label=null;
}
voidtrain(char*filepath)
file*fp;
intk;
intline=0;
inttemp;
if((fp=fopen(filepath,rt))==null)return;
while
(1)
{
svm_node*features=newsvm_node[85+1];
for(k=0;
k&
85;
k++)
fscanf(fp,%d,&
amp;
temp);
features[k].index=k+1;
features[k].value=temp/(max*1.0);
features[85].index=-1;
xlist.push_back(features);
ylist.push_back(temp);
line++;
trainnum=line;
if(feof(fp))
break;
setparam();
prob.l=line;
篇二:
svm分类器-人脸识别专题报告
svm分类器-人脸识别专题报告
摘要:
本次试验报告,介绍了人脸识别方法分类器的设计并进行人脸识别。
主要是设计svm分类器,并用来进行人脸分类识别,并对分类器实验结果做出分析。
实验主要步骤:
首先对图像预处理,转换成向量,再通过pca算法对orl人脸数据库图像进行降维特征提取,运用svm工具箱对数据进行训练,再利用svm分类方法对特征向量进行分类识别,寻找和待识别图片最为接近的训练样本第一张图片。
最后在matlab上进行实验仿真,分析实验结果。
关键字:
最近邻法、pca算法、多类svm、人脸识别
1.引言
人脸识别是模式识别的一个发展方向和重要应用,人脸检测和识别在安全识别、身份鉴定、以及公安部门的稽查活动中有重要作用。
本文主要使用pca算法、多类svm训练和svm分类器设计人脸识别算法。
从orl人脸图像数据库中,构建自建人脸训练数据库和测试数据库,采用k-l变换进行特征脸提取,并实现人脸识别。
通过k-l变换在人脸识别中的应用,加深对所学内容的理解和认识,进一步加深理解模式识别的算法。
2.人脸识别系统
完整的人脸识别系统至少包括两个主要环节。
首先在输入图像中找到人脸的位置即人脸检测,将人脸从背景中检测出来;
其次,将检测到的人脸图像进行预处理、特征提取和识别。
如下图1所示:
图1
人脸识别系统虽然有诱人的应用前景,但是在现实中却还没有开始大规模的使用。
目前,国内外多所大学和研究机构已研制出一些较好的人脸识别原型系统,一些较成熟的商业人脸识别系统也已投入应用,但从技术的角度来看,大样本集、非可控条件下的稳健识别技术仍不成熟,用计算机自动进行人脸的定位和识别十分困难,目前的识别效果(正确率,速度)不如其他的生物识别技术,如指纹识别,视网膜识别等等。
人们在日常生活中就进行了大量的人脸定位和识别工作,当然全部是由人的视觉系统和大脑"
自动"
进行的。
目前还不清楚人的视觉系统和大脑的工作原理,因此这项人可以轻而易举完成的任务,牵涉到模式识别、图
象处理及生理、心理学等方面的诸多知识,对于目前还只会死板地执行程序指令的计算机来说却是极端困难。
3.算法简述
3.1pca算法
3.2svm算法
支持向量机(supportvectormachine,svm)是在统计学理论的基础上发展起来的新一代学习算法,它在文本分类、手写识别、图像分类、生物信息学等领域中获得较好的应用。
相比于容易过度拟合训练样本的人工神经网络,支持向量机对于未见过的测试样本具有更好的推广能力。
svm是一个二分器,只能用于2类样本的分类,现在我们将它推广到多类问题。
本文是对svm进行推广到能够处理多类问题。
采用一对一的投票策略。
将a、
b、c、d4类样本两类两类的分成训练集,即(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.
投票过程:
如果使用训练集(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个人,实验样本分为训练样本和测试样本。
首先设置训练样本集,选择40个人前5张图片作为训练样本,进行训练,并将训练后的数据存放到multisvmtrain.mat中保存。
然后设置测试样本集,将40个人后5张图片作为测试样本,进行选取识别。
实验流程图如下:
整个训练过程,包括读入图像,pca降维,以及多类svm训练,实现的关键代码如下:
display(读入人脸数据...);
[imgrow,imgcol,facecontainer,facelabel]=readfaces(nfacesperperson,nperson);
...
display(pca降维...);
[pcafaces,w]=fastpca(facecontainer,20);
%主成分分析pca
%pcafaces是200*20的矩阵,每一行代表一张主成分脸(共40人,每人5张),每个脸20个维特征
%数据规格化
display(scaling...);
[x,a0,b0]=scaling(x);
训练完毕后,将数据保存。
(2)开始识别:
打开一张图片(每个人的后5张中选择),然后对该图片进行pca变换降维,特征提取、规格化,从保存的训练数据库中读取数据,通过svm分类器识别该测试样本的类别,并显示该图片对应人的第一张图片和类别。
主要代码如下:
%读入相关训练结果
display(载入训练参数...);
load(mat/multisvmtrain.mat);
xnewface=readaface(newfacepath);
%读入一个测试样本
xnewface=double(xnewface);
xnewface=(xnewface-meanvec)*v;
%经过pca变换降维
xnewface=scaling(xnewface,1,a0,b0);
%经过pca变换降维
(3)最后进行测试:
测试是指分类所有的测试样本(40个人的后50张图像,共200个样本),并计算识别率。
主要实现代码如下:
nfacesperperson=5;
nperson=40;
btest=1;
%读入测试集合
display(读入测试集合...);
[imgrow,imgcol,testface,testlabel]=readfaces(nfacesperperson,nperson,btest);
display(载入训练参数...);
load(mat/pca.mat);
load(mat/scaling.mat);
load(mat/traindata.mat);
%pca降维
display(pca降维处理...);
[mn]=size(testface);
testface=(testface-repmat(meanvec,m,1))*v;
%经过pca变换降维testface=scaling(testface,1,a0,b0);
%多类svm分类
display(测试集识别中...);
classes=multisvmclassify(testface);
display(..............................);
%计算识别率
nerror=sum(classes~=testlabel);
accuracy=1-nerror/length(testlabel);
display([对于测试集200个人脸样本的识别率为,num2str(accuracy*100),%]);
5.实验仿真
该实验在matlab上进行实验仿真,主要包括样本的训练、保存,打开一张待识别图片,然后调用训练数据库,对该图片进行识别,并显示出该人的第一张图片和该人的类别,以及对全部测试样本进行分类,并计算识别率。
实验仿真结果图如下:
篇三:
svm算法简介
(一)svm的简介
支持向量机(supportvectormachine)是cortes和vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。
支持向量机方法是建立在统计学习理论的vc维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力(或称泛化能力)。
以上是经常被有关svm的学术文献引用的介绍,我来逐一分解并解释一下。
vapnik是统计机器学习的大牛,这想必都不用说,他出版的《statisticallearningtheory》是一本完整阐述统计机器学习思想的名著。
在该书中详细的论证了统计机器学习之所以区别于传统机器学习的本质,就在于统计机器学习能够精确的给出学习效果,能够解答需要的样本数等等一系列问题。
与统计机器学习的精密思维相比,传统的机器学习基本上属于摸着石头过河,用传统的机器学习方法构造分类系统完全成了一种技巧,一个人做的结果可能很好,另一个人差不多的方法做出来却很差,缺乏指导和原则。
所谓vc维是对函数类的一种度量,可以简单的理解为问题的复杂程度,vc维越高,一个问题就越复杂。
正是因为svm关注的是vc维,后面我们可以看到,svm解决问题的时候,和样本的维数是无关的(甚至样本是上万维的都可以,这使得svm很适合用来解决文本分类的问题,当然,有这样的能力也因为引入了核函数)。
结构风险最小听上去文绉绉,其实说的也无非是下面这回事。
机器学习本质上就是一种对问题真实模型的逼近(我们选择一个我们认为比较好的近似模型,这个近似模型就叫做一个假设),但毫无疑问,真实模型一定是不知道的(如果知道了,我们干吗还要机器学习?
直接用真实模型解决问题不就可以了?
对吧,哈哈)既然真实模型不知道,那么我们选择的假设与问题真实解之间究竟有多大差距,我们就没法得知。
比如说我们认为宇宙诞生于150亿年前的一场大爆炸,这个假设能够描述很多我们观察到的现象,但它与真实的宇宙模型之间还相差多少?
谁也说不清,因为我们压根就不知道真实的宇宙模型到底是什么。
这个与问题真实解之间的误差,就叫做风险(更严格的说,误差的累积叫做风险)。
我们选择了一个假设之后(更直观点说,我们得到了一个分类器以后),真实误差无从得知,但我们可以用某些可以掌握的量来逼近它。
最直观的想法就是使用分类器在样本数据上的分类的结果与真实结果(因为样本是已经标注过的数据,是准确的数据)之间的差值来表示。
这个差值叫做经验风险remp(w)。
以前的机器学习方法都把经验风险最小化作为努力的目标,但后来发现很多分类函数能够在样本集上轻易达到100%的正确率,在真实分类时却一塌糊涂(即所谓的推广能力差,或泛化能力差)。
此时的情况便是选择了一个足够复杂的分类函数(它的vc维很高),能够精确的记住每一个样本,但对样本之外的数据一律分类错误。
回头看看经验风险最小化原则我们就会发现,此原则适用的大前
提是经验风险要确实能够逼近真实风险才行(行话叫一致),但实际上能逼近么?
答案是不能,因为样本数相对于现实世界要分类的文本数来说简直九牛一毛,经验风险最小化原则只在这占很小比例的样本上做到没有误差,当然不能保证在更大比例的真实文本上也没有误差。
统计学习因此而引入了泛化误差界的概念,就是指真实风险应该由两部分内容刻画,一是经验风险,代表了分类器在给定样本上的误差;
二是置信风险,代表了我们在多大程度上可以信任分类器在未知文本上分类的结果。
很显然,第二部分是没有办法精确计算的,因此只能给出一个估计的区间,也使得整个误差只能计算上界,而无法计算准确的值(所以叫做泛化误差界,而不叫泛化误差)。
置信风险与两个量有关,一是样本数量,显然给定的样本数量越大,我们的学习结果越有可能正确,此时置信风险越小;
二是分类函数的vc维,显然vc维越大,推广能力越差,置信风险会变大。
泛化误差界的公式为:
r(w)≤remp(w)+ф(n/h)
公式中r(w)就是真实风险,remp(w)就是经验风险,ф(n/h)就是置信风险。
统计学习的目标从经验风险最小化变为了寻求经验风险与置信风险的和最小,即结构风险最小。
svm正是这样一种努力最小化结构风险的算法。
svm其他的特点就比较容易理解了。
小样本,并不是说样本的绝对数量少(实际上,对任何算法来说,更多的样本几乎总是能带来更好的效果),而是说与问题的复杂度比起来,svm算法要求的样本数是相对比较少的。
非线性,是指svm擅长应付样本数据线性不可分的情况,主要通过松弛变量(也有人叫惩罚变量)和核函数技术来实现,这一部分是svm的精髓,以后会详细讨论。
多说一句,关于文本分类这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SVM 算法 实验 报告