四种支持向量机用于函数拟合与模式识别的 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’。