原文地址:http://www.matlabsky.com/thread-12649-1-1.html

建议大家看这篇帖子之前先看一下以下几篇帖子:
如何使用libsvm进行分类【by faruto】
http://www.matlabsky.com/forum-v … -fromuid-18677.html
libsvm 参数说明【中英文双语版本】
http://www.matlabsky.com/forum-v … -fromuid-18677.html
线性可分模式的最优超平面的详细推导过程【支持向量机相关】
http://www.matlabsky.com/forum-v … -fromuid-18677.html
更多关于SVM相关的东西可以看:
关于SVM的那点破事[长期更新整理 by faruto]
http://www.matlabsky.com/forum-v … -fromuid-18677.html

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

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

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

%% ModelDecryption
% by faruto @ faruto’s Studio~
% http://blog.sina.com.cn/faruto
% Email:faruto@163.com
% http://www.MATLABsky.com
% http://www.mfun.la
% http://video.ourmatlab.com
% last modified by 2011.01.06
%% 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;
复制代码
运行结果:

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]
Accuracy = 99.6296% (269/270) (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里面承装的都是什么:

model.Parameters
ans =
0
2.0000
3.0000
2.8000
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

model.Label
ans =
1
-1
model.nr_class
ans =
2
复制代码
重要知识点:

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

model.totalSV model.nSV

model.totalSV
ans =
259
model.nSV
ans =
118
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

   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, 下载次数: 21547)

最终的决策函数为:

在由于我们使用的是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提供的信息自己建立上面的决策函数如下:

%% DecisionFunction
function plabel = DecisionFunction(x,model)

gamma = model.Parameters(4);
RBF = @(u,v)( exp(-gamma.*sum( (u-v).^2) ) );

len = length(model.sv_coef);
y = 0;

for i = 1:len
u = model.SVs(i,:);
y = y + model.sv_coef(i)*RBF(u,x);
end
b = -model.rho;
y = y + b;

if y >= 0
plabel = 1;
else
plabel = -1;
end
复制代码
有了这个决策函数,我们就可以自己预测相应样本的标签了:

%%
plable = zeros(270,1);
for i = 1:270
x = data(i,:);
plabel(i,1) = DecisionFunction(x,model);
end

%% 验证自己通过决策函数预测的标签和svmpredict给出的标签相同
flag = sum(plabel == PredictLabel)
over = 1;
复制代码
最终可以看到 flag = 270 ,即自己建立的决策函数是正确的,可以得到和svmpredict得到的一样的样本的预测标签,事实上svmpredict底层大体也就是这样实现的。

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

在下面这段代码中 :

%%
% 首先载入数据
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
复制代码
运行可以看到

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]
Accuracy = 99.6296% (269/270) (classification)
accuracy =
99.6296
0.0148
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•

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

PS:预祝大家春节愉快

by faruto 2011.01.06

【教程】利用libsvm-mat建立分类模型model参数解密【by faruto】相关推荐

  1. ML之RF:kaggle比赛之利用泰坦尼克号数据集建立RF模型对每个人进行获救是否预测

    ML之RF:kaggle比赛之利用泰坦尼克号数据集建立RF模型对每个人进行获救是否预测 目录 输出结果 实现代码 输出结果 后期更新-- 实现代码 #预测模型选择的RF import numpy as ...

  2. EL之Bagging:kaggle比赛之利用泰坦尼克号数据集建立Bagging模型对每个人进行获救是否预测

    EL之Bagging:kaggle比赛之利用泰坦尼克号数据集建立Bagging模型对每个人进行获救是否预测 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 bagging_clf = ...

  3. gazebo入门教程(二)建立简单模型

    创建模型 本节目标 一.模型编辑器用户界面 调色板(左面板) 工具列 局限性 二.车辆构造 1.创建车辆 (1).底盘 (2)前轮 (3)脚轮 2.添加传感器 3.添加插件 保存模型 本节目标 现在, ...

  4. 如何建立分类模型matlab,创建简单模型 - MATLAB Simulink - MathWorks 中国

    创建简单模型 您可以使用 Simulink® 来对系统建模,然后仿真该系统的动态行为.本教程中创建简单模型所使用的基本方法也适用于创建更复杂的模型.此示例对简化的汽车运动进行仿真.当踩下油门踏板时,汽 ...

  5. 用matlab建立晶体模型,利用materials studio建立晶体模型的步骤 | 附下载

    1.启动materials studio时会提示:create a new project or open an existing project 在这里选择create a new project, ...

  6. 两台虚拟服务器如何级联,[教程] 利用open vswitch建立vxlan隧道实现不同主机上的虚拟交换机级联...

    写在开头 在某些环境下,需要实现两台物理机中的openvswitch交换机级联,以实现两台交换机中的设备互相通讯,这里使用vxlan隧道技术,将数据包封装在UDP中,通过以太网实现数据包传输. VXL ...

  7. ML之LoR:kaggle比赛之利用泰坦尼克号数据集建立LoR模型对每个人进行获救是否预测

    比赛要求:根据训练集数据和测试集数据生成自己的预测模型,按照预测模型来预测出892到1309条数据是否获救,按照比赛规定的格式生成csv文件,并上传到kaggle上,然后会反馈预测的准确率. 导读: ...

  8. 图像分类matlab结果,libsvm图像二分类后,分类的图像结果如何显示?

    这是训练后的分类器. ------- %% 训练阶段 ReadList1  = textread('P.txt','%s','delimiter','\n');%载入云样本列表 sz1=size(Re ...

  9. libsvm 训练后,模型参数详解

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

最新文章

  1. Caused by: org.gradle.api.InvalidUserDataException: NDK not configured
  2. 异步获取邮件推送结果
  3. 【瞎扯】我的OI之路
  4. LVS+Keepalive 实现负载均衡高可用集群
  5. UML小结以及基于领域模型的系统设计初步
  6. IntelliJ IDEA for Mac 如何自定义快捷键_设置快捷键
  7. java context.xml_java-context.xml的解释
  8. 群晖218 当文件服务器,群晖218 家庭云服务器
  9. apache禁止访问文件或目录执行权限、禁止运行脚本PHP文件的设置方法
  10. QT 的信号与槽机制介绍(转载)
  11. codeblocks同一工程下建立多个源文件
  12. Jvisualvm简单使用教程
  13. android studio 导入第三方的jar包,add as library的位置
  14. python中求绝对值的函数_python如何取绝对值 python取绝对值方法
  15. Java8所有的包介绍(由英文文档翻译而来)
  16. MySQL数据库学习日志(一):数据库概述及SQL语言基础
  17. 豪迪QQ群发通杀破解补丁使用教程
  18. i标签和em标签的区别
  19. 2019长江课堂作业答案_2019长江作业本同步练习册九年级数学参考答案,人教版!...
  20. wps 的直接登录URL

热门文章

  1. oracle替换表merge,sql – Oracle – 如何使用merge根据其他表和列中的值更新列
  2. web浏览器_你最常用的web测试-浏览器兼容性测试
  3. 关于Spring Boot WebSocket整合以及nginx配置详解
  4. php插入日志到数据库,对象转json
  5. WebForm(文件上传)
  6. SQLite3动态创建表
  7. EasyUI中combotree允许多选的时候onSelect事件会重复触发onCheck事件
  8. arm-linux内核编译过程小结
  9. 手持机设备公司(WINCE/ANDROID/LINUX)
  10. WINCE6.0添加对viewrs(PDF,Word,Execel和PowerPoint)支持