经历手写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列向量的形式返回分类结果。

LibSVM for Python 使用的更多相关文章

  1. 如何利用python使用libsvm

    一:libsvm包下载与使用:      LIBSVM是台湾大学林智仁(Lin Chih-Jen)副教授等开发设计的一个简单.易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在 ...

  2. 在python中的使用Libsvm

    http://blog.csdn.net/pipisorry/article/details/38964135 LIBSVM是台湾大学林智仁(LinChih-Jen)教授等开发设计的一个简单.易于使用 ...

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

    字符型图片验证码识别完整过程及Python实现 1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...

  4. libSVM 简易使用手册

    关于SVM的基础理论知识,可以google这篇文章<SVM的八股简介>,讲解得生动有趣,是入门的极好教材.作为拿来主义者,我更关心怎么用SVM,因此瞄上了台湾林智仁教授提供的libSVM. ...

  5. Linux下的Libsvm使用历程录

    原文:http://blog.csdn.net/meredith_leaf/article/details/6714144 Linux下的Libsvm使用历程录 首先下载Libsvm.Python和G ...

  6. libsvm参数选择

    以前接触过libsvm,现在算在实际的应用中学习 LIBSVM 使用的一般步骤是: 1)按照LIBSVM软件包所要求的格式准备数据集: 2)对数据进行简单的缩放操作: 3)首要考虑选用RBF 核函数: ...

  7. LibSVM学习详细说明

    代码文件主要针对Matlab进行说明,但个人仍觉得讲解的支持向量机内容非常棒,可以做为理解这一统计方法的辅助资料; LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量 ...

  8. python 验证码 高阶验证

    python 验证码 高阶验证 标签: 验证码python 2016-08-19 15:07 1267人阅读 评论(1) 收藏 举报  分类: 其他(33)    目录(?)[+]   字符型图片验证 ...

  9. 字符识别Python实现 图片验证码识别

    字符型图片验证码识别完整过程及Python实现 1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...

随机推荐

  1. 【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】

    不考虑第三方框架,如果只使用JDK提供的API,那么可以使用三种方式调用WebService服务:另外还可以使用Ajax调用WebService服务. 预备工作:开启WebService服务,使用jd ...

  2. winform快速开发平台 -> 基础组件之分页控件

    一个项目控件主要由及部分的常用组件,当然本次介绍的是通用分页控件. 处理思想:我们在处理分页过程中主要是针对数据库操作. 一般情况主要是传递一些开始位置,当前页数,和数据总页数以及相关关联的业务逻辑. ...

  3. filefiter

    1.写一个类继承与FileFilter package com.dream.musicplayer; import <a href="http://lib.csdn.net/base/ ...

  4. 搭建selenium grid简单配置

    1.使用selenium提供的服务端独立jar包 :服务端.客户端都是运行于java7环境. 2.启动hub: hub配置文件如下: Java -jar selenium-server-standal ...

  5. Delphi 关键字详解[整理于 "橙子" 的帖子]

    absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var   Str: ];   StrLen: Byte absolute Str; //这个声明指定了变量 ...

  6. java.lang.OutOfMemoryError: PermGen space错误解决方法

    1. MyEclipse 中报 PermGen space       window--> preferences-->Myclipse-->Servers-->Tomcat- ...

  7. pair的使用

    #include<iostream> #include<cmath> #include<cstdio> #include<algorithm> #inc ...

  8. xcode 一般插件

    插件编写 xcode的插件不算多,找遍了网络也就大猫小猫而三只.不过虽然不多,但是大部分的插件都非常有用.以下5歀插件是我几台机器上都安装了并且经常使用的. 1. MiniXcode MiniXcod ...

  9. Oracle解锁与加锁(HR用户为例)

    SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 14 18:12:38 2009   Copyright (c) 1982, 2002, Ora ...

  10. Mac 终端 Linux 命令总结(简单命令)

    目录操作 命令名 功能描述 使用举例 mkdir 创建一个目录 mkdir dirname rmdir 删除一个目录 rmdir dirname mvdir 移动或重命名一个目录 mvdir dir1 ...