Python中使用libsvm

来源:互联网 发布:php 做数据统计图 编辑:程序博客网 时间:2024/06/04 18:41

1.下载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的文件中,输入以下指令:

nmake -f Makefile.win clean all

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

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 syssys.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模块了。

4.训练数据

假设训练数据集文件路径为: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)                                                          #打印预测结果

某完整代码如下:

from libsvm.python.svm import *from libsvm.python.svmutil import *train_label,train_pixel = svm_read_problem('G:\\data\\good-image-data') predict_label,predict_pixel = svm_read_problem('G:\\data\\predict-image-data')model = svm_train(train_label, train_pixel)print("result:")p_label, p_acc, p_val = svm_predict(predict_label, predict_pixel, model);print(p_acc)

更详细的使用libsvm接口的办法请查看libsvm中的readme文件。

原创粉丝点击