一个lisvm包的安装,网上教程太多,众说纷纭,在此做一个简单的总结
LibSVM是中国台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,可以很方便的对数据做分类或回归。由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。
whl文件下载(下载对应python版本的) https://www.lfd.uci.edu/~gohlke/pythonlibs/#libsvm
打开cmd,安装(对应路径和文件名)
pip install libsvm‑3.22‑cp37‑cp37m‑win_amd64.whl
有人说: 安装成功后,会在python目录下的一个库文件夹site-packages下找到新生成的libsvm.dll,一样将其放置到C:\windows\system32目录
测试
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)
运行没错的话应该就安装成功了
2.添加动态链接文件(.dll文件)
在下载的libsvm文件夹中,有一个文件夹叫做windows,里面有一个动态链接文件libsvm.dll,这个文件默认是32位系统格式的,如果你的Python是32位的话,则可以直接用这个dll文件,将在拷贝到C:\Windows\System32下即可。
如果你的系统是64位的,则需要重新编译64位的dll文件。假设你已经安装了VS,以安装了VS2015为例,你可以在win10的全部应用中的VS目录下找到 VS2015 x64 本机工具命令提示符,这个小黑框,然后用cd命令进入到你下载的libsvm的文件中,输入以下指令:
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
,否则无法实现导入。 这样在导入:
from libsvm.python.svm import *
from libsvm.python.svmutil import *
也可以不添加到Python默认路径中,直接
import sys
sys.path.append("libsvm/python")
import svm
import svmutil
这样也是可以的,但建议前面那种
在运行时发现还是出错,说svmutil中找不到模块svm。这是因为在svmutil.py模块中有两个导入语句:
from svm import *
from svm import __all__ as svm_all
这两个导入语句中,默认svm已经是在系统路径中,但是实际上不是,如果我们 已经将libsvm添加到Python默认路径中,则直接将上面的改为:
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是特征值
train_label, train_value = svm_read_problem("G:\\train.txt") #训练数据集
predict_label, predict_value = svm_read_problem("G:\\predict.txt") #预测数
训练模型
model = svm_train(train_label,train_value)
用模型预测数据类别 结构返回为,预测类别集合,准确率,
p_label, p_acc, p_val = svm_predict(predict_label, predict_value, model)
print(p_acc)#打印预测结果
p_labs是存储预测标签的列表。
p_acc存储了预测的精确度,均值和回归的平方相关系数。
p_vals在指定参数’-b 1’时将返回判定系数(判定的可靠程度)。
下载.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**——**是创建的结果文件,保存了训练后的结果
可以看到结果:
*
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