python 使用 libsvm

  • Post author:
  • Post category:python


我的环境 python 3.64  64bit


一、安装libsvm

(非 python 64版本 这里 不完全适应)

1、直接到官网下载

libsvm官网

.zip包 然后放到你喜欢的目录 并解压

2、压缩后有个 windows 文件夹 里面第一个 就是 libsvm.dll 的动态链接库 ,把他复制放到 C:\Windows\System32下面

(因为我的是64bit的python 动态链接库也是64bit的 所以我可以直接用, 如果是32位的话 需要 重新编译一个新的.dll文件 放到上面的那个路径下)

3、在Pycharm的使用

因为没有添加路径给pycharm,此时pycharm不能识别 所以需要到setting ->  Project interpreter   ->  齿轮 -> Show All -> Show paths for the selected interpreter(右侧图标最下面一个) – > 添加libsvm下面的python 路径 (如: G:\libsvm\libsvm-3.23\python)

注意 后来发现上面的那种并没有实际添加到sys.path  下面有两种可行的方法:

(1)手动添加搜索路径

import os,sys
path = "G:\libsvm\libsvm-3.23\python"
sys.path.append(path)

(2)

到libsvm把 python包复制到当前任意一个搜索路径下 例如G:\virtualenv_home\py3\lib\site-packages 下面 然后

from python.svmutil import *  导入 即可

至此 安装已经完成


二、安装gnuplot

到官网 找到download 然后 注意在页面 选择 file文件下面 点进去 找到 .exe 文件 就可以 一键式安装了


二、使用

1、使用 grid.py 进行参数选择 (C, gamma)(需要安装python 我的是py3.64 64bit)

(1)到Libsvm的 tools文件夹下 找到grid 用编辑器打开 或者 右键 用python自带的 IDLE 打开 会看到 如下界面,

第一个是对非win32,其实是非windows而言(因为我win64用第二个也正常),看到else下面2个路径,第一个不用管(前提你没有改变原本libsvm的相对路径结构),修改第二个为 你下载的 gnuplot.exe 路径(在 bin目录下)

python 如果加入全局path了的话 可以直接 在cmd 下面

python grid.py  ../heart_scale

(第一个参数为运行的文件, 第二个参数为 数据文件 以相对路径给出) 这样 就会看到cmd中 飞速 的出现数据,并且同时gnuplot汇出漂亮的图,并在最后给出选出的参数。


分别是 C,gamma, 正确率

最后会发现在tools下面多出来 xxx.out ,xxx.png 就是刚才运行的结果。

2、使用easy.py 进行 一站式操作(参数选择,预测)

(1)首先和刚才一样修改 gnuplot路径,然后就可以执行了


python easy.py ../heart_scale  ../heart_test   (第一个为原始数据,第二个为测试数据)

会发现 tools 中多出了好几个文件。。。


三、python (pycharm)下的使用


分为svmutil、svm.两个接口 其中svmutil为高层接口,svm.py为底层接口


svm.py主要运用了四个数据结构svm_node, svm_problem, svm_parameter和svm_model。


svmutil中主要包含了以下几个函数:

svm_problem() : read_problem

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.


一、里面有两个关于读取problem的

(1)svm_problem()

y, x = [1,-1], [{0:1, 1:2, 2:-2}, {0:2, 1:-2, 2:2}]

prob  = svm_problem(y, x)

(2)svm_read_problem()

y, x = svm_read_problem(‘../heart_scale’)


可见两种区别:前者 读取 问题的标签,特征 存储在prob里面自动转换为libsvm可以接收的数据格式(但是需要index连续,请参照libsvm数据集的格式),


后者 直接从libsvm格式数据读取数据返回标签、特征

其中:l 为训练数据数量,y是存储标签的数组,x存储训练数据(指针的指针)

struct svm_problem

{


int l;

double *y;

struct svm_node **x;

};


二、svm_train()


Usage: svm-train [options] training_set_file [model_file]

options:

-s svm_type : set type of SVM (default 0)

0 — C-SVC        (multi-class classification)

1 — nu-SVC        (multi-class classification)

2 — one-class SVM

3 — epsilon-SVR    (regression)

4 — nu-SVR        (regression)

-t kernel_type : set type of kernel function (default 2)

0 — linear: u’*v

1 — polynomial: (gamma*u’*v + coef0)^degree

2 — radial basis function: exp(-gamma*|u-v|^2)

3 — sigmoid: tanh(gamma*u’*v + coef0)

4 — precomputed kernel (kernel values in training_set_file)

-d degree : set degree in kernel function (default 3)

-g gamma : set gamma in kernel function (default 1/num_features)

-r coef0 : set coef0 in kernel function (default 0)

-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)

-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)

-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)

-m cachesize : set cache memory size in MB (default 100)

-e epsilon : set tolerance of termination criterion (default 0.001)

-h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)

-b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)

-wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)

-v n: n-fold cross validation mode

-q : quiet mode (no outputs)


这是 svm_train()的可选参数,其中比较常用几个是

-s 分类回归选择

-t 核函数类型

-c 惩罚系数

-g  核函数里面的一个参数

(1)直接传  libsvm格式的 label,feature, parameter

m = svm_train(y[:200], x[:200], ‘-c 4’)

(2) 整体传参

prob  = svm_problem(y, x)

param = svm_parameter(‘-t 0 -c 4 -b 1’)

m = svm_train(prob, param)

m 是一个 ctype 类型指针 指向svm_model


三、svm_predict(y ,x, m)

p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)

nu 核函数类型参数,

obj:目标函数最小值,

rho:偏置项,

nSV:支持向量

nBSV 边界上的支持向量 alpha(i) = C

Total nSv 总的支持向量数(多分类里面)


四、保存与加载模型

svm_save_model(‘heart_scale.model’, m) 保存在heart_scale.model里面

m = svm_load_model(‘heart_scale.model’)  从heart_scale.model 加载


五、对预测结果进行评估

ACC, MSE, SCC = evaluations(y, p_label)



版权声明:本文为Tianweidadada原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。