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

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

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

  1. %% ModelDecryption
  2. % by faruto @ faruto's Studio~
  3. % http://blog.sina.com.cn/faruto
  4. % Email:faruto@163.com
  5. % http://www.matlabsky.com
  6. % http://www.mfun.la
  7. % http://video.ourmatlab.com
  8. % last modified by 2011.01.06
  9. %% a litte clean work
  10. tic;
  11. close all;
  12. clear;
  13. clc;
  14. format compact;
  15. %%
  16. % 首先载入数据
  17. load heart_scale;
  18. data = heart_scale_inst;
  19. label = heart_scale_label;
  20. % 建立分类模型
  21. model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8');
  22. model
  23. % 利用建立的模型看其在训练集合上的分类效果
  24. [PredictLabel,accuracy] = svmpredict(label,data,model);
  25. accuracy
  26. %%
  27. toc;

 

运行结果:

  1. model =
  2. Parameters: [5x1 double]
  3. nr_class: 2
  4. totalSV: 259
  5. rho: 0.0514
  6. Label: [2x1 double]
  7. ProbA: []
  8. ProbB: []
  9. nSV: [2x1 double]
  10. sv_coef: [259x1 double]
  11. SVs: [259x13 double]
  12. Accuracy = 99.6296% (269/270) (classification)
  13. accuracy =
  14. 99.6296
  15. 0.0148
  16. 0.9851
  17. 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
  2. ans =
  3. 0
  4. 2.0000
  5. 3.0000
  6. 2.8000
  7. 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 参数为2.8(这也是我们自己的输入);-r 参数为0。

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

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

  1. >> model.Label
  2. ans =
  3. 1
  4. -1
  5. >> model.nr_class
  6. ans =
  7. 2

 

重要知识点:

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

model.totalSV model.nSV

  1. >> model.totalSV
  2. ans =
  3. 259
  4. >> model.nSV
  5. ans =
  6. 118
  7. 141

 

重要知识点:

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]
  2. SVs: [259x13 double]
  3. 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
附件:
最终的决策函数为:
在由于我们使用的是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
  2. function plabel = DecisionFunction(x,model)
  3. gamma = model.Parameters(4);
  4. RBF = @(u,v)( exp(-gamma.*sum( (u-v).^2) ) );
  5. len = length(model.sv_coef);
  6. y = 0;
  7. for i = 1:len
  8. u = model.SVs(i,:);
  9. y = y + model.sv_coef(i)*RBF(u,x);
  10. end
  11. b = -model.rho;
  12. y = y + b;
  13. if y >= 0
  14. plabel = 1;
  15. else
  16. plabel = -1;
  17. end

 

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

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

 

最终可以看到 flag = 270 ,即自己建立的决策函数是正确的,可以得到和svmpredict得到的一样的样本的预测标签,事实上svmpredict底层大体也就是这样实现的。
最后我们来看一下,svmpredict得到的返回参数的意义都是什么
在下面这段代码中 :

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

 

运行可以看到

  1. model =
  2. Parameters: [5x1 double]
  3. nr_class: 2
  4. totalSV: 259
  5. rho: 0.0514
  6. Label: [2x1 double]
  7. ProbA: []
  8. ProbB: []
  9. nSV: [2x1 double]
  10. sv_coef: [259x1 double]
  11. SVs: [259x13 double]
  12. Accuracy = 99.6296% (269/270) (classification)
  13. accuracy =
  14. 99.6296
  15. 0.0148
  16. 0.9851

 

这里面要说一下返回参数accuracy的三个参数的意义。
重要的知识点:

返回参数accuracy从上到下依次的意义分别是:
分类准率(分类问题中用到的参数指标)
平均平方误差(MSE (mean squared error)) [回归问题中用到的参数指标]
平方相关系数(r2 (squared correlation coefficient))[回归问题中用到的参数指标]
其中mse 和r2的计算公式分别为:
插图:
写在后面的话,至此关于model中相应参数的一些意义,以及到底如果得到决策函数的表达式或者计算方式的就算是说的很明了了。
可能还有的同学会问,如何得到分类决策函数中的那个alpha系数【这个肯定会有人问】,还是再磨叽说一下吧:
上面的wi其实是alpha和支持向量的类别标签(1或-1的乘积),原始决策函数的表达式如下:
插图:
上面的yi是支持向量的类别标签(1或者-1),在libsvm中将yi和alpha的乘积放在一起用model.sv_coef(w)来承装。
都说到这份上,应该能明白了吗?

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

转自:http://blog.sina.com.cn/s/blog_6646924501018fqc.html

libsvm 训练后的模型参数讲解(转)的更多相关文章

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

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

  2. tflearn kears GAN官方demo代码——本质上GAN是先训练判别模型让你能够识别噪声,然后生成模型基于噪声生成数据,目标是让判别模型出错。GAN的过程就是训练这个生成模型参数!!!

    GAN:通过 将 样本 特征 化 以后, 告诉 模型 哪些 样本 是 黑 哪些 是 白, 模型 通过 训练 后, 理解 了 黑白 样本 的 区别, 再输入 测试 样本 时, 模型 就可以 根据 以往 ...

  3. 转载:tensorflow保存训练后的模型

    训练完一个模型后,为了以后重复使用,通常我们需要对模型的结果进行保存.如果用Tensorflow去实现神经网络,所要保存的就是神经网络中的各项权重值.建议可以使用Saver类保存和加载模型的结果. 1 ...

  4. gluoncv 用已经训练好的模型参数,检测物体

    当然这个模型参数,最好用自己的,否则不够精确,我自己的还没训练完. from matplotlib import pyplot as plt import gluoncv from gluoncv i ...

  5. pytorch将cpu训练好的模型参数load到gpu上,或者gpu->cpu上

    假设我们只保存了模型的参数(model.state_dict())到文件名为modelparameters.pth, model = Net() 1. cpu -> cpu或者gpu -> ...

  6. TensorFlow 模型优化工具包  —  训练后整型量化

    模型优化工具包是一套先进的技术工具包,可协助新手和高级开发者优化待部署和执行的机器学习模型.自推出该工具包以来,  我们一直努力降低机器学习模型量化的复杂性 (https://www.tensorfl ...

  7. 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型

    人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...

  8. 深度学习原理与框架-卷积神经网络-cifar10分类(图片分类代码) 1.数据读入 2.模型构建 3.模型参数训练

    卷积神经网络:下面要说的这个网络,由下面三层所组成 卷积网络:卷积层 + 激活层relu+ 池化层max_pool组成 神经网络:线性变化 + 激活层relu 神经网络: 线性变化(获得得分值) 代码 ...

  9. 【机器学习】随机森林 Random Forest 得到模型后,评估参数重要性

    在得出random forest 模型后,评估参数重要性 importance() 示例如下 特征重要性评价标准 %IncMSE 是 increase in MSE.就是对每一个变量 比如 X1 随机 ...

随机推荐

  1. java动态绑定的一点注意

    动态绑定只是针对对象的方法,对于属性无效.因为属性不能被重写. show me code: public class Father{ public String name = "父亲属性&q ...

  2. CORS 协议(跨域资源共享)

      跨域问题 只要协议.域名.端口有任何一个不同,都被当作是不同的域.   为什么会有跨域的限制? 之前发生过的一些跨域安全事件: 新浪微博XSS受攻击事件 2011年6月28日晚,新浪微博出现了一次 ...

  3. 【原创】Java批量反编译利器(jd-gui)介绍

    Java反编译利器(jd-gui)介绍 当要做白盒测试或安全测试时,我们需要借助工具扫描被测代码,相信大家都遇到过没有源代码,而需要反编译的情形吧,也可能大家用过jad工具,我这里介绍下方便的工具jd ...

  4. 【HEVC】4、HM-16.7编码一个CU(帧内部分) 3.帧内预测各种模式实现

    HEVC中一共定义了35中帧内编码预测模式,编号分别以0-34定义.其中模式0定义为平面模式(INTRA_PLANAR),模式1定义为均值模式(INTRA_DC),模式2~34定义为角度预测模式(IN ...

  5. oracle 分析函数

    认识分析函数 分析函数是什么? 分析函数是oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值. 分析函数 ...

  6. 解决在CentOS6.5下安装OpenStack(Icehouse版本 )出现的glance服务无法正常工作的问题

    最近一直在用Juno版本,因为项目需要,今天在虚拟机里安装了Icehouse版,其中glance组件在执行安装的过程后,出现启动失败的现象,幸好以前排查过此类错误,遂记录如下: 在官方文档(Iceho ...

  7. openStack windows时间偏移

    openstack

  8. docker help

    localhost == 127.0.0.1 == 本机ip ifconfig 或者 ip addr 查看本地宿主机的ip地址 $ docker help Usage: docker [OPTIONS ...

  9. 解决linux yum无法安装mysql

    yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1. 下载mysql的repo源 wget http://repo.mysql.com/mysql-com ...

  10. 使用HttpURLConnection下载图片

    import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.Ht ...