SVM算法实验实验报告.docx
《SVM算法实验实验报告.docx》由会员分享,可在线阅读,更多相关《SVM算法实验实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
![SVM算法实验实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/12/3c6a743c-0371-4c89-adb7-f4eb06af3648/3c6a743c-0371-4c89-adb7-f4eb06af36481.gif)
SVM算法实验实验报告
svm分类算法
一、数据源说明
1、数据源说远和理解:
ticeval2000.txt:
这个数据集是需要预测(4000个客户记录)的数据集。
它和ticdata2000.txt它具有相同的格式,只是没有最后一列的目标记录。
我们只希望返回预测目标的列表集,所有数据集都用制表符进行分隔。
共有4003(自己加了三条数据),根据要求,用来做预测。
tictgts2000.txt:
最终的目标评估数据。
这是一个实际情况下的目标数据,将与我们预测的结果进行校验。
我们的预测结果将放在result.txt文件中。
数据集理解:
本实验任务可以理解为分类问题,即分为2类,也就是数据源的第86列,可以分为0、1两类。
我们首先需要对ticdata2000.txt进行训练,生成model,再根据model进行预测。
2、数据清理
代码中需要对数据集进行缩放的目的在于:
a、避免一些特征值范围过大而另一些特征值范围过小;
b、避免在训练时为了计算核函数而计算内积的时候引起数值计算的困难。
因此,通常将数据缩放到[-1,1]或者是[0,1]之间。
二、数据挖掘的算法说明
1、svm算法说明
2、实现过程
在源程序里面,主要由以下2个函数来实现:
(1)structsvm_model*svm_train(conststructsvm_problem*prob,conststructsvm_parameter*param);
该函数用来做训练,参数prob,是svm_problem类型数据,具体结构定义如下:
structsvm_problem//存储本次参加运算的所有样本(数据集),及其所属类别。
{
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<iostream>
#include<list>
#include<iterator>
#include<vector>
#include<string>
#include<ctime>
usingnamespacestd;
#ifdefwin32
#pragmawarning(disable:
45144786)
#endif
svm_parameterparam;
svm_problemprob;
svm_model*svmmodel;
list<svm_node*>xlist;
list<double>ylist;
constintmax=10;
constintntsttimes=10;
vector<int>predictvalue;
vector<int>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,&temp);
features[k].index=k+1;
features[k].value=temp/(max*1.0);}
features[85].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分类器,并用来进行人脸分类识别,并对分类器实验结果做出分析。
实验主要步骤:
首先对图像预处理,转换成向量,再通过pca算法对orl人脸数据库图像进行降维特征提取,运用svm工具箱对数据进行训练,再利用svm分类方法对特征向量进行分类识别,寻找和待识别图片最为接近的训练样本第一张图片。
最后在matlab上进行实验仿真,分析实验结果。
关键字:
最近邻法、pca算法、多类svm、人脸识别
1.引言
人脸识别是模式识别的一个发展方向和重要应用,人脸检测和识别在安全识别、身份鉴定、以及公安部门的稽查活动中有重要作用。
本文主要使用pca算法、多类svm训练和svm分类器设计人脸识别算法。
从orl人脸图像数据库中,构建自建人脸训练数据库和测试数据库,采用k-l变换进行特征脸提取,并实现人脸识别。
通过k-l变换在人脸识别中的应用,加深对所学内容的理解和认识,进一步加深理解模式识别的算法。
2.人脸识别系统
完整的人脸识别系统至少包括两个主要环节。
首先在输入图像中找到人脸的位置即人脸检测,将人脸从背景中检测出来;其次,将检测到的人脸图像进行预处理、特征提取和识别。
如下图1所示:
图1
人脸识别系统虽然有诱人的应用前景,但是在现实中却还没有开始大规模的使用。
目前,国内外多所大学和研究机构已研制出一些较好的人脸识别原型系统,一些较成熟的商业人脸识别系统也已投入应用,但从技术的角度来看,大样本集、非可控条件下的稳健识别技术仍不成熟,用计算机自动进行人脸的定位和识别十分困难,目前的识别效果(正确率,速度)不如其他的生物识别技术,