LIBSVM 参数详解

使用的svm工具箱是台湾大学林智仁教授编写的lisvm下载地址点击打开链接,这是目前最流行也是最好用的svm工具箱。Matlab安装使用svm的详细步骤可以参考以下两个连接详解点击打开链接视频点击打开链接,这里不再赘述。本人用的是libsvm-3.17版本。

下面结合matlab代码给出详解:

clc;
clear;
close all;

%导入数据其中wine_SVM是一个178*13行矩阵行表示共有178个特征值每个特征值有13个属性

load wine_SVM;

%为简化程序运行代价我们这里只取wine_SVM中的第一,二列。即取13个属性中的第一二个属性此时data是一个178*2行的矩阵也就是有178个特征值每个特征值有2个属性
data = [wine(:,1),wine(:,2)];
groups = ismember(wine_labels,1);

[train, test] = crossvalind('holdOut',groups);

                                  
%选出训练集

train_wine = data(train,:);
train_wine_labels = groups(train,:);

train_wine_labels = double( train_wine_labels );

%选出测试集

test_wine = data(test,:);
test_wine_labels = groups(test,:);
test_wine_labels = double( test_wine_labels );


%svmtrain是libsvm中最主要的函数之一,主要功能是得出训练超平面

model = svmtrain(train_wine_labels,train_wine,'-c 1 -g 0.07');
model

%svmpredict是libsvm中最主要的函数,功能是预测测试集的分类效果

[predict_label, accuracy, decision_values] = svmpredict(test_wine_labels,test_wine,model);
accuracy

%以下是绘图函数代码,直观显示分类效果

figure;
hold on;
[m,n] = size(train_wine);
for run = 1:m
    if train_wine_labels(run) == 1
        h1 = plot( train_wine(run,1),train_wine(run,2),'r+' );
    else
        h2 = plot( train_wine(run,1),train_wine(run,2),'g*' );
    end
    for i = 1:model.totalSV
        if model.SVs(i,1)==train_wine(run,1) && model.SVs(i,2)==train_wine(run,2)
            h3 = plot( train_wine(run,1),train_wine(run,2),'o' );
        end
    end
end
legend([h1,h2,h3],'1','0','Support Vectors');
hold off;

运行结果:

optimization finished, #iter = 37
nu = 0.555556
obj = -42.305155, rho = 0.769301 
nSV = 51, nBSV = 48
Total nSV = 51

model = 
    Parameters: [5x1 double]
      nr_class: 2
       totalSV: 51
           rho: 0.7693
         Label: [2x1 double]
    sv_indices: [51x1 double]
         ProbA: []
         ProbB: []
           nSV: [2x1 double]
       sv_coef: [51x1 double]
           SVs: [51x2 double]

Accuracy = 88.6364% (78/88) (classification)

accuracy =

   88.6364
    0.1136
    0.5518

 

 

现简单对屏幕回显信息进行说明:

#iter为迭代次数,

nu 设置nu - SVC、one-class-SVM 与nu - SVR 中参数nu ,默认值0.5

obj为SVM文件转换为的二次规划求解得到的最小值,

rho 为判决函数的常数项b,

nSV 为支持向量个数,

nBSV为边界上的支持向量个数,

Total nSV为支持向量总个数。

这里面要说一下返回参数accuracy的三个参数的意义。 

返回参数accuracy从上到下依次的意义分别是:
分类准率(分类问题中用到的参数指标)
平均平方误差(MSE (mean squared error)) [回归问题中用到的参数指标]
平方相关系数(r2 (squared correlation coefficient))[回归问题中用到的参数指标]

Svmtrain函数的用法:svmtrain (training_label,train_data,[options])

其中options涵义如下:

-s svm类型:设置SVM 类型,默认值为0,可选类型有:

0 -- C- SVC

1 -- nu - SVC

2 -- one-class-SVM

3 -- e - SVR

4 -- nu-SVR

-t 核函数类型:设置核函数类型,默认值为2,可选类型有:

0 -- 线性核:u'*v

1 -- 多项式核:(g*u'*v+ coef0)degree

2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)

3 -- sigmoid 核:tanh(g*u'*v+ coef 0)

-d degree:核函数中的degree设置,默认值为3;

-g r(gama):核函数中的函数设置(默认1/ k);

-r coef 0:设置核函数中的coef0,默认值为0;

-c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认值为1;

-n nu :设置nu - SVC、one-class-SVM 与nu - SVR 中参数nu ,默认值0.5;

-p e :核宽,设置e - SVR的损失函数中的e ,默认值为0.1;

-m cachesize:设置cache内存大小,以MB为单位(默认40):

-e e :设置终止准则中的可容忍偏差,默认值为0.001;

-h shrinking:是否使用启发式,可选值为0 或1,默认值为1;

-b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;

-wi weight:对各类样本的惩罚系数C加权,默认值为1;

-v n:n折交叉验证模式。

其中-g选项中的k是指输入数据中的属性数。操作参数 -v 随机地将数据剖分为n 部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM 的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。

svmpredict函数的用法:

[predicted_label, accuracy,decision_values]=svmpredict(teat_label,teat_data,model)

关于svmpredict有以下几点说明在老版的libsvm中[predicted_label, accuracy]=svmpredict(test_label,teat_data,model)不会有错,但是在libsvm3.17版本中会报错,这是因为libsvm对新版本的重新设定,改为如下命令即可:

[predicted_label, accuracy,decision_values]=svmpredict(teat_label,teat_data,model)

[predicted_label]=svmpredict(teat_label,teat_data,model)。


下面对model中的参数逐一说明:

>>  model.Parameters
ans =

         0
    2.0000
    3.0000
    0.0700
         0

model.Parameters参数意义从上到下依次为:  
-s svm类型:SVM设置类型(默认0)
-t 核函数类型:核函数设置类型(默认2)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)

即在本例中通过model.Parameters我们可以得知 –s 参数为0;-t 参数为 2;-d 参数为3;-g 参数为0.07(这也是我们自己的输入);-r 参数为0。

关于libsvm参数的一点小说明:Libsvm中参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
model.Label         model.nr_class

  model.Label

ans =

     1

     0

>> model.nr_class

ans =

     2

model.Label表示数据集中类别的标签都有什么,这里是 1,0;
model.nr_class表示数据集中有多少类别,这里是二分类。

model.totalSV                model.nSV

>>  model.totalSV

ans =

    51

>> model.nSV

ans =

    25
    26

model.totalSV代表总共的支持向量的数目,这里共有51个支持向量;
model.nSV表示每类样本的支持向量的数目,这里表示标签为1的样本的支持向量有25个,标签为0的样本的支持向量为26
注意:这里model.nSV所代表的顺序是和model.Label相对应的。

model.ProbA         model.ProbB

关于这两个参数这里不做介绍,使用-b参数时才能用到,用于概率估计。

model.sv_coef         model.SVs        model.rho

sv_coef: [51x1 double]
           SVs: [51x2 double]

model.rho =  0.7693

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

model.SVs是一个51*2的稀疏矩阵,承装的是51个支持向量。

model.rho是决策函数中的常数项的相反数(-b)


在这里首先我们看一下 通过 –s 0 参数(C-SVC模型)得到的最终的分类决策函数的表达式是怎样的?

最终的决策函数为:

3.jpg 

核函数采用默认的RBF故这里的决策函数即为:

4.jpg 

其中|| x-y ||是二范数距离 ;
这里面的

b就是-model.rho(一个标量数字);
b = -model.rho;
n代表支持向量的个数即 n = model.totalSV(一个标量数字); 
对于每一个i:
wi =model.sv_coef(i); 支持向量的系数(一个标量数字)
xi = model.SVs(i,:) 支持向量(1*2的行向量)
x 是待预测标签的样本 (1*2的行向量)

gamma 就是 -g 参数

原文地址:http://www.voidcn.com/blog/XR1064/article/p-2283750.html

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值