libSVM 简易入门
原作:林弘德
为什么写这个指南
我一直觉得 SVM 是个很有趣的东西,不过一直沒办法去听林智仁老師 的 Data mining与SVM的课,后来看了一些Internet上的文件,后来听 kcwu 讲了一下 libsvm 的用法后,就想整理一下,算是对于并不需要知道完整 SVM 理论的人提供使用 libsvm 的入门。 原始 libsvm 的README跟FAQ也是很好的文件, 不过你可能要先对 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 的数据,通常是一堆实数。
每一行都是如上的結构, 意思就是: 我有一排数据,