logo资料库

四种支持向量机用于函数拟合与模式识别的Matlab示例程序.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
四种支持向量机用于函数拟合与模式识别的Matlab示例程序
LS-SVM在分类、回归中的实例整理
LS-SVM进行分类的步骤:
四种支持向量机用于函数拟合与模式识别的 Matlab 示例程序 http://luzhenbo.88uu.com.cn/Matlab/support_vector_machine_SVM_matlab_toolbox.htm 陆振波 点这里下载:四种支持向量机用于函数拟合与模式识别的 Matlab 示例程序 使用要点: 应研学论坛《人工智能与模式识别》版主 magic_217 之约,写一个关于针对初学者的《四种支持向量机工具箱》 的详细使用说明。同时也不断有网友向我反映看不懂我的源代码,以及询问如何将该工具箱应用到实际数据分析等 问题,其中有相当一部分网友并不了解模式识别的基本概念,就急于使用这个工具箱。本文从模式识别的基本概念 谈起,过渡到神经网络模式识别,逐步引入到这四种支持向量机工具箱的使用。 本文适合没有模式识别基础,而又急于上手的初学者。作者水平有限,欢迎同行批评指正! [1]模式识别基本概念 模式识别的方法有很多,常用有:贝叶斯决策、神经网络、支持向量机等等。特别说明的是,本文所谈及的模 式识别是指“有师分类”,即事先知道训练样本所属的类别,然后设计分类器,再用该分类器对测试样本进行识别, 比较测试样本的实际所属类别与分类器输出的类别,进而统计正确识别率。正确识别率是反映分类器性能的主要指 标。 分类器的设计虽然是模式识别重要一环,但是样本的特征提取才是模式识别最关键的环节。试想如果特征矢量 不能有效地描述原样本,那么即使分类设计得再好也无法实现正确分类。工程中我们所遇到的样本一般是一维矢量, 如:语音信号,或者是二维矩阵,如:图片等。特征提取就是将一维矢量或二维矩阵转化成一个维数比较低的特征 矢量,该特征矢量用于分类器的输入。关于特征提取,在各专业领域中也是一个重要的研究方向,如语音信号的谐 振峰特征提取,图片的 PCA 特征提取等等。 [2]神经网络模式识别 神经网络模式识别的基本原理是,神经网络可以任意逼近一个多维输入输出函数。以三类分类:I、II、III 为例, 神经网络输入是样本的特征矢量,三类样本的神经网络输出可以是[1;0;0]、[0;1;0]、[0;0;1],也可以是[1;-1;-1]、[-1;1;-1]、 [-1;-1;1]。将所有样本中一部分用来训练网络,另外一部分用于测试输出。通常情况下,正确分类的第 I 类样本的测 试输出并不是[1;0;0]或是[1;-1;-1],而是如[0.1;0;-0.2]的输出。也是就说,认为输出矢量中最大的一个分量是 1,其它 分量是 0 或是-1 就可以了。 [3]支持向量机的多类分类 支持向量机的基本理论是从二类分类问题提出的。我想绝大部分网友仅着重于理解二类分类问题上了,我当初 也是这样,认识事物都有一个过程。二类分类的基本原理固然重要,我在这里也不再赘述,很多文章和书籍都有提 及。我觉得对于工具箱的使用而言,理解如何实现从二类分类到多类分类的过渡才是最核心的内容。下面我仅以 1-a-r 算法为例,解释如何由二类分类器构造多类分类器。 二类支持向量机分类器的输出为[1,-1],当面对多类情况时,就需要把多类分类器分解成多个二类分类器。在第 一种工具箱 LS_SVMlab 中,文件 Classification_LS_SVMlab.m 中实现了三类分类。训练与测试样本分别为 n1、n2, 它们是 3 x 15 的矩阵,即特征矢量是三维,训练与测试样本数目均是 15;由于是三类分类,所以训练与测试目标 x1、 x2 的每一分量可以是 1、2 或是 3,分别对应三类,如下所示: n1 = [rand(3,5),rand(3,5)+1,rand(3,5)+2]; x1 = [1*ones(1,5),2*ones(1,5),3*ones(1,5)];
n2 = [rand(3,5),rand(3,5)+1,rand(3,5)+2]; x2 = [1*ones(1,5),2*ones(1,5),3*ones(1,5)]; 1-a-r 算法定义:对于 N 类问题,构造 N 个两类分类器,第 i 个分类器用第 i 类训练样本作为正的训练样本,将 其它类的训练样本作为负的训练样本,此时分类器的判决函数不取符号函数 sign,最后的输出是 N 个两类分类器输 出中最大的那一类。 在文件 Classification_LS_SVMlab.m 的第 42 行:codefct = 'code_MOC',就是设置由二类到多类编码参数。当第 42 行改写成 codefct ='code_OneVsAll',再去掉第 53 行最后的引号,按 F5 运行该文件,命令窗口输出有: codebook = 1 -1 -1 -1 1 -1 -1 -1 1 old_codebook = 1 2 3 比较上面的 old_codebook 与 codebook 输出,注意到对于第 i 类,将第 i 类训练样本做为正的训练样本,其它的 训练样本作为负的训练样本,这就是 1-a-r 算法定义。这样通过设置 codefct ='code_OneVsAll'就实现了支持向量机的 1-a-r 多类算法。其它多类算法也与之雷同,这里不再赘述。值得注意的是:对于同一组样本,不同的编码方案得到 的训练效果不尽相同,实际中应结合实际数据,选择训练效果最好的编码方案。 [4]核函数及参数选择 常用的核函数有:多项式、径向基、Sigmoid 型。对于同一组数据选择不同的核函数,基本上都可以得到相近 的训练效果。所以核函数的选择应该具有任意性。对训练效果影响最大是相关参数的选择,如:控制对错分样本惩 罚的程度的可调参数,以及核函数中的待定参数,这些参数在不同工具箱中的变量名称是不一样的。这里仍以 Classification_LS_SVMlab.m 为例,在第 38、39 行分别设定了 gam、sig2 的值,这两个参数是第 63 行 trainlssvm 函数的输入参数。在工具箱文件夹的 trainlssvm.m 文件的第 96、97 行有这两个参数的定义: % gam : Regularization parameter % sig2 : Kernel parameter (bandwidth in the case of the 'RBF_kernel') 这里 gam 是控制对错分样本惩罚的程度的可调参数,sig2 是径向基核函数的参数。所以在充分理解基本概念的 基础上,将这些概念与工具箱中的函数说明相结合,就可以自如地运用这个工具箱了,因此所以最好的教科书是函 数自带的函数说明。 最佳参数选择目前没有十分好的方法,在 Regression_LS_SVMlab.m 的第 46 至 49 行的代码是演示了交叉验证优 化参数方法,可这种方法相当费时。实践中可以采用网格搜索的方法:如 gam=0:0.2:1,sig2=0:0.2:1,那么 gam 与 sig2 的组合就有 6x6=36 种,对这 36 种组合训练支持向量机,然后选择正确识别率最大的一组参数作为最优的 gam 与 sig2,如果结果均不理想,就需要重新考虑 gam 与 sig2 的范围与采样间隔了。 [5]由分类到回归的过渡 LS_SVMlab、SVM_SteveGunn 这两个工具箱实现了支持向量机的函数拟合功能。从工具箱的使用角度来看,分 类与回归的最大区别是训练目标不同。回归的训练目标是实际需要拟合的函数值;而分类的训练目标是 1,2,…N(分 成 N 类),再通过适当的编码方案将 N 类分类转换成多个二类分类。比较文件 Regression_LS_SVMlab.m 与 Classific ation_LS_SVMlab.m 的前几行就可以注意到这一点。另外,分类算法以正确分类率来作为性能指标,在回归算法中
通常采用拟合的均方误差(mean square error, MSE)来作为性能指标。 LS-SVM 在分类、回归中的实例整理 http://www.shenweiv.cn/bbs/ShowPost.asp?ThreadID=132 有了 LS-SVMlab 的 matlab 软件包,比我之前用 libsvm 手动去调好用多了(上一篇教程里有讲到让 libsvm 自动 调节参数的功能,那涉及太多工具包,后来也没去试。希望有同学有时间尝试一下)。以下以一个实例实验来说明一 下用法。 先是 LS-SVMlab 的各种功能介绍,主要是让初学者快点上手,不需要再走我的弯路,尽快引起你的学习兴趣, 不论是做研究还是写作业,能帮上你的忙就是我的最大心愿。 LS-SVMlab1.5bw.tar 一般用法 (分类用法) 首先下载了 LS-SVMlab1.5bw,以及它的使用方法导读 LS-SVMlab Toolbox User’s Guide.pdf,免费的,地址是: http://www.esat.kuleuven.ac.be/sista/lssvmlab/ 就得点“toolbox”:http://www.esat.kuleuven.ac.be/sista/lssvmlab/toolbox.html 下载的 LS-SVMlab1.5bw 是压缩文件,解压缩,记住路径,如:e:\LS-SVMlab1.5bw。这个目录下 59 个文件。 成功一半了。下来打开 matlab(最好 6.1 以上版本的),current directory 的路径设置为 e:\LS-SVMlab1.5bw,下 来就用拉。 怎么用呢,有的朋友对 matlab 还不太熟悉,我简单说一下,在 matlab 打开的窗口中有一个叫 command window, 在这里面输入命令就可以了。其中符号%会被 matlab 识别,后面的文字是说明性的,不会参与程序计算。 ok,开始介绍 LS-SVMlab 的分类用法 在命令窗口(command window)中敲入(注凡是前面带>>说明是你敲进去的,没有的则是系统运行的结果): >> X = 2.*rand(30,2)-1; >> Y = sign(sin(X(:,1))+X(:,2)); >> X 会出现(有些数据在 excel 里,可以选定行列,在等号后粘进来) X = 0.9003 -0.9695 -0.5377 0.4936 0.2137 -0.1098 -0.0280 0.8636 0.7826 -0.0680 0.5242 -0.1627 .... .... -0.4556 0.7073 -0.6024 0.1871 敲入 >> Y 出现
Y = -1 -1 1 1 1 1 ... 1 -1 以上是编辑一组训练样本,有两个自变量(每个训练样本有两维)和一个因变量(每个训练样本的输出)。 >> gam = 10; %可能是惩罚参数吧,我猜的,谁知道跟贴说一下吧,谢啦。 >> sig2 = 0.2;%RBF 核函数的参数 >> type = ’classification’;%用于分类,简称 c >> [alpha,b] = trainlssvm({X,Y,type,gam,sig2,’RBF_kernel’}); (这里注意那个'符号好像是中文的引号,要改成英文的',这是那个导读里面的问题) 然后自动给出 alpha,b 的值,拉格朗日乘子 alpha 是数组,偏置 b 是单值,是构造的函数里面的参数值。 >> [alpha,b] = trainlssvm({X,Y,type,gam,sig2,’RBF_kernel’,’original’}); original 表示保持数据原始状态不变。 >> [alpha,b] = trainlssvm({X,Y,type,gam,sig2,’RBF_kernel’,’preprocess’}); preprocess 表示对原始数据进行预处理。具体怎么处理,谁知道? >> Xt = 2.*rand(10,2)-1; >> Ytest = simlssvm({X,Y,type,gam,sig2,’RBF_kernel’},{alpha,b},Xt); 以上构造检验样本。Ytest 是计算出来的检验值, >> plotlssvm({X,Y,type,gam,sig2,’RBF_kernel’},{alpha,b});这个画图的(仅限于两维) (回归用法): >> X=[5.00 0.31 10.00 0.27 5.00 0.53 10.00 0.33 15.00 0.24 5.00 1.01 10.00 0.52 20.00 0.30 10.00 0.96 20.00 0.53 50.00 0.32
41.00 0.50 90.00 0.24 120.00 0.22 92.00 0.50 70.00 0.96 90.00 1.03 ] >>Y=[0.70 0.78 0.73 0.85 0.83 0.84 0.85 0.85 0.85 0.91 0.94 0.94 0.92 0.94 0.96 0.95 0.95 ] %以上是样本数据(x 为降雨历时和降雨强度两个参数,实验测量得到,y 是径流系数,也是实测得到) >>gam = 50; >>sig2 = 0.2; >>type = 'function approximation';%这个引号里面的内容说明了用于回归运算,还有另一种查手册吧,下载地址 跟上面一样。 >>[alpha,b] = trainlssvm({X,Y,type,gam,sig2,'RBF_kernel'}); 以上算出了模型参数取值 >>Xt=[ 10 0.29 10 0.46 42 0.26 50 0.96 ];
预测自变量 Xt >>Yt = simlssvm({X,Y,type,gam,sig2,'RBF_kernel','preprocess'},{alpha,b},Xt); 预测因变量计算值 Yt 如果想看拟合/模拟结果 将上面这个命令的最后的 Xt 改为 X,得出和 Y 相对应的训练模型的计算值。 实测 即输入 >>>>Yx = simlssvm({X,Y,type,gam,sig2,'RBF_kernel','preprocess'},{alpha,b},X); >>Yx=[0.81 0.91 0.89 0.95 ] 不断调整参数值对比一下看看。这是实验测得的数据,仅用于说明测量精度高。 画图 最后可以利用画图函数,直观地了解拟合的情况,如: >>plotlssvm({X,Y,type,gam,sig2,'RBF_kernel','preprocess'},{alpha,b},X); svm 的多类分类方法还没找到。 http://www.2nsoft.cn/bbs/read.php?tid=9167 最近也在学 lssvm,下面网址有下载及简单说明,程序内附 LS-SVMlab Toolbox User's Guide.pdf,英文的, http://luzhenbo.88uu.com.cn/Matlab/support_vector_machine_SVM_matlab_toolbox.htm,把 LS_SVMlab 文件夹的文件拷贝到 Regression_LS_SVMlab.m 相同目录下,运行 Regression_LS_SVMlab.m, 有简单的回归示例,参数 gam 和 sig2 根据实际数据调整 LS-SVM 进行分类的步骤: 1、首先运行 pcawangkai.m 将原始数据 lssvmwelltrain1.txt 以及 lssvmwelltest1.txt 进行主分量分析得到 welltrain01pca.mat 以及 welltest01pca.mat(有样本序号,类别号);说明:也可以不进行主成分分析,只需分 别生成带有样本序号、类别号关于训练和测试的.mat 数据文件; 2、运行 dataprocess.m 将 welltrain01pca.mat 以及 welltest01pca.mat 归一化,得到去掉样本序号,类别号的 welltrain01pcastd.mat 以及 welltest01pcastd.mat; 3、运行 lg.m 对训练样本集 welltrainpcastd.mat 进行交叉验证和网格搜索,得到最佳的 gam 和 sig2; 4、选择参数及编码方案,code 函数对训练样本类别号编码,trainlssvm 函数进行训练得到[alpha,b],simlssvm 对测试样本进行仿真得到编码后的分类结果, 5、code 函数进行解码得到可视化的分类结果,各样本分类结果统计(1 表示分类正确,0 代表分类错误)、 正确分类率。 注意:‘original’指的是输入的数据不需用软件包里面的 prelssvm 函数归一化处理,数据导入前已经归一 化处理过了,就选择此项。否则,需要借助于 prelssvm 函数对导入的数据进行归一化。默认是此种情况,即 ‘preprocess’。
分享到:
收藏