已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1/flydreamGG/archive/2009/08.aspx/flydreamGG/archive/2009/08.aspxLibSVM学习(一)初识LibSVM 收藏 LibSVM是台湾 林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,可以很方便的对数据做分类或回归。由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。 这套库可以从.tw/cjlin/免费获得,目前已经发展到2.89版。下载.zip格式的版本,解压后可以看到,主要有5个文件夹和一些c+源码文件。 Java 主要是应用于java平台; Python 是用来参数优选的工具,稍后介绍; svm-toy 一个可视化的工具,用来展示训练数据和分类界面,里面是源码,其编译后的程序在windows文件夹下; tools 主要包含四个python文件,用来数据集抽样(subset),参数优选(grid),集成测试(easy), 数据检查(checkdata); windows 包含libSVM四个exe程序包,我们所用的库就是他们,里面还有个heart_scale,是一 个样本文件,可以用记事本打开,用来测试用的。 其他.h和.cpp文件都是程序的源码,可以编译出相应的.exe文件。其中,最重要的是svm.h和svm.cpp文件,svm-predict.c、svm-scale.c和svm-train.c(还有一个svm-toy.c在svm-toy文件夹中)都是调用的这个文件中的接口函数,编译后就是windows下相应的四个exe程序。另外,里面的 README 跟 FAQ 也是很好的文件,对于初学者如果E文过得去,可以看一下。 下面以svm-train为例,简单的介绍下,怎么编译:(这步很简单,也没必要,对于仅仅使用libsvm库的人来说,windows下的4个exe包已经足够了,之所以加这步,是为了那些做深入研究的人,可以按照自己的思路改变一下svm.cpp,然后编译验证) 我用的是VC 6.0,新建一个控制台(win32 console application)程序,程序名叫svm-train(这个可以随意),点击OK后,选择empty。 进入程序框架后,里面什么都没有,然后找到你的程序目录,把svm-train.c、svm.h和svm.cpp拷贝过去(.c文件是c语言的,要是你习惯了c+,你尽可以改成.cpp),然后把这3个文件添加到工程,编译。如果没错误,到debug下面看看,是不是有个svm-train.exe。其实windows下的svm-train.exe就是这样编译出来的。 哈哈,怎么样是不是很简单。但是,这样的程序直接运行没意义,他要在dos下运行,接收参数才行。下面开始我们的libsvm的体验之旅。 发表于 2009年08月20日13:13:00 | 评论( loading. ) | 编辑| 举报| 收藏 新一篇:LibSVM学习(二)第一次体验libSvm本文来自CSDN博客,转载请标明出处:/flydreamGG/archive/2009/08/20/4466023.aspx2 libSVM学习(二)第一次体验libSvm 收藏1. 把LibSVM包解压到相应的目录(因为我只需要里面windows文件夹中的东东,我们也可以只把windows文件夹拷到相应的目录),比如D:libsvm。 2. 在电脑“开始”的“运行”中输入cmd,进入DOS环境。定位到d: libsvm下,具体命令如下: d: (回车) cd libsvmwindows (回车) (上面第一行是先定位到盘符d,第二行cd 是定位到相应盘符下的目录) 3. 进行libsvm训练,输入命令:(这里要注意文件的名字,2.89以前版本都是svmtrain.exe) svm-train heart_scale train.model heart_scale 是目录下的已经存在的样本文件,要换成自己的文件,只需改成自己的文件名就可以了 train.model 是创建的结果文件,保存了训练后的结果 可以看到结果: *optimization finished, #iter = 162nu = 0.431029obj = -100.877288, rho = 0.424462nSV = 132, nBSV = 107 Total nSV = 132 其中,#iter为迭代次数,nu 是你选择的核函数类型的参数,obj为SVM文件转换为的二次规划求解得到的最小值,rho为判决函数的偏置项b,nSV 为标准支持向量个数(0ai 来另存为(假设为out.txt): svmscale test.txt out.txt 运行后,我们就可以看到目录下多了一个out.txt文件,那就是规范后的数据。假如,我们想设定数据范围0,1,并把规则保存为test.range文件: svmscale l 0 u 1 s test.range test.txt out.txt 这时,目录下又多了一个test.range文件,可以用记事本打开,下次就可以用-r test.range来载入了。 3. svmtrain的用法 svmtrain我们在前面已经接触过,他主要实现对训练数据集的训练,并可以获得SVM模型。 用法: svmtrain options training_set_file model_file 其中,options为操作参数,可用的选项即表示的涵义如下所示:-s 设置svm类型: 0 C-SVC 1 v-SVC 2 one-class-SVM 3 -SVR 4 n - SVR-t 设置核函数类型,默认值为2 0 - 线性核:u*v 1 - 多项式核: (g*u*v+ coef 0)degree 2 - RBF 核:exp(-*|u-v|2) 3 - sigmoid 核:tanh(*u*v+ coef 0)-d degree: 设置多项式核中degree的值,默认为3-g: 设置核函数中的值,默认为1/k,k为特征(或者说是属性)数; -r coef 0:设置核函数中的coef 0,默认值为0; -c cost:设置C-SVC、-SVR、n - SVR中从惩罚系数C,默认值为1; -n v :设置v-SVC、one-class-SVM 与n - SVR 中参数n ,默认值0.5; -p :设置v-SVR的损失函数中的e ,默认值为0.1; -m cachesize:设置cache内存大小,以MB为单位,默认值为40; -e :设置终止准则中的可容忍偏差,默认值为0.001; -h shrinking:是否使用启发式,可选值为0 或1,默认值为1; -b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0; -wi weight:对各类样本的惩罚系数C加权,默认值为1; -v n:n折交叉验证模式; model_file:可选项,为要保存的结果文件,称为模型文件,以便在预测时使用。 默认情况下,只需要给函数提供一个样本文件名就可以了,但为了能保存结果,还是要提供一个结果文件名,比如:test.model,则命令为: svmtrain test.txt test.model结果说明见LibSVM学习(二)。 4. svmpredict 的用法 svmpredict 是根据训练获得的模型,对数据集合进行预测。 用法:svmpredict options test_file model_file output_file 其中,options为操作参数,可用的选项即表示的涵义如下所示:-b probability_estimates是否需要进行概率估计预测,可选值为0 或者1,默认值为0。 model_file 是由svmtrain 产生的模型文件;test_file 是要进行预测的数据文件,格式也要符合libsvm格式,即使不知道label的值,也要任意填一个,svmpredict会在output_file中给出正确的label结果,如果知道label的值,就会输出正确率;output_file 是svmpredict 的输出文件,表示预测的结果值。 至此,主要的几个接口已经讲完了,满足一般的应用不成问题。对于要做研究的,还需要深入到svm.cpp文件内部,看看都做了什么。发表于 2009年08月21日10:25:00 | 评论( 4 ) | 编辑| 举报| 收藏 旧一篇:LibSVM学习(二)第一次体验libSvm | 新一篇:LibSVM学习(五)分界线的输出查看最新精华文章 请访问博客首页相关文章 转载数学之美 系列十八 矩阵运算和文本处理中的分类问题数学之美 系列十八 矩阵运算和文本处理中的分类问题LIBSVM中参数的意义为什么要有特征值和特征向量数学之美(系列十八) 之 矩阵运算和文本处理中的分类问题LIBSVM使用说明Lib-SVM使用说明矩阵运算和文本处理中的分类问题flydreamGG 发表于2009年8月21日 10:51:02 IP:举报回复删除哎,怎么回事,明明编辑好了的,一发上来格式就乱了。wlkun2005 发表于2009年9月12日 15:37:30 IP:举报回复删除老兄,已经不错了,谢谢分享!你讲的还是比其他地方的详细一点的。ouzhf 发表于2010年3月19日 16:07:52 IP:举报回复删除讲得很详细,不过在介绍value值时,我觉得value应该是属性值,因为特征值在svm里有特殊的意义。匿名用户 发表于2010年5月12日 12:14:24 IP:举报回复删除感觉讲的不错本文来自CSDN博客,转载请标明出处:/flydreamGG/archive/2009/08/21/4468995.aspx4 LibSVM学习(四)逐步深入LibSVM 收藏 其实,在之前上海交大模式分析与机器智能实验室对2.6版本的svm.cpp做了部分注解,(在哪里?google一下你就知道)。但是,这个注释只是针对代码而注释,整篇看下来,你会发现除了理解几个参数的含义,还是会对libsvm一头雾水。当然作为理解程序的辅助材料,还是有很大用处的。特别是,对几个结构体的说明,比较清楚。但是要清楚程序具体做了什么,还是要追踪程序中去。 由于svm涉及的数学知识比较多,我们这篇只是讲一些基本的思路,所以就从最基本的C-SVC型svm,核函数采用常用的RBF函数。LibSVM就采用2.6版本的好了,因为后续的版本作者又加了很多内容,不易理解作者最初的思路。我是做模式识别,主要从分类的角度来解析函数的调用过程,我们从svmtrain.c看起,其调用的函数过程如下: 上图是整个C-SVC的计算过程,下面对一些重要的内容进行具体说明: 1. svm_group_class 在2.6版中没有此函数的,其功能直接在svm_train实现,为了增强可读性,2.89版中设置了这个函数,其实所作的工作都是一样的。需要说明的是其重新排列后perm中只存储的是各个样本在原始位置的序号,而非数据。这样做的好处有两个: 1)不必破坏原始数据(也就是读进来的x的数据); 2)检索起来方便,只需要L维的数据检索,得到序号后,然后定位到原始数据中相应的位置就可以。 perm是中各类的排列顺序是按照原始样本中各类出现的先后顺序排列的,不一定是按照你原始样本的label序号排列,假如原始样本的label是-1,0,1,而最先出现的label为1的样本,那么perm中就把label为1的作为类0最先排列。而start中记录的是各类的起始序号,而这个序号是在perm中的序号。 2. 多类判别的one-against-one svm做判别是用的分界线(面),两类之间只有一个分界线(面),因此分类器也只有1种,要么是1类要么是2类。但是对于多类,分类方式就有多种。目前,存在的方法主要有: 1)1-V-R方式 对于k类问题,把其中某一类的n个训练样本视为一类,所有其他类别归为另一类,因此共有k个分类器。最后预测时,判别式使用竞争方式,也就是哪个类得票多就属于那个类。 2)1-V-1方式 也就是我们所说的one-against-one方式。这种方法把其中的任意两类构造一个分类器,共有(k-1)k/2个分类器。最后预测也采用竞争方式。 3)有向无环图(DAG-SVM) 该方法在训练阶段采用1-V-1方式,而判别阶段采用一种两向有向无环图的方式。 LibSVM采用的是1-V-1方式,因为这种方式思路简单,并且许多实践证实效果比1-V-R方式要好。 上图是一个5类1-V-1组合的示意图,红色是0类和其他类的组合,紫色是1类和剩余类的组合,绿色是2类与右端两类的组合,蓝色只有3和4的组合。因此,对于nr_class个类的组合方式为: for(i = 0; i nr_class; i +) for(j = i+1; i nr_class; j +) 类 i V 类 j 3. hessian矩阵的内存处理 因为svm是基于结构风险最小的,因此在分类识别方式具有较传统的基于经验风险最小的方式有优势。但是svm也有一个致命的缺陷,因为要计算hessian矩阵Qij所耗的内存巨大,不利于实践中应用。目前,怎么减小内存的使用依旧是SVM的研究的课题。LibSVM对hessian矩阵处理的策略是定义了一个内存处理类Cache类,预先认为分配一定的内存,存储计算好的Qij,其序号的检索采用双向链表的方式,加快了检索速度。其最重要的函数为: int Cache:get_data(const int index, Qfloat *data, int len) /len 是 data 的长度,data为返回的内存首地址,index为Qij的行。 每次都要查找链表中行为index的Qi,假如已经计算过了,就返回计算过的内存地址,并把储存首地址的链表节点插入到链表尾部。假如没计算过,就分配内存并进行计算,当剩余的内存不够时,就要回收链表头指向的内存。这里,可能有人会问,难道以前计算的就没有用了吗?其实,是因为Qij是稀疏矩阵,在训练过程中只要其对应的alphai不再变动(这时alphai=0或者alphai=C),其对应的Qi就不会被选到来训练,因此原来计算的Qi就没有用了。其实,链表的顺序代表了别选到的频率,最头部的是最不可能被选到,因为这时alphai=0或者alphai=C,而最尾部的最容易被选到。 4. 数据选择select_working_set(i,j) 对于样本数量比较多的时候(几千个),SVM所需要的内存是计算机所不能承受的。目前,对于这个问题的解决方法主要有两种:块算法和分解算法。这里,libSVM采用的是分解算法中的SMO(串行最小化)方法,其每次训练都只选择两个样本。我们不对SMO做具体的讨论,要想深入了解可以查阅相关的资料,这里只谈谈和程序有关的知识。 一般SVM的对偶问题为: S.t. (4.1) SVM收敛的充分必要条件是KKT条件,其表现为: (4.2) 由4.1式求导可得: (4.3) 进一步推导可知: (4.4) 也就是说,只要所有的样本都满足4.4式,那么得到解就是最优值。因此,在每轮训练中,每次只要选择两个样本(序号为i和j),是最违反KKT条件(也就是4.4式)的样本,就能保证其他样本也满足KKT条件。序号i和j的选择方式如下: (4.5) 5. 停止准则 LibSVM程序中,停止准则蕴含在了函数select_working_set(i,j)返回值中。也就是,当找不到符合4.5式的样本时,那么理论上就达到了最优解。但是,实际编程时,由于KKT条件还是蛮苛刻的,要进行适当的放松。令: (4.6) 由4.4式可知,当所有样本都满足KKT条件时,gi -gj 加一个适当的宽松范围,也就是程序中的eps,默认为0.001,那么最终的停止准则为:gi -gj + gi + gj (4.7) 6. 因子的更新 由于SMO每次都只选择2个样本,那么4.1式的等式约束可以转化为直线约束: (4.8) 转化为图形表示为: 把4.8式中1由2 表示,即:,结合上图由解析几何可得2的取值范围: (4.9) 经过一系列变换,可以得到的2更新值2new: (4.10) 结合4.9和4.10式得到2new最终表达式: (4.11) 得到2new后,就可以由4.8式求1new。 这里,具体操作的时候,把选择后的序号i和j代替这里的1和2就可以了。当然,编程时,这些公式还是太抽象。对于4.9式,还需要具体细分。比如,对于y1 y2 = -1时的L = max(0,2 - 1),是0大还2 - 1是大的问题。总共需要分8种情况。 7. 数据缩放do_shrinking() 上面说到SVM用到的内存巨大,另一个缺陷就是计算速度,因为数据大了,计算量也就大,很显然计算速度就会下降。因此,一个好的方式就是在计算过程中逐步去掉不参与计算的数据。因为,实践证明,在训练过程中,alphai一旦达到边界(alphai=0或者alphai=C),alphai值就不会变,随着训练的进行,参与运算的样本会越来越少,SVM最终结果的支持向量(0alphaiC)往往占很少部分。 LibSVM采用的策略是在计算过程中,检测active_size中的alphai值,如果alphai到了边界,那么就应该把相应的样本去掉(变成inactived),并放到栈的尾部,从而逐步缩小active_size的大小。 8. 截距b的计算 b计算的基本公式为: (4.12) 理论上,b的值是不定的。当程序达到最优后,只要用任意一个标准支持向量机(0alphai2的情况,分类器个数为k(k-1)/2个,那么对应的b值(也就是rho)应该也是k(k-1)/2个。那么每个支持向量对应的系数是多少呢?是k-1个,因为每个支持向量(sv)与其他每个类都有一个系数相对应。当然,和有的类对应时可能不是标准支持向量(0alphaiC),但是至少和其中一个类对应是标准的。我们先看一下图5.2的SV的数据结构: 各nSV对应的iyi 特征1 特征2 类0(label为-1)前13个 类0 - V - 类1 类0 - V - 类2 1:0.297595 2:1.197805 0.4800095239454689 0.2016577869168293 类1(label为0)中间9个 类1 - V - 类0 类1 - V - 类2 1:3.621706 2:1.263636 -0.6580578158072528 0.7036762846823739 类2(label为1)后8个 类2 - V - 类0 类2 - V - 类1 1:8.296066 2:7.225341 -0.7056286598529473 -0.6494097661702236 从表中,可以看出,每个支持向量(SV)都有相应的k-1(这里的k为3)个,后面就是向量的数据。因此,输出分界线时,只要认清系数的位置就可以了。如要输出类0和类2之间的分界线,就要带入类0的第二列和类2的第1列中的。 这里需要重点说明的是:文件输出的不是单纯的,实际上是iyi(这里的yi是在训练时的+1或-1,而不是原始样本的label),因此在带入5.1式时,不需要判断yi的值了。 了解了数据结构以后,就是求解方程。5.1式是个多元方程(这和x的维数有关,这里讨论的是2维的,因此是二元方程),而只有一个等式,因此要对其中一个参数做定常处理。先求出其中一个参数的范围,不妨设为x0(在绘图时相当于x坐标轴)x_max和x_min,然后分成100等分,对每一个节点处 x0i = i(x_max- x_min)/100+ x_min 这样,x0就相当于固定了,然后代入5.1式求x1(也就是y)。这就转化成了一元方程,可以采用传统的数学解法,这里,我采用的是网络遍历法。也就是对x1也分成100分进行遍历,把节点处的x1: x1j = j(y_max- y_min)/100+ y_min 代入5.1式,看是否接近于0,如果接近0,说明此点是边界点,然后输出坐标就可以了。 for(i = 0; i 100; i +) for(j = 0; j 100; j +) X0 = x0i; X1 = x1j; if( ) cout X0 “ “ X1 endl; 分界点坐标输出以后,就可以用matlab把分界线绘制出来了。 发表于 2009年08月21日12:36:00 | 评论( 0 ) | 编辑| 举报| 收藏 旧一篇:LibSVM学习(三)LibSVM使用规范 | 新一篇:LibSVM学习(四)逐步深入LibSVM查看最新精华文章 请访问博客首页相关文章 svm中参数的选择方法基于支持向量机的学生行为诊断Transductive陆振波博士对四种SVM工具箱的使用要点一文SVM入门(二)线性分类器Part 1c#/JAva SVM的八股简介教程SVMSVM入门(六)线性分类器的求解问题的转化,直观角度本文来自CSDN博客,转载请标明出处:/flydreamGG/archive/2009/08/21/4469617.aspx本文来自CSDN博客,转载请标明出处:/flydreamGG/archive/2009/08/21/4469617.aspx本文来自CSDN博客,转载请标明出处:/flydreamGG/archive/2009/08/21/4469617.aspx6 LibSVM学习(六)easy.py和grid.py的使用 收藏 我们在“LibSVM学习(一)”中,讲到libSVM有一个tools文件夹,里面包含有四个python文件,是用来对参数优选的。其中,常用到的是easy.py和grid.py两个文件。其实,网上也有相应的说明,但很不系统,下面结合本人的经验,对使用方法做个说明。 这两个文件都要用python(可以在上下载到,需要安装)和绘图工具gnuplot(可以在/pub/gnuplot/上下载,不需要安装)。假设python安装在d:libsvmtoolspython26下,而gnuplot解压到d:libsvmtoolsgnuplot,libsvm放在了d:libsvm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中生学期总结和计划
- 铁道概论电子教案05 列车编组计划、车流组织及货物列车编组计划
- 2025年餐具清洗工试题及答案
- 2025年小学一年级体育上学期体能测试标准
- 2025年宏观管理试题及答案
- 2025年腾讯职能类试题及答案
- 2025年内容审核笔试题及答案
- 山东省公务员2025年公共基础知识历年真题
- 2025年小学五年级数学上学期统计图表试卷
- 2025年供款分期买卖合同范本
- 科技小院筹建方案(3篇)
- 中国印度对比课件
- 2025至2030中国水产品加工行业发展分析及发展趋势分析与未来投资战略咨询研究报告
- 2025年液体闪烁仪市场发展现状
- 关于无人机多旋翼的结构细节试题及答案
- 企业财务管理中的流动性风险评估与应对策略
- 某管理咨询公司薪酬管理制度
- 物业管家管理课件
- TCACM 1460-2023 成年人中医体质治未病干预指南
- 三人合租房协议合同
- 大学生职业生涯规划书模板范文:市场营销篇
评论
0/150
提交评论