博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 使用 libsvm
阅读量:4216 次
发布时间:2019-05-26

本文共 4285 字,大约阅读时间需要 14 分钟。

我的环境 python 3.64  64bit

一、安装libsvm

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

1、直接到官网下载 .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,syspath = "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)

你可能感兴趣的文章
All Things OpenTSDB
查看>>
单例模式(singleton),工厂方法模式(factory),门面模式(facade)
查看>>
抽象模式,适配器模式(Adapter),模板方法模式(Template method)
查看>>
建造者模式(builder),桥梁模式(bridge mode),命令模式(Command mode)
查看>>
装饰模式(Decorator),迭代器模式(Iterator),组合模式(composite)
查看>>
观察者模式(Observer),责任链模式,访问者模式(Visitor)
查看>>
状态模式(State)
查看>>
快速排序
查看>>
插入算法
查看>>
希尔排序
查看>>
选择排序
查看>>
归并排序
查看>>
归并排序
查看>>
插入排序进行链表排序
查看>>
android实现截图功能
查看>>
android 网络连接状态判断与数据类型
查看>>
android webview 实现网页加载进度
查看>>
《人性的弱点》
查看>>
《大师们是如何工作的》
查看>>
c++ 中的多重继承和其权限问题
查看>>