本帖子主要就是讲解利用libsvm-mat工具箱建立分类(回归模型)后,得到的模型model里面参数的意义都是神马?以及如果通过model得到相应模型的表达式,这里主要以分类问题为例子。

测试数据使用的是libsvm-mat自带的heart_scale.mat数据(270*13的一个属性据矩阵,共有270个样本,每个样本有13个属性),方便大家自己测试学习。

首先上一个简短的测试代码:

  1. %% ModelDecryption
    % by faruto @ faruto's Studio~
    % http://blog.sina.com.cn/faruto
    % Email:faruto@.com
    % http://www.matlabsky.com
    % http://www.mfun.la
    % http://video.ourmatlab.com
    % last modified by 2011.01.
    %% a litte clean work
    tic;
    close all;
    clear;
    clc;
    format compact;
    %%
    % 首先载入数据
    load heart_scale;
    data = heart_scale_inst;
    label = heart_scale_label;
    % 建立分类模型
    model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8');
    model
    % 利用建立的模型看其在训练集合上的分类效果
    [PredictLabel,accuracy] = svmpredict(label,data,model);
    accuracy
    %%
    toc;

运行结果:

  1. model =
    Parameters: [5x1 double]
    nr_class:
    totalSV:
    rho: 0.0514
    Label: [2x1 double]
    ProbA: []
    ProbB: []
    nSV: [2x1 double]
    sv_coef: [259x1 double]
    SVs: [259x13 double]
    Accuracy = 99.6296% (/) (classification)
    accuracy =
    99.6296
    0.0148
    0.9851
    Elapsed time is 0.040155 seconds.

这里面为了简单起见没有将测试数据进行训练集和测试集的划分,这里仅仅是为了简单明了而已,分类结果估计可以不要管,参数优化也不要管,另有帖子讲解。

下面我们就看看 model这个结构体里面的各种参数的意义都是神马,model如下:

model = 
    Parameters: [5x1 double]
      nr_class: 2
       totalSV: 259
           rho: 0.0514
         Label: [2x1 double]
         ProbA: []
         ProbB: []
           nSV: [2x1 double]
       sv_coef: [259x1 double]
           SVs: [259x13 double]

model.Parameters

我们先来看一下model.Parameters里面承装的都是什么:

  1. >> model.Parameters
    ans = 2.0000
    3.0000
    2.8000

重要知识点:

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 参数为2.8(这也是我们自己的输入);-r 参数为0。

关于libsvm参数的一点小说明:

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

model.Label         model.nr_class

  1. >> model.Label
    ans = -
    >> model.nr_class
    ans =

重要知识点:

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

model.totalSV                model.nSV

  1. >> model.totalSV
    ans = >> model.nSV
    ans =

重要知识点:

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

model.ProbA         model.ProbB

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

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

model.sv_coef         model.SVs        model.rho

  1.        sv_coef: [259x1 double]
    SVs: [259x13 double]
    model.rho = 0.0514

重要知识点:

model.sv_coef是一个259*1的矩阵,承装的是259个支持向量在决策函数中的系数;
model.SVs是一个259*13的稀疏矩阵,承装的是259个支持向量。
model.rho是决策函数中的常数项的相反数(-b)

在这里首先我们看一下 通过 –s 0 参数(C-SVC模型)得到的最终的分类决策函数的表达式是怎样的?
这里如果有关于C-SVC模型不懂的地方,请看这个pdf文件:

libsvm_library.pdf
附件:
 libsvm_library.pdf (316.82 KB)

最终的决策函数为:

在由于我们使用的是RBF核函数(前面参数设置 –t 2),故这里的决策函数即为:

其中|| x-y ||是二范数距离 ;

这里面的

b就是-model.rho(一个标量数字);
b = -model.rho;
n代表支持向量的个数即 n = model.totalSV(一个标量数字);

对于每一个i:
wi =model.sv_coef(i); 支持向量的系数(一个标量数字)
xi = model.SVs(i,:) 支持向量(1*13的行向量)

x 是待预测标签的样本 (1*13的行向量)
gamma 就是 -g 参数

好的下面我们通过model提供的信息自己建立上面的决策函数如下:

  1. %% DecisionFunction
    function plabel = DecisionFunction(x,model)
    gamma = model.Parameters();
    RBF = @(u,v)( exp(-gamma.*sum( (u-v).^) ) );
    len = length(model.sv_coef);
    y = ;
    for i = :len
    u = model.SVs(i,:);
    y = y + model.sv_coef(i)*RBF(u,x);
    end
    b = -model.rho;
    y = y + b;
    if y >=
    plabel = ;
    else
    plabel = -;
    end

有了这个决策函数,我们就可以自己预测相应样本的标签了:

  1. %%
    plable = zeros(,);
    for i = :
    x = data(i,:);
    plabel(i,) = DecisionFunction(x,model);
    end
    %% 验证自己通过决策函数预测的标签和svmpredict给出的标签相同
    flag = sum(plabel == PredictLabel)
    over = ;

最终可以看到 flag = 270 ,即自己建立的决策函数是正确的,可以得到和svmpredict得到的一样的样本的预测标签,事实上svmpredict底层大体也就是这样实现的。

最后我们来看一下,svmpredict得到的返回参数的意义都是什么

在下面这段代码中 :

  1. %%
    % 首先载入数据
    load heart_scale;
    data = heart_scale_inst;
    label = heart_scale_label;
    % 建立分类模型
    model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8');
    model
    % 利用建立的模型看其在训练集合上的分类效果
    [PredictLabel,accuracy] = svmpredict(label,data,model);
    accuracy

运行可以看到

  1. model =
    Parameters: [5x1 double]
    nr_class:
    totalSV:
    rho: 0.0514
    Label: [2x1 double]
    ProbA: []
    ProbB: []
    nSV: [2x1 double]
    sv_coef: [259x1 double]
    SVs: [259x13 double]
    Accuracy = 99.6296% (/) (classification)
    accuracy =
    99.6296
    0.0148
    0.9851

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

重要的知识点:

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

其中mse 和r2的计算公式分别为:

插图:
<ignore_js_op>

写在后面的话,至此关于model中相应参数的一些意义,以及到底如果得到决策函数的表达式或者计算方式的就算是说的很明了了。

可能还有的同学会问,如何得到分类决策函数中的那个alpha系数【这个肯定会有人问】,还是再磨叽说一下吧:

上面的wi其实是alpha和支持向量的类别标签(1或-1的乘积),原始决策函数的表达式如下:
插图:
<ignore_js_op>

上面的yi是支持向量的类别标签(1或者-1),在libsvm中将yi和alpha的乘积放在一起用model.sv_coef(w)来承装。
都说到这份上,应该能明白了吗?

再说点废话:就是在关于SVM的学习中,我发现很多朋友都不主动思考和尝试,老是在问,这样很不好,这样很被动,上面这些也没有人教我,都是我自己思考出来,然后编程验证,如果出现不合理的地方就再继续思考,反正道理和书籍里面都有讲解,总能洞穿的啊。O(∩_∩)O•

Anyway,有关于SVM的问题还是可以一起探讨的,但您首先要独立思考一下下才好,您说是不是~

PS:预祝大家春节愉快

by faruto 2011.01.06

利用libsvm-mat建立分类模型model参数解密[zz from faruto]的更多相关文章

  1. 利用CART算法建立分类回归树

    常见的一种决策树算法是ID3,ID3的做法是每次选择当前最佳的特征来分割数据,并按照该特征所有可能取值来切分,也就是说,如果一个特征有四种取值,那么数据将被切分成4份,一旦按某特征切分后,该特征在之后 ...

  2. LiBsvm用于多分类时训练模型参数含义

    The 'svmtrain' function returns a model which can be used for futureprediction.  It is a structure a ...

  3. libsvm 训练后的模型参数讲解(转)

    主要就是讲解利用libsvm-mat工具箱建立分类(回归模型)后,得到的模型model里面参数的意义都是神马?以及如果通过model得到相应模型的表达式,这里主要以分类问题为例子.测试数据使用的是li ...

  4. [转]libsvm 训练后的模型参数讲解

    http://blog.sina.com.cn/s/blog_6646924501018fqc.html 主要就是讲解利用libsvm-mat工具箱建立分类(回归模型)后,得到的模型model里面参数 ...

  5. 使用libsvm实现文本分类

    @Hcy(黄灿奕) 文本分类,首先它是分类问题,应该对应着分类过程的两个重要的步骤,一个是使用训练数据集训练分类器,另一个就是使用测试数据集来评价分类器的分类精度.然而,作为文本分类,它还具有文本这样 ...

  6. 利用ARIMA算法建立短期预测模型

    周五福利日活动是电信为回馈老用户而做的活动,其主要回馈老用户的方式是让用户免费领取对应的优惠券,意在提升老用户的忠诚度和活跃度.今日,为保证仓库备货优惠券资源充足,特别是5元话费券等,需要对该类优惠券 ...

  7. 使用PyTorch建立你的第一个文本分类模型

    概述 学习如何使用PyTorch执行文本分类 理解解决文本分类时所涉及的要点 学习使用包填充(Pack Padding)特性 介绍 我总是使用最先进的架构来在一些比赛提交模型结果.得益于PyTorch ...

  8. 利用tensorboard可视化checkpoint模型文件参数分布

    写在前面: 上周微调一个文本检测模型seglink,将特征提取层进行冻结,只训练分类回归层,然而查看tensorboard发现里面有histogram显示模型各个参数分布,看了目前这个训练模型参数分布 ...

  9. 分类模型的性能评价指标(Classification Model Performance Evaluation Metric)

    二分类模型的预测结果分为四种情况(正类为1,反类为0): TP(True Positive):预测为正类,且预测正确(真实为1,预测也为1) FP(False Positive):预测为正类,但预测错 ...

随机推荐

  1. MySQL 简单存储过程实现Redis的INCR功能

    USE test; DROP PROCEDURE IF EXISTS pro_testincrement; DELIMITER && CREATE PROCEDURE pro_test ...

  2. Struts 2相关配置与基本操作演示(案例Demo)

    基本介绍 Struts 2        Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2 ...

  3. JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134851.html 在开发过程中,经常做的一件事,也是最基本的事,就是从数据库中查询数据,然后在客户端显示出 ...

  4. 【PMP】财务测量指标ROI、PBP、NPV、IRR、BCR

    各指标说明: 1.投资回报率(ROI) 定义:是指通过投资而应返回的价值,即企业从一项投资活动中得到的经济回报. 1.1 年平均利润相等的情况下 公式:ROI=年平均利润/投资额 案例: 1.2 年平 ...

  5. where常用运算符

    mysql查询的五种子句:where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数) where常用运算符:比较运算符> , &l ...

  6. 转:Ogre源码剖析1

    初学Ogre 貌似看到一些套路(ajohn) 1 Ogre的编译  获得最新的Ogre 1.71 和之前的Ogre比起来,除了sampler集成之外,最大的改变就是编译过程加入了Cmake,这个东西其 ...

  7. fisheye Error occurred during initialization of VM Could not reserve enough space for object heap 问题解决!

    参考文章:https://answers.atlassian.com/questions/9397/not-enough-heap-space-to-run-fisheye fisheye下载好了之后 ...

  8. Python学习笔记(六)—— 条件判断

    一.语法 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> e ...

  9. SqlServer 2005 将已存在大量数据的表更改为分区表

    一.分区表简介: 使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性.分区一方面可以将数据分为更小.更易管理的部分,为提高性能起到一定的作用:另一方面,对于如果具有多个 ...

  10. 【MongoDB】MongoDB的java驱动包使用

    要在Java中使用Mongo数据库 首先导入驱动包mongo-java-driver.jar. 然后获得库,获得集合.就可以对数据库操作了,比如: //创建MongoClient对象 MongoCli ...