SHOGUN
v1.1.0
|
SHOGUN为Matlab(tm), R, Python, Octave提供静态接口,另外还有一个单独的命令行程序。静态接口背后的思想 就是提供一个可以足够做简单实验的简单环境。例如,你可以训练和评价一个分类器,但额外的事情做不了。如果 你想找一个有良好扩展性的接口(如同时使用多个分类器,它们可以共享数据并可以交互),你可以阅读 模块化接口这一节。
本指南告诉你如何使用shogun来创建一个基于高斯核函数的SVM分类器。首先,你需要 启动R, python, octave或者matlab来加载shogun。
在python中加载SHOGUN,输入
from sg import sg
在R中输入
library(sg)
对于octave和matlab,你需要确保sg已添加在它们可访问的路径中。对于命令行接口,只需要执行shogun可执行文件
现在在所有的语言中输入
sg('help')
在命令行接口中输入
help
将会看到帮助屏幕。如果没有出现,请查看 installation学习如何安装shogun。
本指南的剩下部分假设正在使用shogun可执行文件。它的基本语法是
<command> <option1> <option2> ...
选项之间用空格分开. 例如
set_kernel GAUSSIAN REAL 10 1.2
将创建一个实值feature的高斯核函数,使用10MB缓存,核函数宽度为1.2。表示同样的意思,在其它接口(python,r,...)中是这样
sg('set_kernel', 'GAUSSIAN', 'REAL', 10, 1.2)
可以看到在其它接口只有一点点不同。
我们用两组正态分布的随机数来作为训练数据
set_features TRAIN ../data/fm_train_real.dat
在其它接口中可以这样
sg('set_features', 'TRAIN', [ randn(2, 100)-1, randn(2,100)+1 ])
训练一个有监督学习方法需要提供训练数据的label,我们可以设置
set_labels TRAIN ../data/label_train_twoclass.dat
在其它接口中可以这样
sg('set_labels', 'TRAIN', sign(randn(1, 100)))
现在我们创建一个SVM并设置SVM的C参数为一个合适值(在实际应用中需要参数需要调整,类似的还有核函数参数)
new_classifier LIBSVM c 1
然后训练SVM
train_classifier
现在可以将分类器应用到别的数据,先加载数据然后分类
set_features TEST ../data/fm_test_real.dat out.txt = classify
我们可以保存分类器,那样不用每次都要训练。我们可以这样保存和加载分类器
save_classifier libsvm.model load_classifier libsvm.model LIBSVM
在其它接口中也可以加载和保存分类,但还需要获取和恢复模型参数。如在这个例子中
[b,alphas]=sg('get_classifier') sg('set_classifier', b, alphas)
in this case.
最后,整个例子是这样的
% LibSVM print LibSVM set_kernel GAUSSIAN REAL 10 1.2 set_features TRAIN ../data/fm_train_real.dat set_labels TRAIN ../data/label_train_twoclass.dat new_classifier LIBSVM c 1 train_classifier save_classifier libsvm.model load_classifier libsvm.model LIBSVM set_features TEST ../data/fm_test_real.dat out.txt = classify ! rm out.txt ! rm libsvm.model
这个例子及其它例子可以在 例子中找到,examples/cmdline/classifier_libsvm.sg。
对于其它接口的用户可以看下面的文件
library("sg") size_cache <- 10 C <- 10 epsilon <- 1e-5 use_bias <- TRUE fm_train_real <- t(as.matrix(read.table('../data/fm_train_real.dat'))) fm_test_real <- t(as.matrix(read.table('../data/fm_test_real.dat'))) label_train_twoclass <- as.real(as.matrix(read.table('../data/label_train_twoclass.dat'))) # LibSVM print('LibSVM') width <- 2.1 dump <- sg('set_features', 'TRAIN', fm_train_real) dump <- sg('set_kernel', 'GAUSSIAN', 'REAL', size_cache, width) dump <- sg('set_labels', 'TRAIN', label_train_twoclass) dump <- sg('new_classifier', 'LIBSVM') dump <- sg('svm_epsilon', epsilon) dump <- sg('c', C) dump <- sg('svm_use_bias', use_bias) dump <- sg('train_classifier') dump <- sg('set_features', 'TEST', fm_test_real) result <- sg('classify')
% Explicit examples on how to use the different classifiers size_cache=10; C=1; use_bias=false; epsilon=1e-5; width=2.1; addpath('tools'); label_train_twoclass=load_matrix('../data/label_train_twoclass.dat'); fm_train_real=load_matrix('../data/fm_train_real.dat'); fm_test_real=load_matrix('../data/fm_test_real.dat'); % LibSVM disp('LibSVM'); sg('set_kernel', 'GAUSSIAN', 'REAL', size_cache, width); sg('set_features', 'TRAIN', fm_train_real); sg('set_labels', 'TRAIN', label_train_twoclass); sg('new_classifier', 'LIBSVM'); sg('svm_epsilon', epsilon); sg('svm_use_bias', use_bias); sg('c', C); sg('train_classifier'); sg('set_features', 'TEST', fm_test_real); result=sg('classify');
from tools.load import LoadMatrix from sg import sg lm=LoadMatrix() traindat=lm.load_numbers('../data/fm_train_real.dat') testdat=lm.load_numbers('../data/fm_test_real.dat') train_label=lm.load_labels('../data/label_train_twoclass.dat') parameter_list=[[traindat,testdat, train_label,10,2.1,1.2,1e-5,False], [traindat,testdat,train_label,10,2.1,1.3,1e-4,False]] def classifier_libsvm (fm_train_real=traindat,fm_test_real=testdat, label_train_twoclass=train_label, size_cache=10, width=2.1,C=1.2, epsilon=1e-5,use_bias=False): sg('set_features', 'TRAIN', fm_train_real) sg('set_kernel', 'GAUSSIAN', 'REAL', size_cache, width) sg('set_labels', 'TRAIN', label_train_twoclass) sg('new_classifier', 'LIBSVM') sg('svm_epsilon', epsilon) sg('c', C) sg('svm_use_bias', use_bias) sg('train_classifier') sg('set_features', 'TEST', fm_test_real) result=sg('classify') kernel_matrix = sg('get_kernel_matrix', 'TEST') return result, kernel_matrix if __name__=='__main__': print 'LibSVM' classifier_libsvm(*parameter_list[0])