当前位置: 首页 > news >正文

libsvm python_LibSVM for Python 使用

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

Python

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的训练数据格式如下:

:: ...

示例:

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

相关文章:

  • 列表输出循环左移_Java Note-数据结构(3)列表
  • mysql 远程日志_将syslog ng日志写入MySQL(远程)数据库
  • mysql npe问题_万恶的 NPE 如何避免,几种你必须知道的方案!!!
  • dubbo monitor mysql_dubbox 的各种管理和监管
  • mysql传入Bean_mysql 表映射为java bean 手动生成。
  • mysql数据库程序员_大神程序员养成之路-Mysql数据库基础
  • mac svn客户端_SmartSVN 12 for Mac(SVN客户端)
  • mysql随机数据插入_mysql随机数据生成并插入
  • asp 备份 mysql数据库_用Asp备份与恢复SQL Server 数据库_数据库相关_脚本
  • mysql rds数据库优势_云数据库RDS基础版的优势及适用场景
  • mysql写下拉树_PHP+mysql实现从数据库获取下拉树功能的方法
  • host mysql server_mysql远程连接 Host * is not allowed to connect to this MySQL server
  • python 迭代对象必须实现的方法_关于python的可迭代对象、迭代器、生成器的理解...
  • python上手度_(国内首发)最新python初学者上手练习
  • mysql中引号的作用是什么_mysql单引号和双引号的用法
  • [译]前端离线指南(上)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 03Go 类型总结
  • css选择器
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • iOS 颜色设置看我就够了
  • Java精华积累:初学者都应该搞懂的问题
  • jquery ajax学习笔记
  • JS题目及答案整理
  • Linux后台研发超实用命令总结
  • Python - 闭包Closure
  • Vim Clutch | 面向脚踏板编程……
  • Vue 重置组件到初始状态
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • - 概述 - 《设计模式(极简c++版)》
  • 给第三方使用接口的 URL 签名实现
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 小程序测试方案初探
  • 源码安装memcached和php memcache扩展
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • !$boo在php中什么意思,php前戏
  • $$$$GB2312-80区位编码表$$$$
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (超详细)语音信号处理之特征提取
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (篇九)MySQL常用内置函数
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)Linux Shell编程——输入输出重定向
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .java 9 找不到符号_java找不到符号
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .考试倒计时43天!来提分啦!
  • @private @protected @public
  • @Valid和@NotNull字段校验使用
  • [.NET 即时通信SignalR] 认识SignalR (一)