libsvm 训练后,模型参数详解
测试数据使用的是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.totalSVmodel.nSV
- >> model.totalSV
- ans =
- 259
- >> model.nSV
- ans =
- 118
- 141
重要知识点:
model.totalSV代表总共的支持向量的数目,这里共有259个支持向量;
model.nSV表示每类样本的支持向量的数目,这里表示标签为1的样本的支持向量有118个,标签为-1的样本的支持向量为141。
注意:这里model.nSV所代表的顺序是和model.Label相对应的。
model.ProbAmodel.ProbB
关于这两个参数这里不做介绍,使用-b参数时才能用到,用于概率估计。
-bprobability_estimates: whether to train a SVC or SVR model for probabilityestimates, 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
附件:
最终的决策函数为:
在由于我们使用的是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)来承装。
都说到这份上,应该能明白了吗?
libsvm 训练后,模型参数详解相关推荐
- Pytorch LSTM模型 参数详解
本文主要依据 Pytorch 中LSTM官方文档,对其中的模型参数.输入.输出进行详细解释. 目录 基本原理 模型参数 Parameters 输入Inputs: input, (h_0, c_0) 输 ...
- LIBSVM多分类问题 参数详解及实例演示
前言 安装包及具体安装步骤,搜博主之前的MATLAB专栏文章 1. 入门案例 1.1 分类的小例子--根据身高体重进行性别预测 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- 数据挖掘介绍以及模型参数详解
http://www.cnblogs.com/pinard/ cc 转载于:https://www.cnblogs.com/wangleBlogs/p/6803978.html
- xgboost模型参数详解
- 机器人系统的基本概念及外部模型参数详解
目录 线控底盘介绍 遥控器说明 线控底盘使用操作 充电 上层传感器介绍 配置单 Xavier 介绍 RobSense简介(激光雷达) IMU简介 RealSense D435介绍 电气通讯拓扑连接说明 ...
- Sklearn参数详解—LR模型
总第105篇 最近会开始一个新的系列,sklearn库中各模型的参数解释,本篇主要讲述最基础的LR模型. 模型参数详解 逻辑回归: sklearn.linear_model.LogisticRegre ...
- PyTorch实现AlexNet模型及参数详解
文章目录 一.卷积池化层原理 二.全连接层原理 三.模型参数详解 注:AlexNet论文错误点 1.卷积池化层1 (1)卷积运算 (2)分组 (3)激活函数层 (4)池化层 (5)归一化处理 (6)参 ...
- 基于Amos路径分析的模型拟合参数详解
基于Amos路径分析的模型拟合参数详解 1 卡方.自由度.卡方自由度比 2 GFI.AGFI 3 RMR.RMSEA 4 CFI 5 NFI.TLI(NNFI) 6 ECVI 7 AIC.BIC.CA ...
- FastText 总结:文本分类、词向量训练、参数详解
FastText:文本分类.词向量训练.参数详解 前言 - FastText 简介 一.FastText - 安装 1.1 - Github下载安装 1.2 - 编译器安装 二.FastText - ...
最新文章
- 10件5G能实现但4G不能做的事情
- putty连接虚拟fedaro失败的解决方法
- I2C原理及应用实例
- 请在贵网站的根目录下部署一个文件_使用 github pages, 快速部署你的静态网页
- php统计在线时长,js统计网站运行时长
- 广电+央视能否有力量横扫运营商+互联网?
- OpenCV图像处理(13)——指定区域截取和指定区域复制
- ffmpeg+rtmp推流/拉流(十)
- 一个文科小白的数据分析师之路
- 【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价
- mysql 触发器 insert new_mysql触发器实例 插入前更新数据
- python爬虫简单示例
- 10万+标注数据开放!驾驶员不良驾驶识别/电动车进电梯检测/渣土车车牌识别/反光衣识别等8大赛题详解来了!...
- 18张图,揭开阿里巴巴开发手册强制使用SLF4J作为门面担当的秘密
- 路由器、交换机的基本配置
- js统计英文单词数量
- android webview 播放视频总结,Android WebView 播放视频总结~
- new bing聊天机器人免翻命令行使用--大佬逆向工程api
- C++编程的精品文章整理
- 跨城实践中,腾讯如何应用 Apache Pulsar
热门文章
- BZOJ-2440-完全平方数-中山市选2011-容斥原理-莫比乌斯函数-二分查找
- python自动化开发教程_Python自动化开发实战视频课程-全新基础篇_Python教程
- 死磕java并发cas_死磕 java并发包之AtomicInteger源码分析
- html在线转移,HTML5迁移
- 第四十二篇 面对对象进阶
- 理解一条语句:SELECT difference(sum(value)) FROM mq_enqueue WHERE channel =~ /ActiveMQ_TEST/ AND $tim...
- Android系统中自定义按键的短按、双击、长按事件
- oracle 12 问题:需要 Oracle 客户端软件 8.1.7 或更高版本
- Excel中删除链接
- vsFTPD编译安装使用实用手册