现在的位置: 首页 > 综合 > 正文

libSVM 简易入门

2013年08月30日 ⁄ 综合 ⁄ 共 1857字 ⁄ 字号 评论关闭

libSVM 简易入门

原作:林弘德

为什么写这个指南

我一直觉得 SVM 是个很有趣的东西,不过一直沒办法去听林智仁老師 Data miningSVM的课,后来看了一些Internet上的文件,后来听 kcwu 讲了一下 libsvm 的用法后,就想整理一下,算是对于并不需要知道完整 SVM 理论的人提供使用 libsvm 的入门。 原始 libsvm READMEFAQ也是很好的文件, 不过你可能要先对 svm 跟流程有点了解后才看得懂 (我在看时有这样的感觉) 这篇入门就是为了从零开始的人而写的。

不过请记得底下可能有些说法不一定对,但是对于只是想用 SVM 的人来说我觉得这样说明会比较易懂。这篇入门原则上是给会写基本程序的人看的,也是给我自己一个备忘, 不用太多数学底子,也不用对 SVM 有任何预备知识。

SVM:什么是SVM,它能为我们做什么?

SVM, Support Vector Machine , 简而言之它是个起源与人工神经网络有点像的东西,現今最常拿来就是做分类。也就是说,如果我有一堆已经分好类的东西(可是分类的依据是未知的),那当收到新的东西时,SVM可以預测新的数据要分到哪一堆去。听起来是很神奇的事(如果你觉得不神奇,请重想一想这句话代表什么:分类的依据是未知的!,还是不神奇的话就请你写个程序,解解上面的问題),不过 SVM 基于统计学习理论的,可以在合理的时间內漂亮的解决这个问題。

以图形化的例子来说明,假定我在空间中标了一堆用顏色分类的点, 点的顏色就是它的类別, 位置就是它的数据, SVM 就可以找出区隔这些点的程序, 依此就可以分出一个个的区域; 拿到新的点(数据) , 只要对照该位置在哪一区就可以找出它应该是哪一顏色(类別)了。当然 SVM 不是真的只有分区那么简单, 不过看上面的例子应该可以了解 SVM 大概在作什么. 要对 SVM 再多懂一点点,可以参考 cjlin data mining 课的 slides: pdf ps 。我们可以把 SVM 当个黑盒子, 数据丟进去让他处理然后我们再来用就好了.

哪里得到SVM?

libsvm 当然是最完美的工具.下載处: libsvm.zip 或者 libsvm.tar.gz

.zip .tar.gz 基本上是一样的, 只是看你的操作系统; 习惯上 Windows .zip 比较方便 (因为有WinZIP, 也有WinRAR), UNIX 则是用 .tar.gz

编译libsvm

解开来后, 假定是UNIX 系统, 直接打 make 就可以了; 编不出来的话请详读说明和运用常识. 因为这是指南, 所以我不花时间细谈, 而且编不出来的情形真是少之又少, 通常一定是你的系统有问題。 其他的子目录可以不管, 只要 svm-train, svm-scale, svm-predict 三个执行文件有就可以了. Windows 的用戶要自己重编当然也是可以, 不过已经有编好的执行文件在里面了: 请检查 windows 子目录, 应该会有 svmtrain.exe, svmscale.exe, svmpredict.exe, svmtoy.exe.

SVM的使用

libsvm 有很多种用法, 这篇指南只打算讲简单的部分.

程序

svmtrain

训练数据. SVM被戏称为 "开火車" 也是由于这个程序名而来. train会接受特定格式的输入, 产生一个 "Model" 文件. 这个 model 你可以想像成SVM的內部数据,因为预测要model才能预测, 不能直接吃原始数据.想想也很合理,假定 train 本身是很耗时的动作, train可以以某种形式存起內部数据,那下次要预测时直接把那些內部数据载入就快多了.

svmpredict

依照已经训练好的 model, 再加上给定的输入(新值), 输出預测新值所对应的类別.

svmscale

扫描数据. 因为原始数据可能范围过大或过小, svmscale 可以先将数据重新 scale (縮放) 到适当范围使训练与预测速度更快。

文件格式

文件格式要先交代一下. 你可以参考 libsvm 里面附的 "heart_scale": 这是SVM 的输入文件格式.

[label] [index1]:[value1] [index2]:[value2] ...

[label] [index1]:[value1] [index2]:[value2] ...

一行一条记录数据,如:

+1 1:0.708 2:1 3:1 4:-0.320 5:-0.105 6:-1

label

或说是class, 就是你要分类的种类,通常是一些整数。

index

是有順序的索引,通常是连续的整数。

value

就是用来 train 的数据,通常是一堆实数。

每一行都是如上的結构, 意思就是: 我有一排数据,

抱歉!评论已关闭.