RSS
热门关键字:  数据挖掘  数据仓库  商业智能  人工智能  搜索引擎
当前位置 :| 首页>人工智能>

陆振波博士对四种SVM工具箱的使用要点一文已发表

来源: 作者: 时间:2008-01-04 点击:

陆振波博士对四种SVM工具箱的使用要点一文已发表在置顶帖
<【共享】四种支持向量机(Support Vector Machine ,SVM)Matlab工具箱(Toolbox)的分类与回归算法的示例程序 >中.特在此说明,欢迎学习!

http://bbs.matwav.com/post/view?bid=105&id=466201&sty=1&tpg=1&age=20

为方便研友阅读,省去找的麻烦,将原文粘帖如下:

应研学论坛<<人工智能与模式识别>>版主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与Classification_LS_SVMlab.m的前几行就可以注意到这一点。另外,分类算法以正确分类率来作为性能指标,在回归算法中通常采用拟合的均方误差(mean square error, MSE)来作为性能指标。

请问陆博置顶帖在哪?没找着

位于贴子:

http://bbs.matwav.com/post/view?bid=105&id=466201&sty=1&tpg=1&age=20 数据挖掘研究院

2006-08-18 的跟贴

不错啊,谢谢了!

我还有个问题要问一下,支持向量机训练之后,怎么把分类器参数提取出来,构成一个分类器用于测试。因为我不止在MaTlab中仿真,还要在其他系统中使用这个分类器。在matlab中训练,在其他系统中使用分类器。是不是要将所有的训练数据全加到分类器参数中吗?那样体积太大了。谢谢!

请问:u_LinearSVC与LinearSVC
u_RbfSVC与RbfSVC有什么区别?

请问为什么两层神经网络核函数的训练怎么一直过不去?

谢谢关心~~~

虽然我没有仔细看这些程序和文章,但仍然非常感谢陆博士,你务实的作风和分享精神非常值得我们学习。

我是研究智能控制的,最近仔细看了《数据挖掘中的新方法:支持向量机》、《支持向量机导论》两本书,大致原理都明白了。下了一个Steve Gunn的工具箱,准备用SVM对未知混沌系统进行建模,请问工具箱中的回归算法能输出拟合的近似函数吗?能否能将其导出到一模块?否则又要用m文件流进行仿真了。谢谢!

请问下陆博士,2类的svm_classification中的最优参数如何选择呢?

这四种工具箱能否给我传一下,急用,呵呵。 数据挖掘研究院
wlimei2005@126.com

一般都是用matlab编的,有用vc编的吗?

我是刚上研究生的,现在在选导师呢,我想知道,学习SVM将来的发展前途怎么的,以后是做研究型的,还是应用型的呢?

陆振波博士:您好!我是用LS-SVM做入侵检测的,昨天刚下包下来用,之前用过几个包,就是SVM(不知道有没有这个包,还是改了名的)、LIBSVM的,SVM那个是运行错误太多,还是我是新手,不会弄;LIBSVM包里是.c和.cpp的文件,是用C,C++编写的,我就没看了,因为我想用MATLAB实现,现在看了一下LSSVM包,运行出些东西,就是,它要求的输入是一个两维的数组,就是X=[?;2]的,然后根据Y={-1,1}来对两类问题分类后画出X点,而我的数据是[?;41]的,请问怎么转化成[?;2]呢?
毕业设计闹心啊,急需帮助!谢谢,感激不尽。
有可以指导的给点意见,我的邮箱yangrui1314@tom.com
QQ45777140
您有QQ吗?我给你联系,谢谢帮助

陆振波博士太伟大了,看了你的帖子帮助我不小啊,谢谢

非常好啊,可惜我看不到。

楼主,有没有one class svm的分类程序?Matlab版的,急需,谢谢!

受益匪浅,谢谢!

[parse]zxy20103568 wrote:[/parse]
楼主,有没有one class svm的分类程序?Matlab版的,急需,谢谢!


你好!你是做one class SVM 的吗? 我最近也在准备弄这个,如果我们找到该matlab程序的话,能不能互相分享一下?目前我知道libsvm可以做one class SVM,但是在我的机器上老是出错,不能运行,不知道为啥。

请问博士 我运行lssvmlab的时候为什么出现错误:
Error in ==> Classification_LS_SVMlab at 53
[Yc,codebook,old_codebook] = code(Y,codefct)

请问陆博士,我是做图像真伪鉴别的,要用mysvm软件,
你有这个软件的详细资料吗?能告诉一下你的qq吗?

谢谢陆博士及时指导,真的很感激!

顶一下!受教了,请问一下陆博士,神经网络剪枝用matlab怎么编呀?

太感谢了,我研究的方向就是支持向量机,现在还没入门呢,希望能得到陆博士的指导

博士,你好
我用libsvm进行 交叉验证得到支持向量的个数,用同样的参数再对同样的样本训练,结果支持向量的个数不同,为什么?

请指教

谢谢

我想请问:SVM能做特征提取吗?

Create By Any-Extract(WL-AE)

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?