当前位置:文档之家› 模式识别第二次上机实验报告

模式识别第二次上机实验报告

北京科技大学计算机与通信工程学院模式分类第二次上机实验报告姓名:XXXXXX学号:00000000班级:电信11时间:2014-04-16一、实验目的1.掌握支持向量机(SVM)的原理、核函数类型选择以及核参数选择原则等;二、实验内容2.准备好数据,首先要把数据转换成Libsvm软件包要求的数据格式为:label index1:value1 index2:value2 ...其中对于分类来说label为类标识,指定数据的种类;对于回归来说label为目标值。

(我主要要用到回归)Index是从1开始的自然数,value是每一维的特征值。

该过程可以自己使用excel或者编写程序来完成,也可以使用网络上的FormatDataLibsvm.xls来完成。

FormatDataLibsvm.xls使用说明:先将数据按照下列格式存放(注意label放最后面):value1 value2 labelvalue1 value2 label然后将以上数据粘贴到FormatDataLibsvm.xls中的最左上角单元格,接着工具->宏执行行FormatDataToLibsvm宏。

就可以得到libsvm要求的数据格式。

将该数据存放到文本文件中进行下一步的处理。

3.对数据进行归一化。

该过程要用到libsvm软件包中的svm-scale.exeSvm-scale用法:用法:svmscale [-l lower] [-u upper] [-y y_lower y_upper] [-s save_filename] [-r restore_filename] filename (缺省值:lower = -1,upper = 1,没有对y进行缩放)其中,-l:数据下限标记;lower:缩放后数据下限;-u:数据上限标记;upper:缩放后数据上限;-y:是否对目标值同时进行缩放;y_lower为下限值,y_upper为上限值;(回归需要对目标进行缩放,因此该参数可以设定为–y -1 1 )-s save_filename:表示将缩放的规则保存为文件save_filename;-r restore_filename:表示将缩放规则文件restore_filename载入后按此缩放;filename:待缩放的数据文件(要求满足前面所述的格式)。

缩放规则文件可以用文本浏览器打开,看到其格式为:ylower upper min max xlower upperindex1 min1 max1index2 min2 max2其中的lower 与upper 与使用时所设置的lower 与upper 含义相同;index 表示特征序号;min 转换前该特征的最小值;max 转换前该特征的最大值。

数据集的缩放结果在此情况下通过DOS窗口输出,当然也可以通过DOS的文件重定向符号“>”将结果另存为指定的文件。

该文件中的参数可用于最后面对目标值的反归一化。

反归一化的公式为:(Value-lower)*(max-min)/(upper - lower)+lower其中value为归一化后的值,其他参数与前面介绍的相同。

建议将训练数据集与测试数据集放在同一个文本文件中一起归一化,然后再将归一化结果分成训练集和测试集。

4.训练数据,生成模型。

用法:svmtrain [options] training_set_file [model_file]其中,options(操作参数):可用的选项即表示的涵义如下所示-s svm类型:设置SVM 类型,默认值为0,可选类型有(对于回归只能选3或4):0 -- C- SVC 1 -- n - SVC 2 -- one-class-SVM 3 -- e - SVR 4 -- n - SVR -t核函数类型:设置核函数类型,默认值为2,可选类型有:0 -- 线性核:u'*v 1 -- 多项式核:(g*u'*v+ coef 0)deg ree 2 -- RBF 核:e( u v 2) g - 3 -- sigmoid 核:tanh(g*u'*v+ coef 0) -d degree:核函数中的degree设置,默认值为3;-g g :设置核函数中的g ,默认值为1/ k ;-r coef 0:设置核函数中的coef 0,默认值为0;-c cost:设置C- SVC、e - SVR、n6- SVR中从惩罚系数C,默认值为1;-n n :设置n - SVC、one-class-SVM 与n - SVR 中参数n ,默认值0.5;-p e :设置n - SVR的损失函数中的e ,默认值为0.1;-m cachesize:设置cache内存大小,以MB为单位,默认值为40;-e e :设置终止准则中的可容忍偏差,默认值为0.001;-h shrinking:是否使用启发式,可选值为0 或1,默认值为1;-b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;-wi weight:对各类样本的惩罚系数C加权,默认值为1;-v n:n折交叉验证模式。

其中-g选项中的k是指输入数据中的属性数。

操作参数-v 随机地将数据剖分为n 部分并计算交叉检验准确度和均方根误差。

以上这些参数设置可以按照SVM 的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。

training_set_file是要进行训练的数据集;model_file 是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。

本实验中的参数-s取3,-t取2(默认)还需确定的参数是-c,-g,-p另,实验中所需调整的重要参数是-c 和–g,-c和-g的调整除了自己根据经验试之外,还可以使用gridregression.py对这两个参数进行优化。

(需要补充)该优化过程需要用到Python(2.5),Gnuplot(4.2),gridregression.py(该文件需要修改路径)。

然后在命令行下面运行:python.exe gridregression.py -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -s 3 –t 2 -v 5 -svmtrainE:\libsvm\libsvm-2.86\windows\svm-train.exe-gnuplot E:\libsvm\libsvm-2.86\gnuplot\bin\pgnuplot.exe E:\libsvm\libsvm-2.86\windows\train.txt > gridregression_feature.parameter以上三个路径根据实际安装情况进行修改。

-log2c是给出参数c的范围和步长-log2g是给出参数g的范围和步长-log2p是给出参数p的范围和步长上面三个参数可以用默认范围和步长-s选择SVM类型,也是只能选3或者4 -t是选择核函数-v 10 将训练数据分成10份做交叉验证。

默认为5为了方便将gridregression.py是存放在python.exe安装目录下trian.txt为训练数据,参数存放在gridregression_feature.parameter中,可以自己命名。

搜索结束后可以在gridregression_feature.parameter中最后一行看到最优参数。

其中,最后一行的第一个参数即为-c,第二个为-g,第三个为-p,最后一个参数为均方误差。

前三个参数可以直接用于模型的训练。

然后,根据搜索得到的参数,重新训练,得到模型。

5.测试用法:svmpredict [options] test_file model_file output_file options(操作参数):-b probability_estimates:是否需要进行概率估计预测,可选值为0 或者1,默认值为0。

model_file 是由svmtrain 产生的模型文件;test_file 是要进行预测的数据文件;output_file 是svmpredict 的输出文件,表示预测的结果值。

输出结果包括均方误差(Mean squared error)和相关系数(Squared correlation coefficient)。

三、实验仪器、设备1.PC机-系统最低配置512M 内存、P4 CPU;2.Matlab 仿真软件-7.0 / 7.1 / 2006a 等版本的Matlab 软件。

3.Coil20数据库;四、实验原理使用svm-scale 对数据进行缩放是必要的。

因为适当的scale有助于参数的选取和建svm模型的速度。

svm-scale 会对value 做scale。

范围用-l, -u 指定,通常是[0,1],或是[-1,1]。

(文本分类一般选[0,1])。

輸出在stdout。

另外要注意的是testing data 和training data要一起scale。

而svm-scale 最难用的地方就是沒办法指定testing data/training data为同一文档,然后一起scale。

因此为了后面测试,还要对测试集进行scale。

五、实验数据及结果分析:训练样本识别率1(%) 测试样本识别$/(%)72.9 6279.3 6781 69.7Svmtoy输出图形Svm分类器matlab代码clear;%清屏clc;X =load('data.txt');n = length(X);%总样本数量y = X(:,4);%类别标志X = X(:,1:3);TOL = 0.0001;%精度要求C = 1;%参数,对损失函数的权重b = 0;%初始设置截距bWold = 0;%未更新a时的W(a)Wnew = 0;%更新a后的W(a)for i = 1 : 50%设置类别标志为1或者-1y(i) = -1;enda = zeros(n,1);%参数afor i = 1 : n%随机初始化a,a属于[0,C]a(i) = 0.2;end%为简化计算,减少重复计算进行的计算K = ones(n,n);for i = 1 :n%求出K矩阵,便于之后的计算for j = 1 : nK(i,j) = k(X(i,:),X(j,:));endendsum = zeros(n,1);%中间变量,便于之后的计算,sum(k)=sigma a(i)*y(i)*K(k,i); for k = 1 : nfor i = 1 : nsum(k) = sum(k) + a(i) * y(i) * K(i,k);endendwhile 1%迭代过程%启发式选点n1 = 1;%初始化,n1,n2代表选择的2个点n2 = 2;%n1按照第一个违反KKT条件的点选择while n1 <= nif y(n1) * (sum(n1) + b) == 1 && a(n1) >= C && a(n1) <= 0break;endif y(n1) * (sum(n1) + b) > 1 && a(n1) ~= 0break;endif y(n1) * (sum(n1) + b) < 1 && a(n1) ~=Cbreak;endn1 = n1 + 1;end%n2按照最大化|E1-E2|的原则选取E1 = 0;E2 = 0;maxDiff = 0;%假设的最大误差E1 = sum(n1) + b - y(n1);%n1的误差for i = 1 : ntempSum = sum(i) + b - y(i);if abs(E1 - tempSum)> maxDiffmaxDiff = abs(E1 - tempSum);n2 = i;E2 = tempSum;endend%以下进行更新a1old = a(n1);a2old = a(n2);KK = K(n1,n1) + K(n2,n2) - 2*K(n1,n2);a2new = a2old + y(n2) *(E1 - E2) / KK;%计算新的a2 %a2必须满足约束条件S = y(n1) * y(n2);if S == -1U = max(0,a2old - a1old);V = min(C,C - a1old + a2old);elseU = max(0,a1old + a2old - C);V = min(C,a1old + a2old);endif a2new > Va2new = V;endif a2new < Ua2new = U;enda1new = a1old + S * (a2old - a2new);%计算新的a1 a(n1) = a1new;%更新aa(n2) = a2new;%更新部分值sum = zeros(n,1);for k = 1 : nfor i = 1 : nsum(k) = sum(k) + a(i) * y(i) * K(i,k);endendWold = Wnew;Wnew = 0;%更新a后的W(a)tempSum = 0;%临时变量for i = 1 : nfor j = 1 : ntempSum= tempSum + y(i )*y(j)*a(i)*a(j)*K(i,j);endWnew= Wnew+ a(i);endWnew= Wnew - 0.5 * tempSum;%以下更新b:通过找到某一个支持向量来计算support = 1;%支持向量坐标初始化while abs(a(support))< 1e-4 && support <= nsupport = support + 1;endb = 1 / y(support) - sum(support);%判断停止条件if abs(Wnew/ Wold - 1 ) <= TOLbreak;endend%输出结果:包括原分类,辨别函数计算结果,svm分类结果for i = 1 : nfprintf('第%d点:原标号',i);if i <= 50fprintf('-1');elsefprintf(' 1');endfprintf(' 判别函数值%f 分类结果',sum(i) + b);if abs(sum(i) + b - 1) < 0.5fprintf('1\n');else if abs(sum(i) + b + 1) < 0.5fprintf('-1\n');elsefprintf('归类错误\n');endendend2.名为f的功能函数部分: function y = k(x1,x2)y = exp(-0.5*norm(x1 - x2).^2); end。

相关主题