前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python使用libsvm

Python使用libsvm

作者头像
周小董
发布2019-03-25 10:53:46
3.4K0
发布2019-03-25 10:53:46
举报
文章被收录于专栏:python前行者

一个lisvm包的安装,网上教程太多,众说纷纭,在此做一个简单的总结

LibSVM是中国台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,可以很方便的对数据做分类或回归。由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。

下载安装libsvm包

第一种方式

whl文件下载(下载对应python版本的) https://www.lfd.uci.edu/~gohlke/pythonlibs/#libsvm

打开cmd,安装(对应路径和文件名)

代码语言:javascript
复制
pip install libsvm‑3.22‑cp37‑cp37m‑win_amd64.whl

有人说: 安装成功后,会在python目录下的一个库文件夹site-packages下找到新生成的libsvm.dll,一样将其放置到C:\windows\system32目录

测试

代码语言:javascript
复制
from svmutil import *
from svm import *

y, x = [1, -1], [{1: 1, 2: 1}, {1: -1, 2: -1}]
prob = svm_problem(y, x)
param = svm_parameter('-t 0 -c 4 -b 1')
model = svm_train(prob, param)
yt = [1]
xt = [{1: 1, 2: 1}]
p_label, p_acc, p_val = svm_predict(yt, xt, model)
print(p_label)

运行没错的话应该就安装成功了

第二种方式

1.下载 网站:http://www.csie.ntu.edu.tw/~cjlin/libsvm/oldfiles/。这个网站也可以下载,推荐给大家看。http://www.csie.ntu.edu.tw/~cjlin/libsvm/

2.添加动态链接文件(.dll文件)

在下载的libsvm文件夹中,有一个文件夹叫做windows,里面有一个动态链接文件libsvm.dll,这个文件默认是32位系统格式的,如果你的Python是32位的话,则可以直接用这个dll文件,将在拷贝到C:\Windows\System32下即可。

如果你的系统是64位的,则需要重新编译64位的dll文件。假设你已经安装了VS,以安装了VS2015为例,你可以在win10的全部应用中的VS目录下找到 VS2015 x64 本机工具命令提示符,这个小黑框,然后用cd命令进入到你下载的libsvm的文件中,输入以下指令:

代码语言:javascript
复制
nmake -f Makefile.win clean all

便会自动调用指令生成64位的dll,生成后,拷贝到C:\Windows\System32目录下。因为Python版本的svm需要调用很多c语言实现的接口,所以必须添加这个动态链接文件,否则运行会出错。

如果本机上没有安装VS,可使用第一种方法生成的libsvm.dll将其放置到C:\windows\system32即可

3.导入模块

如果libsvm需要经常使用,可以将libsvm包添加到Python的默认lib中,也就是放到Python安装路径下的Lib文件夹下的site-packages文件夹中。然后再libsvm文件夹中添加_init_.py(init前后都是双下划线)文件,在libsvm中的Python文件夹中也添加_init_.py文件。Python包,也就是能够导入的文件夹包中,必须包含_init_.py,否则无法实现导入。 这样在导入:

代码语言:javascript
复制
from libsvm.python.svm import *
from libsvm.python.svmutil import *

也可以不添加到Python默认路径中,直接

代码语言:javascript
复制
import sys
sys.path.append("libsvm/python")
import svm 
import svmutil

这样也是可以的,但建议前面那种

在运行时发现还是出错,说svmutil中找不到模块svm。这是因为在svmutil.py模块中有两个导入语句:

代码语言:javascript
复制
from svm import *
from svm import __all__ as svm_all

这两个导入语句中,默认svm已经是在系统路径中,但是实际上不是,如果我们 已经将libsvm添加到Python默认路径中,则直接将上面的改为:

代码语言:javascript
复制
from libsvm.python.svm import *
from libsvm.python.svm import __all__ as svm_all

这样就可以正确找到svm.py模块了。

第三种方式

将zip 放到一个特定的位置,我直接放到D盘目录底下了。其他地方也可以

测试一下LibSVM是否可用了,打开Python IDE,输入以下代码:

能够看到84%的准确度。 ##训练数据

假设训练数据集文件路径为:G:\train.txt 预测数据集文件路径为:G:\predict.txt 则使用svm方法为: 第一步,加载文件数据到序列或元组,让svm接口能够使用 其中label是类别,value是特征值

代码语言:javascript
复制
train_label, train_value = svm_read_problem("G:\\train.txt")         #训练数据集
predict_label, predict_value = svm_read_problem("G:\\predict.txt")   #预测数

训练模型

代码语言:javascript
复制
model = svm_train(train_label,train_value)

用模型预测数据类别 结构返回为,预测类别集合,准确率,

代码语言:javascript
复制
p_label, p_acc, p_val = svm_predict(predict_label, predict_value, model)
print(p_acc)#打印预测结果

p_labs是存储预测标签的列表。

p_acc存储了预测的精确度,均值和回归的平方相关系数。

p_vals在指定参数’-b 1’时将返回判定系数(判定的可靠程度)。


LibSVM简单说明

下载.zip格式的版本,解压后可以看到,主要有5个文件夹和一些c++源码文件。

Java——主要是应用于java平台;

Python——是用来参数优选的工具,稍后介绍;

svm-toy——一个可视化的工具,用来展示训练数据和分类界面,里面是源码,其编译后的程序在windows文件夹下;

tools——主要包含四个python文件,用来数据集抽样(subset),参数优选(grid),集成测试(easy),数据检查(checkdata);

windows——包含libSVM四个exe程序包,我们所用的库就是他们,里面还有个heart_scale,是一个样本文件,可以用记事本打开,用来测试用的。

其他.h和.cpp文件都是程序的源码,可以编译出相应的.exe文件。其中,最重要的是svm.h和svm.cpp文件,svm-predict.c、svm-scale.c和svm-train.c(还有一个svm-toy.c在svm-toy文件夹中)都是调用的这个文件中的接口函数,编译后就是windows下相应的四个exe程序。另外,里面的 README 跟 FAQ也是很好的文件,对于初学者如果E文过得去,可以看一下。

下面以svm-train为例,简单的介绍下,怎么编译:(这步很简单,也没必要,对于仅仅使用libsvm库的人来说,windows下的4个exe包已经足够了,之所以加这步,是为了那些做深入研究的人,可以按照自己的思路改变一下svm.cpp,然后编译验证)

我用的是VC 6.0,新建一个控制台(win32 console application)程序,程序名叫svm-train(这个可以随意),点击OK后,选择empty。

进入程序框架后,里面什么都没有,然后找到你的程序目录,把svm-train.c、svm.h和svm.cpp拷贝过去(.c文件是c语言的,要是你习惯了c++,你尽可以改成.cpp),然后把这3个文件添加到工程,编译。。。如果没错误,到debug下面看看,是不是有个svm-train.exe。其实windows下的svm-train.exe就是这样编译出来的。

哈哈,怎么样是不是很简单。但是,这样的程序直接运行没意义,他要在dos下运行,接收参数才行。下面开始我们的libsvm的体验之旅。

第一次体验LibSvm

1.把LibSVM包解压到相应的目录(因为我只需要里面windows文件夹中的东东,我们也可以只把windows文件夹拷到相应的目录),比如D:/libsvm。

2.在电脑“开始”的“运行”中输入cmd,进入DOS环境。定位到d:/ libsvm下,具体命令如下:

d: (回车) cd /libsvm/windows (回车) (上面第一行是先定位到盘符d,第二行cd是定位到相应盘符下的目录)

3.进行libsvm训练,输入命令:(这里要注意文件的名字,2.89以前版本都是svmtrain.exe)

svm-train heart_scale train.model

heart_scale**——**是目录下的已经存在的样本文件,要换成自己的文件,只需改成自己的文件名就可以了

train.model**——**是创建的结果文件,保存了训练后的结果

可以看到结果:

代码语言:javascript
复制
*

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

      Total nSV = 132

其中,#iter为迭代次数,nu是你选择的核函数类型的参数,obj为SVM文件转换为的二次规划求解得到的最小值,rho为判决函数的偏置项b,nSV为标准支持向量个数(0<a[i]<c),nBSV为边界上的支持向量个数(a[i]=c),Total nSV为支持向量总个数(对于两类来说,因为只有一个分类模型Total nSV = nSV,但是对于多类,这个是各个分类模型的nSV之和)。

在目录下,还可以看到产生了一个train.model文件,可以用记事本打开,记录了训练后的结果。

svm_type c_svc//所选择的svm类型,默认为c_svc

kernel_type rbf//训练采用的核函数类型,此处为RBF核

gamma 0.0769231//RBF核的参数γ

nr_class 2//类别数,此处为两分类问题

total_sv 132//支持向量总个数

rho 0.424462//判决函数的偏置项b

label 1 -1//原始文件中的类别标识

nr_sv 64 68//每个类的支持向量机的个数

SV//以下为各个类的权系数及相应的支持向量

1 1:0.166667 2:1 3:-0.333333 … 10:-0.903226 11:-1 12:-1 13:1

0.5104832128985164 1:0.125 2:1 3:0.333333 … 10:-0.806452 12:-0.333333 13:0.5

…………

-1 1:-0.375 2:1 3:-0.333333…. 10:-1 11:-1 12:-1 13:1

-1 1:0.166667 2:1 3:1 …. 10:-0.870968 12:-1 13:0.5

到现在,第一次体验libsvm到这就基本结束了,其他的两个(svm-predict、svm-scale)的使用过程类似

参考:https://www.cnblogs.com/-ldzwzj-1991/p/5893054.html http://www.cnblogs.com/-ldzwzj-1991/p/5897199.html https://baijiahao.baidu.com/s?id=1580049402237436090&wfr=spider&for=pc

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年12月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下载安装libsvm包
    • 第一种方式
      • 第二种方式
        • 第三种方式
        • LibSVM简单说明
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档