https://www.cnblogs.com/york-hust/p/3663408.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)
其中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的问题还是可以一起探讨的,但您首先要独立思考一下下才好,您说是不是~
本文主要介绍了SVM工具箱中svmtrain和svmpredict两个主要函数:
(1)model= svmtrain(train_label, train_matrix, ['libsvm_options']);
其中:
train_label表示训练集的标签。
train_matrix表示训练集的属性矩阵。
libsvm_options是需要设置的一系列参数,各个参数可参见《libsvm 参数说明.txt》,里面介绍的很详细,中英文都有的。如果用回归的话,其中的-s参数值应为3。
model:是训练得到的模型,是一个结构体(如果参数中用到-v,得到的就不是结构体,对于分类问题,得到的是交叉检验下的平均分类准确率;对于回归问题,得到的是均方误差)。
(2)[predicted_label, accuracy/mse, decision_values]=svmpredict(test_label, test_matrix, model, ['libsvm_options']);
其中:
test _label表示测试集的标签(这个值可以不知道,因为作预测的时候,本来就是想知道这个值的,这个时候,随便制定一个值就可以了,只是这个时候得到的mse就没有意义了)。
test _matrix表示测试集的属性矩阵。
model是上面训练得到的模型。
libsvm_options是需要设置的一系列参数。
predicted_label表示预测得到的标签。
accuracy/mse是一个3*1的列向量,其中第1个数字用于分类问题,表示分类准确率;后两个数字用于回归问题,第2个数字表示mse;第三个数字表示平方相关系数(也就是说,如果分类的话,看第一个数字就可以了;回归的话,看后两个数字)。
decision_values表示决策值(一般好像不怎么用)。