LibSVM for Python 使用

经历手写SVM的惨烈教训(还是太年轻)之后,我决定使用工具箱/第三方库

Python

libsvm的GitHub仓库

LibSVM是开源的SVM实现,支持C, C++, Java,Python , R 和 Matlab 等, 这里选择使用Python版本。

安装LibSVM

将LibSVM仓库的所有内容放入Python的包目录\Lib\site-packages或者工程目录中。

在libsvm根目录和python子目录下中分别新建名为__init__.py的空文件,这两个空文件将标识所在的目录为python包可以直接导入。

允许草民吐槽一下各种Blog里切换根目录的奇怪的解决方案:这个这个

因为经常使用svm,所以草民将libsvm包放入\Lib\site-packages目录下。在Python交互环境或在任意脚本中都可以使用import libsvm.python来使用libsvm的python接口。

使用LibSVM

LibSVM的使用非常简单,只需调用有限的接口

示例1:

from libsvm.python.svmutil import *
from libsvm.python.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)

输出结果:

optimization finished, #iter = 1
nu = 0.062500
obj = -0.250000, rho = 0.000000
nSV = 2, nBSV = 0
Total nSV = 2
test:
Model supports probability estimates, but disabled in predicton.
Accuracy = 100% (1/1) (classification)
[1.0]

SVM数据中下载train1.txt和test1.txt。

LibSVM可以在文件中读取训练数据,这样便于大规模数据的使用。

示例:

from libsvm.python.svmutil import *
from libsvm.python.svm import *

y, x = svm_read_problem(‘train1.txt‘)
yt, xt = svm_read_problem(‘test1.txt‘)
model = svm_train(y, x )
print(‘test:‘)
p_label, p_acc, p_val = svm_predict(yt[200:202], xt[200:202], model)
print(p_label)

可以看到输出:

optimization finished, #iter = 5371
nu = 0.606150
obj = -1061.528918, rho = -0.495266
nSV = 3053, nBSV = 722
Total nSV = 3053
test:
Accuracy = 40.809% (907/2225) (classification)

LibSVM接口

训练数据格式

libsvm的训练数据格式如下:

<label> <index1>:<value1> <index2>:<value2> ...

示例:

1 1:2.927699e+01 2:1.072510e+02 3:1.149632e-01 4:1.077885e+02

主要类型

  • svm_problem

保存定义SVM模型的训练数据

  • svm_parameter

存储训练SVM模型所需的各种参数

  • svm_model

完成训练的SVM模型

  • svm_node

模型中一个特征的值,只包含一个整数索引和一个浮点值属性。

主要接口:

-svm_problem(y, x)

由训练数据y,x创建svm_problem对象

  • svm_train()

svm_train有3个重载:

model = svm_train(y, x [, ‘training_options‘])
model = svm_train(prob [, ‘training_options‘])
model = svm_train(prob, param)

用于训练svm_model模型

  • `svm_parameter(cmd)

创建svm_parameter对象,参数为字符串。

示例:

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

调用语法:

p_labs, p_acc, p_vals = svm_predict(y, x, model [,‘predicting_options‘])

参数:

y 测试数据的标签

x 测试数据的输入向量

model为训练好的SVM模型。

返回值:

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

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

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

这个函数不仅是测试用的接口,也是应用状态下进行分类的接口。比较奇葩的是需要输入测试标签y才能进行预测,因为y不影响预测结果可以用0向量代替。

  • svm_read_problem

读取LibSVM格式的训练数据:

y, x = svm_read_problem(‘data.txt‘)
  • svm_save_model

将训练好的svm_model存储到文件中:

svm_save_model(‘model_file‘, model)

model_file的内容:

svm_type c_svc
kernel_type linear
nr_class 2
total_sv 2
rho 0
label 1 -1
probA 0.693147
probB 2.3919e-16
nr_sv 1 1
SV
0.25 1:1 2:1
-0.25 1:-1 2:-1 
  • svm_load_model

读取存储在文件中的svm_model:

 model = svm_load_model(‘model_file‘)

调整SVM参数

LibSVM在训练和预测过程中需要一系列参数来调整控制。

svm_train的参数:

  • -s SVM的类型(svm_type)

    • 0 -- C-SVC(默认)

      使用惩罚因子(Cost)的处理噪声的多分类器

    • 1 -- nu-SVC(多分类器)

      按照错误样本比例处理噪声的多分类器

    • 2 -- one-class SVM

      一类支持向量机,可参见"SVDD"的相关内容

    • 3 -- epsilon-SVR(回归)

      epsilon支持向量回归

    • 4 -- nu-SVR(回归)
  • -t 核函数类型(kernel_type)
    • 0 -- linear(线性核):

      u‘*v

    • 1 -- polynomial(多项式核):

      (gamma*u‘*v + coef0)^degree

    • 2 -- radial basis function(RBF,径向基核/高斯核):

      exp(-gamma*|u-v|^2)

    • 3 -- sigmoid(S型核):

      tanh(gamma*u‘*v + coef0)

    • 4 -- precomputed kernel(预计算核):

      核矩阵存储在training_set_file

下面是调整SVM或核函数中参数的选项:

  • -d 调整核函数的degree参数,默认为3
  • -g 调整核函数的gamma参数,默认为1/num_features
  • -r 调整核函数的coef0参数,默认为0
  • -c 调整C-SVC, epsilon-SVR 和 nu-SVR中的Cost参数,默认为1
  • -n 调整nu-SVC, one-class SVM 和 nu-SVR中的错误率nu参数,默认为0.5
  • -p 调整epsilon-SVR的loss function中的epsilon参数,默认0.1
  • -m 调整内缓冲区大小,以MB为单位,默认100
  • -e 调整终止判据,默认0.001
  • -wi调整C-SVC中第i个特征的Cost参数

调整算法功能的选项:

  • -b 是否估算正确概率,取值0 - 1,默认为0
  • -h 是否使用收缩启发式算法(shrinking heuristics),取值0 - 1,默认为0
  • -v 交叉校验
  • -q 静默模式

Matlab

LibSVM的Matlab接口用法类似,Matlab丰富的标准工具箱提供了各种方便。

Statistic Tools工具箱提供了svmtrain和svmclassify函数进行SVM分类。

traindata = [0 1; -1 0; 2 2; 3 3; -2 -1;-4.5 -4; 2 -1; -1 -3];
group = [1 1 -1 -1 1 1 -1 -1]‘;
testdata = [5 2;3 1;-4 -3];
svm_struct = svmtrain(traindata,group);
Group = svmclassify(svm_struct,testdata);

svmtrain接受traindata和group两个参数,traindata以一行表示一个样本,group是与traindata中样本对应的分类结果,用1和-1表示。

svmtrain返回一个存储了训练好的svm所需的参数的结构体svm_struct。

svmclassify接受svm_struct和以一行表示一个样本的testdata,并以1和-1列向量的形式返回分类结果。

时间: 2024-08-25 20:56:48

LibSVM for Python 使用的相关文章

Libsvm在python中的使用

LIBSVM是台湾大学林智仁(LinChih-Jen)教授等开发设计的一个简单.易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进.修改以及在其它操作系统上应用:该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题:并提供了交互检验(Cross Validation)的功能.该软件包可在http://www.csie.ntu.edu.tw/~cjlin/免费获得.该软件可

Python 之 LIBSVM 使用小结(二)

网上许多libsvm的python教程中经常会有这样的例子,但是运行会出现 ImportError: No module named svmutil 的报错. import os import sys os.chdir('C:\libsvm-3.17\python') from svmutil import * y, x = svm_read_problem('../lkagain.txt') m = svm_train(y[:275], x[:275], '-c 5') y, x = svm_

Python 之 LIBSVM下的简单使用

1)从python官网上下载windows下的安装包python-2.7.3.msi并安装 2)打开IDLE(python GUI),输入 >>>import sys >>>sys.version 如果你的python是32位,将出现如下字符: '2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]' 这个时候LIBSVM的python接口设置将非常简单.在libsvm-3.16文件夹下的w

转自网络用LIBSVM进行回归预测的粗浅认识————————作者师梦

说一说我对用LIBSVM进行回归预测的粗浅认识(整理完成于2012年5.11) 作者 :  师梦       吾本工程小硕一枚,前用matlab建模,已然完成.某日,正沾沾自喜之际,吾师曰:"汝已为之,甚好.然此法仅用于后期处理,若在线,数控之机床不识别之,汝改之,标准C即可".吾大惊,标准C?难也,难也.然师命不可违.吾即度之,然度娘不甚给力,正愁苦之际,学长曰:"可尝试libsvm."吾大喜,遂改之.吾本非程序员,故重重困难,可想而知.怎奈三周之调试,才得体验&

LIBSVM使用介绍

1.首先从主页上下载libsvm.Python2.5.2和gnuplot 三个软件. http://www.csie.ntu.edu.tw/~cjlin/ 2.准备好数据,首先要把数据转换成Libsvm软件包要求的数据格式为: label index1:value1 index2:value2 ... 其中对于分类来说label为类标识,指定数据的种类 :对于回归来说label为目标值.(我主要要用到回归) Index是从1开始的自然数,value是每一维的特征值. 该过程可以自己使用excel

字符型图片验证码识别完整过程及Python实现

1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻.本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义. 2   关键词 关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL 3   免责声明 本文研究所用素材来自于某旧Web框架的网站 完全对外公开 的公共图片资源. 本文只做了该网站对外公开的公共图片资源进行了爬取, 并未越权 

libSVM 简易使用手册

关于SVM的基础理论知识,可以google这篇文章<SVM的八股简介>,讲解得生动有趣,是入门的极好教材.作为拿来主义者,我更关心怎么用SVM,因此瞄上了台湾林智仁教授提供的libSVM.我把自己的使用过程记录下来,感觉按照下面的步骤,傻瓜应该也可以用SVM了. 1. 相关程序的下载.安装 总共要下载libsvm,python,gnuplot三个程序. 1.1 libsvm:到http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 下载,我用的是libsvm-3.1

LibSVM学习

原文:http://blog.csdn.net/passball/article/details/7673725 代码文件主要针对Matlab进行说明,但个人仍觉得讲解的支持向量机内容非常棒,可以做为理解这一统计方法的辅助资料; LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,可以很方便的对数据做分类或回归.由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库. 这套库可以

【作业一】林轩田机器学习技术

关注的是编程题目Q15~Q20 这里需要借用libsvm的python包,需要一下几个处理步骤: (1)到libsvm官网(http://www.csie.ntu.edu.tw/~cjlin/libsvm/)下载.gz包,解压缩到一个目录 (2)在解压的根目录make命令 (3)再到解压缩根目录下的python文件夹make命令 (4)把根目录下的libsvm.so.2,python文件夹下的svm.py和svmutil.py,三个文件提取出来,存放到一个新的文件夹(我的文件夹命名为libsvm