libsvm python_LibSVM for Python 使用_weixin_32557949的博客-程序员宅基地

技术标签: libsvm 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列向量的形式返回分类结果。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_32557949/article/details/112989695

智能推荐

GNSS连续运行单参考站解决方案_七星耀华的博客-程序员宅基地

一、前言随着国家信息化程度的提高及计算机网络和通信技术的飞速发展,电子政务、电子商务、数字城市、数字省区和数字地球的工程化和现实化,需要采集多种实时地理空间数据,因此,中国发展CORS系统的紧迫性和必要性越来越突出。几年来,国内不同行业已经陆续建立了一些专业性的卫星定位连续运行网络,目前,为满足国民经济建设信息化的需要,一大批城市、省区和行业正在筹划建立类似的连续运行网络系统,一个新的建网高潮正在到来。当前国内不同行业建设的网站系统基本上还是独立运行的,很多单位的数据只在本单位甚至是本部门内共享和利

android定义多个上下文菜单,Android编程实现为ListView创建上下文菜单(ContextMenu)的方法..._燕尾蝶田的博客-程序员宅基地

本文实例讲述了Android编程实现为ListView创建上下文菜单(ContextMenu)的方法。分享给大家供大家参考,具体如下:ContextMenu称为上下文菜单,一般在控件上长按时弹出。今天我们学习ContextMenu的用法,这里与listview相结合,先在ListView显示几个Item,然后在Item上长按,弹出一个菜单(就是ContextMenu),点击菜单上的项目,提示刚才长...

eval 方法_luxuejuncarl的博客-程序员宅基地

 eval 方法检查 JScript 代码并执行. eval(codeString)必选项 codestring 参数是包含有效 JScript 代码的字符串值。这个字符串将由 JScript 分析器进行分析和执行。说明eval 函数允许 JScript 源代码的动态执行。例如,下面的代码创建了一个包含 Date 对象的新变量 mydate :eval("var myd

shop--12.微信测试号的申请和获取微信用户信息_weixin_30596165的博客-程序员宅基地

在咱们自己的程序里面编写servlet以响应微信号在接下来的步骤中,我们将在测试号里面设置接口配置信息的URL,一经设置,微信公众号便会发请求到我们设置好的URL去,我们必须编写程序应答才能顺利连通微信公众号,因此咱们需要编写相应的响应程序需要编写两个类【SignUtil】 1 /** 2 * 微信请求校验工具类 3 */ 4 public class SignUtil...

51单片机如何用c语言位定义,嵌入式编程(一):51单片机如何将函数 定义到指定程序地址..._weixin_39595271的博客-程序员宅基地

在单片机编程使用中,会涉及到将某些函数定义到指定的code区。此时需要对工程文件进行配置修改才可完成。本期针对单片机平台做出说明介绍1、测试目标将函数testaddr定义到0x6000地址2、测试环境LKT4106加密芯片算法工程、KEIL-C51编译软件、3、实现步骤3.1 使用KEIL软件导入LKT4106算法工程(KEIL软件基本操作不再敷述,如不清楚请自行百度)3.2 在App_Main....

随便推点

自定义触发器报警_weixin_46837396的博客-程序员宅基地

一、自定义触发器报警点击配置—点击主机—点击触发器===点击创建你触发器触发器的名称以及表达式{主机名:key;last()}{主机名:\key:avg(5m)}{主机名:\key:nodata(5m)}自定义触发器表达式进阶二、邮件报警和微信报警邮件报警1.定义发件人...

Oracle 集合转字符,PL/SQL Challenge 每日一题:2014-5-30 将逗号隔开的字符串转换为集合..._App Growing的博客-程序员宅基地

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。以往旧题索引:http://www.itpub.net/forum.php?m ... eid&typeid=1808原始出处:http://www.plsqlchallenge.com/作者:Steven Feuerstein运行环境:SQLPLU...

java 内部编码_Java 中文编码分析_weixin_39928801的博客-程序员宅基地

一、charAt 与 codePonitAt我们知道 Java 内部使用的是 utf-16 作为它的 char、String 的字符编码方式,这里我们叫它内部字符集。而 utf-16 是变长编码,一个字符的编码被称为一个 code point,它可能是 16 位 —— 一个 code unit,也可能是 32 位 —— 两个 code unit。Java 的 char 类型长度为二字节,它对应的是...

资产饼状图_这可能是个坑的博客-程序员宅基地

前言:最近需要项目中需要使用到饼状图呈现用户的账户资金相关信息,于是顺手写了一个。  效果图:   主要思路:环形饼状图实际上是多个扇形拼接成的,最后在中间覆盖白色圆,达到一个空心的效果。区块之间的间隔则是固定的一个角度偏移值。 涉及的主要类:PIEChatView.class      该类继承自View,为控件的主体类PIEChatUtils.class      自定义工具类,主要是浮点数加...

linux下Mplayer的安装过程_专注嵌入式的博客-程序员宅基地

Mplayer的下载需要下载四类文件:MPlayer-1.0rc1.tar.bz2(安装文件)all-20071007.tar.bz2(解码器1)windows-all-20071007.zip(解码器2)BlueHeart-1.5.tar.bz2(皮肤)subfont.ttf(字体)linux的软件最好从官方网站下载,以确保质量,此为其官方地址www1.mpl

计算机鼠标游戏教学法,小学信息技术游戏型教学法初探_是加菲哒的博客-程序员宅基地

游戏教学法就是以游戏的形式,使学生在激烈的竞赛中,在无比的兴奋中,甚至是在刺激和上瘾中,不知不觉地学到了教材中的内容,或者学到了青少年必须掌握的知识。学生爱上信息技术课,但不全是因为爱学信息技术知识,爱上课的原因是因为可以趁老师不注意玩一玩游戏。游戏也就因此成了信息技术教师的一个劲敌,有些教师索性就把计算机上所有的游戏,甚至Windows自带的游戏也删掉了,可还是抓不住学生的心。有时学生宁愿自己漫...

推荐文章

热门文章

相关标签