最近做导师的项目需要用到SVM, 上次我非常冒失的去借了一本关于SVM的书回来充电,
后来就发现以我这种半吊子的数学功底什么也没看懂.
上次看关于GISMO 的论文里提到了libsvm, 就顺便google了一下,
找到了不少tutorials, 其实发现这个东西用起来极其简单.
libsvm 是来自台大的林智仁 副教授开发的SVM工具包. 嗯, 使用简单, 并且带了各种语言的extensions, 比如GISMO就是用Python完成的libsvm部分的处理(好吧, 偏题了).
顺便用第一个霍乱弧菌的基因预测的Cross-Validation的程序改了下代码,
把原来用的Fisher线性判别代码干掉了, 改为输出为libsvm识别的文件格式,
(当然, 这种self-validation的准确率都是很高滴).
准确率大概在99.3%以上, 速度也很迅猛-_-#, 当然我没有做k-fold的多重Cross Validation.
实际的使用因为没有具体研究参数,
所以就拿着两个binary文件开工了(真山寨-_-#).
需要的输入文件有两个, 一个是训练集, 用于生成model,
每一行放置一个entry, 对于我的例子, 就是一个ORF, 格式如下:
<label> <index1>:<value1> <index2>:<value2>
label是训练集的目标值 , 对于我们的分类器, 就是具体分类的整数编号.
鉴于基因预测只有正样本和负样本, 就采取和大多数samples一样的取法, 正样本为+1, 负样本为-1.
index为具体的参数编号 , 整数. 最早的Z CURVE理论仅使用了9个参数来描述ORF序列的特征, 因此index是1~9排布的, 并且没有遗漏.
value自然就是各个参数的具体值 , 这9个value组成了一个特征向量. (当然实际在Z CURVE理论里, 这些参数描述了一条对应的Z曲线, 每个ORF对应了空间中的一个点.)
对于进行predict的输入文件, label是可以省略的, 不过保留label程序可以附加进行一个validation, 何乐而不为. :p
准备好了输入文件, 只需要执行:
svm_train <train_data>
即会生成对应的SVM Model文件(train_data.model).
再执行:
svm_predict <test_data> <model_file> <output>
即得到了最后的预测输出, 并且附带预测的accurency.
predict完成后, 得到的output文件极其简单, 一行一个预测结果, +1或者-1.
表征了基于当前训练集得到的基因预测结果 (即coding / non-coding).
至此就完成了第一个实验性质的libsvm的预测.
当然具体使用中两个程序有很多参数, 还没有具体尝试,
它们决定了核函数, cross-validation的属性等等.
——————————————————-
发现我说话真啰嗦, 好吧, 打住.
不过我准备用libsvm来玩点有趣的东西,
下次继续.