libsvm It makes everything automatic–from data scaling to parameter selection.
基于java的Weka和基于python的scikit-learn,其提供的SVM算法在底层也是基于LIBSVM的实现。
于libsvm有关的包还有LIBLINEAR一个面向处理大数据量的线性分类器(这种数据量往往在libsvm上难以轻易去训练。)
libsvm下载
安装后使用libsvm训练模型,出现 gnuplot executable not found
此时需要安装gnuplot下载地址
安装完成后,更改**gnuplot_exe =**的路径为你gnuplot的路径即可,gnuplot用做绘画gamma和C的交叉验证精度轮廓.
#Change this path when you use gnuplot
is_win32 = (sys.platform == 'win32')
if not is_win32:
svmscale_exe = "../svm-scale"
svmtrain_exe = "../svm-train"
svmpredict_exe = "../svm-predict"
grid_py = "./grid.py"
gnuplot_exe = "./gnuplot"
else:
# example for windows
svmscale_exe = r"..\windows\svm-scale.exe"
svmtrain_exe = r"..\windows\svm-train.exe"
svmpredict_exe = r"..\windows\svm-predict.exe"
gnuplot_exe = r"..\gnuplot\bin\gnuplot.exe"
grid_py = r".\grid.py"
#training_testing_data_svm_acc_vel_timeseg3.txt
is the all data
#seg3_test.txt and seg3_train.txt
is the original data
#seg3_test.txt.scale and seg3_train.txt.scale
is the Scaled data
cmd: svm-scale seg3_train.txt > seg3_train.txt.scale
#seg3_train.txt.range
is the scale rule
cdm: svm-scale -s train.range seg3_train.txt > seg3_train.txt.scale
#使用train.range对test进行同样的缩放
svm-scale -r train.range seg3_test.txt > seg3_test.txt.scale
#seg3_train.txt.scale.out and seg3_train.txt.scale.png
is the result of the grid
#seg3_train.txt.model
cmd: svm-train.exe [options] training_set_file [model_file]
1.rho #决策函数中的常数项的相反数(-b)
2.svm的输出 y = y + model.sv_coef(i)*RBF(u,x);
#seg3_test.txt.predict
is the prediction for the seg3_test.txt.scale
cmd: svm-predict -b 1 test_file data_file.model output_file
至此,主要的几个接口已经讲完了,满足一般的应用不成问题。对于要做研究的,还需要深入到svm.cpp文件内部,看看都做了什么。
基于iwr1642的摔倒检测
grid.py已经运行完了,你可以把最优参数输入到svmtrain中进行训练了
svm-train -c 8.0 -g 8.0 train.txt
查看grid.py 源码,可以看到 默认进行了5折验证,也可以手动传参 -v n
关于g和c的参数搜索也可以调整。此处的调整是 c_range/g_range.
Usage: grid.py [grid_options] [svm_options] dataset
grid_options :
-log2c {begin,end,step | "null"} : set the range of c (default -5,15,2)
begin,end,step -- c_range = 2^{begin,...,begin+k*step,...,end}
"null" -- do not grid with c
-log2g {begin,end,step | "null"} : set the range of g (default 3,-15,-2)
begin,end,step -- g_range = 2^{begin,...,begin+k*step,...,end}
"null" -- do not grid with g
-v n : n-fold cross validation (default 5)
-svmtrain pathname : set svm executable path and name
-gnuplot {pathname | "null"} :
pathname -- set gnuplot executable path and name
"null" -- do not plot
-out {pathname | "null"} : (default dataset.out)
pathname -- set output file path and name
"null" -- do not output file
-png pathname : set graphic output file path and name (default dataset.png)
-resume [pathname] : resume the grid task using an existing output file (default pathname is dataset.out)
This is experimental. Try this option only if some parameters have been checked for the SAME data.
svm_options : additional options for svm-train""")
跟着感觉走
实际上libsvm本身实现多分类时就是使用的这种办法,因此实现one-versus-one的多分类时只需要把不同的类标签和数据都加载到label和data中去就行,直接用libsvm进行训练
ovo 或者ovr 可以通过参数来选择,默认为ovo,生成k(k-1)/2个分类器,最后投票选择。
惩罚因子c表示模型对错误项的惩罚力度,当无穷大时就是硬间隔模型,过大会导致过拟合。
gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
不适用RBF核的情形,例如特征维度非常大的时候,只能选用线性核。
简单讲,首先从数据采集开始,将数据转化为libsvm格式,然后对train数据进行训练,通过grid寻找合适的参数,然后代入训练,生成一个模型。然后使用predict即可,但是实际部署的话,要根据python下的svm.py
svmscale_exe = "../svm-scale"
svmtrain_exe = "../svm-train"
svmpredict_exe = "../svm-predict
原理可以参考tools下的easy.py or grid.py
基本流程如下 具体流程参考github
>>> import os
>>> os.chdir('D://gjs//libsvm//python')
>>> from svmutil import *
>>> y,x=svm_read_problem("D://libsvm.txt")
>>> m=svm_train(y,x,'-c 8.0 -g 8.0')
>>> p_lable,p_acc,p_val=svm_predict(y,x,m)
Accuracy = 96.1538% (25/26) (classification)
>>>
确认已经安装好python
wget http://www.csie.ntu.edu.tw/cjlin/cgi-bin/libsvm.cgi?+http://www.csie.ntu.edu.tw/cjlin/libsvm+tar.gz
tar -zxvf /home/gjs/libsvm.tar.gz。
进入目录执行 make 编译。
./svm-train /home/gjs/libsvm.txt 其他也类似。
python grid.py /home/gjs/libsvm.txt 优化参数。
在libsvm-3.20的python文件夹下主要包括了两个文件svm.py和svmutil.py。
svmutil.py接口主要包括了high-level的函数,这些函数的使用和LIBSVM的MATLAB接口大体类似
svmutil中主要包含了以下几个函数:
svm_train() : train an SVM model
svm_predict() : predict testing data
svm_read_problem() : read the data from a LIBSVM-format file.
svm_load_model() : load a LIBSVM model.
svm_save_model() : save model to a file.
evaluations() : evaluate prediction results.
svm.py接口主要包括了一些low-level的应用。在svm.py中采用了 python内置的ctypes库,由此python可以直接访问svm.h中定义的C结构和接口函数。svm.py主要运用了四个数据结构 svm_node, svm_problem, svm_parameter和svm_model。
网上有一个xls文FormatDataLibsvm.xls具有宏命令,可以利用其中的宏命令来实现。对于属性数据只有一二百的,这种工具简单方便。
可以利用weka来转换,用weka打开csv文件,再将文件重新保存为libsvm格式。