码迷,mamicode.com
首页 > 其他好文 > 详细

机器学习:SVM实践:Libsvm的使用

时间:2015-05-07 23:43:09      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

引言

? ?

本文从应用的角度出发,使用Libsvm函数库解决SVM模型的分类与回归问题

? ?

首先说明一下实验数据,实验数据是Libsvm自带的heart_sacle,是个mat文件

? ?

加载数据集

? ?

mat文件导入MATLAB后会有270*13的实例矩阵变量heart_scale_inst和270*1的标签矩阵heart_scale_label

? ?

技术分享

? ?

技术分享

? ?

分类

? ?

将数据集分为训练数据和测试数据

? ?

首先我们将实验数据分为训练数据和测试数据

? ?

load heart_scale;

? ?

train_data = heart_scale_inst(1:150,:);

train_label = heart_scale_label(1:150,:);

? ?

test_data = heart_scale_inst(151:270,:);

test_label = heart_scale_label(151:270,:);

? ?

利用训练数据集训练得到训练模型

? ?

然后我们就可以用训练数据得到训练模型

? ?

model=svmtrain(train_label,train_data);%%具体参数可以参见svmtrain.c

? ?

我们查看返回的model变量可以发现是如下形式

? ?

技术分享

? ?

下面对返回模型的参数进行一些说明

? ?

model参数说明

? ?

首先是Parameters,其变量打开是以下五个数据

? ?

技术分享

? ?

参数意义从上到下依次为:

-s svm类型:SVM设置类型(默认0)

-t 核函数类型:核函数设置类型(默认2)

-d degree:核函数中的degree设置(针对多项式核函数)(默认3)

-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数)

-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)

? ?

然后是model.nr_class,这个变量表示数据集中有多少类别;= 2 for regression/one-class svm

? ?

接下来是model.Label,这个变量表示数据集中类别的标签都是什么

? ?

然后是model.totalSV,代表总共的支持向量的数目

model.nSV表示每类样本的支持向量的数目,有多少类就有多少个值

? ?

而对于model.ProbAmodel.ProbB是要使用-b参数时才能用到,用于概率估计。

? ?

-b probability_estimates: whether to train a SVC or SVR model for probability estimates,0 or 1 (default 0)

可以参见《A note on Platt‘s probabilistic outputs for support vector machines》论文

? ?

然后是model.sv_coef,这是一个totalSV*1的矩阵,承装的是totalSV个支持向量在决策函数中的系数

? ?

技术分享

? ?

model.SVs是一个totalSV×维度的稀疏矩阵,承装的是totalSV个支持向量

? ?

技术分享

? ?

最后是model.rho是决策函数中的常数项的相反数

? ?

然后是利用测试数据集进行测试

? ?

[predict_label, accuracy, dec_values] = svmpredict(test_label, test_data, model);

? ?

得到三个参数,分别对参数说明如下

? ?

返回参数:

predict_label是预测标签向量

accuracy从上到下依次的意义分别是:

-分类准率(分类问题中用到的参数指标)

-平均平方误差(MSE (mean squared error))[回归问题中用到的参数指标]

-平方相关系数(r2 (squared correlation coefficient))[回归问题中用到的参数指标]

dec_values是一个包含decision值或概率估计(-b 1)的矩阵

? ?

技术分享

最终的类别判断就是根据这个dec_value和阈值作比较得到的

另外多说一句如果k个类,对于decision值,每行包含k(k-1)/2个二分类问题的结果;对于概率,每列包含k个属于每类的概率值

? ?

回归

? ?

对于回归依旧是用svmtrain这个函数

但是对于回归来说选择的SVM类型有限制,svmtrain-s这个选项指定的SVM的类型(default 0)

0 – C-SVC

1 – nu-SVC

2 – one-class SVM

3 – epsilon-SVR

4 – nu-SVR

对于回归来说,只能选3或者43表示epsilon-support vector regression, 4表示nu-support vector regression-t是选择核函数,通常选用RBF核函数,原因在"A Practical Guide support vector classification"中已经简单介绍过了。-p尽量选个比较小的数字。需要仔细调整的重要参数是-c-g。我们用以下代码来进行参数寻优

? ?

mse = 10^10;

for log2c = -10:10,

for log2g = -10:10,

cmd = [‘-v 3 -c ‘, num2str(2^log2c), ‘ -g ‘, num2str(2^log2g) , ‘ -s 3 -p 0.4 -n 0.1‘];

cv = svmtrain(train_Y,train_x,cmd);

if (cv < mse),

mse = cv; bestc = 2^log2c; bestg = 2^log2g;

end

end

end

? ?

-log2c是给出参数c的范围和步长

-log2g是给出参数g的范围和步长

-log2p是给出参数p的范围和步长

机器学习:SVM实践:Libsvm的使用

标签:

原文地址:http://www.cnblogs.com/keedor/p/4486403.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!