最近在看limsvm决定把自己的一些收获写下来,其中包含了本人查找的一些资料以及个人的一些见解。我想谈一谈libsvm中model函数的参数的具体表示。我使用的svm工具箱是台湾大学林智仁教授编写的lisvm下载地址点击打开链接,这是目前最流行也是最好用的svm工具箱。Matlab安装使用svm的详细步骤可以参考以下两个连接详解点击打开链接视频点击打开链接,这里不再赘述。本人用的是libsvm-3.17版本。
下面结合matlab代码给出详解:
clc;
clear;
close all;
%导入数据其中wine_SVM是一个178*13行矩阵行表示共有178个特征值每个特征值有13个属性
load wine_SVM;
%为简化程序运行代价我们这里只取wine_SVM中的第一,二列。即取13个属性中的第一二个属性此时data是一个178*2行的矩阵也就是有178个特征值每个特征值有2个属性
data = [wine(:,1),wine(:,2)];
groups = ismember(wine_labels,1);
[train, test] = crossvalind('holdOut',groups);
%选出训练集
train_wine_labels = groups(train,:);
train_wine_labels = double( train_wine_labels );
%选出测试集
test_wine = data(test,:);
test_wine_labels = groups(test,:);
test_wine_labels = double( test_wine_labels );
%svmtrain是libsvm中最主要的函数之一,主要功能是得出训练超平面
model = svmtrain(train_wine_labels,train_wine,'-c 1 -g 0.07');
model
%svmpredict是libsvm中最主要的函数,功能是预测测试集的分类效果
[predict_label, accuracy, decision_values] = svmpredict(test_wine_labels,test_wine,model);
accuracy
%以下是绘图函数代码,直观显示分类效果
figure;hold on;
[m,n] = size(train_wine);
for run = 1:m
if train_wine_labels(run) == 1
h1 = plot( train_wine(run,1),train_wine(run,2),'r+' );
else
h2 = plot( train_wine(run,1),train_wine(run,2),'g*' );
end
for i = 1:mm
if model.SVs(i,1)==train_wine(run,1) && model.SVs(i,2)==train_wine(run,2)
h3 = plot( train_wine(run,1),train_wine(run,2),'o' );
end
end
end
legend([h1,h2,h3],'1','0','Support Vectors');
hold off;
运行结果:
optimization finished, #iter = 37
nu = 0.555556
obj = -42.305155, rho = 0.769301
nSV = 51, nBSV = 48
Total nSV = 51
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 51
rho: 0.7693
Label: [2x1 double]
sv_indices: [51x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [51x1 double]
SVs: [51x2 double]
Accuracy = 88.6364% (78/88) (classification)
accuracy =
88.6364
0.1136
0.5518
现简单对屏幕回显信息进行说明:
#iter为迭代次数,
nu 设置nu - SVC、one-class-SVM 与nu - SVR 中参数nu ,默认值0.5,
obj为SVM文件转换为的二次规划求解得到的最小值,
rho 为判决函数的常数项b,
nSV 为支持向量个数,
nBSV为边界上的支持向量个数,
Total nSV为支持向量总个数。
这里面要说一下返回参数accuracy的三个参数的意义。返回参数accuracy从上到下依次的意义分别是:
分类准率(分类问题中用到的参数指标)
平均平方误差(MSE (mean squared error)) [回归问题中用到的参数指标]
平方相关系数(r2 (squared correlation coefficient))[回归问题中用到的参数指标]
Svmtrain函数的用法:svmtrain (training_label,train_data,[options])
其中options涵义如下:
-s svm类型:设置SVM 类型,默认值为0,可选类型有:
0 -- C- SVC
1 -- nu - SVC
2 -- one-class-SVM
3 -- e - SVR
4 -- nu-SVR
-t 核函数类型:设置核函数类型,默认值为2,可选类型有:
0 -- 线性核:u'*v
1 -- 多项式核:(g*u'*v+ coef0)degree
2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)
3 -- sigmoid 核:tanh(g*u'*v+ coef 0)
-d degree:核函数中的degree设置,默认值为3;
-g r(gama):核函数中的函数设置(默认1/ k);
-r coef 0:设置核函数中的coef0,默认值为0;
-c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认值为1;
-n nu :设置nu - SVC、one-class-SVM 与nu - SVR 中参数nu ,默认值0.5;
-p e :核宽,设置e - SVR的损失函数中的e ,默认值为0.1;
-m cachesize:设置cache内存大小,以MB为单位(默认40):
-e e :设置终止准则中的可容忍偏差,默认值为0.001;
-h shrinking:是否使用启发式,可选值为0 或1,默认值为1;
-b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;
-wi weight:对各类样本的惩罚系数C加权,默认值为1;
-v n:n折交叉验证模式。
其中-g选项中的k是指输入数据中的属性数。操作参数 -v 随机地将数据剖分为n 部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM 的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。
svmpredict函数的用法:
[predicted_label, accuracy,decision_values]=svmpredict(teat_label,teat_data,model)
关于svmpredict有以下几点说明在老版的libsvm中[predicted_label, accuracy]=svmpredict(test_label,teat_data,model)不会有错,但是在libsvm3.17版本中会报错,这是因为libsvm对新版本的重新设定,改为如下命令即可:
[predicted_label, accuracy,decision_values]=svmpredict(teat_label,teat_data,model)
或[predicted_label]=svmpredict(teat_label,teat_data,model)。
下面对model中的参数逐一说明:
>> model.Parameters
ans =
0
2.0000
3.0000
0.0700
0
-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 参数为0.07(这也是我们自己的输入);-r 参数为0。
关于libsvm参数的一点小说明:Libsvm中参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
model.Label model.nr_class
ans =
1
0
>> model.nr_class
ans =
2
model.nr_class表示数据集中有多少类别,这里是二分类。
model.totalSV model.nSV
>> model.totalSV
ans =
51
>> model.nSV
ans =
25
26
model.nSV表示每类样本的支持向量的数目,这里表示标签为1的样本的支持向量有25个,标签为0的样本的支持向量为26
注意:这里model.nSV所代表的顺序是和model.Label相对应的。
model.ProbA model.ProbB
关于这两个参数这里不做介绍,使用-b参数时才能用到,用于概率估计。
model.sv_coef model.SVs model.rho
sv_coef: [51x1 double]
SVs: [51x2 double]
model.rho = 0.7693
model.sv_coef是一个51*1的矩阵,承装的是51个支持向量在决策函数中的系数;
model.SVs是一个51*2的稀疏矩阵,承装的是51个支持向量。
model.rho是决策函数中的常数项的相反数(-b)
在这里首先我们看一下 通过 –s 0 参数(C-SVC模型)得到的最终的分类决策函数的表达式是怎样的?
最终的决策函数为:
核函数采用默认的RBF故这里的决策函数即为:
其中|| x-y ||是二范数距离 ;
这里面的
b就是-model.rho(一个标量数字);
b = -model.rho;
n代表支持向量的个数即 n = model.totalSV(一个标量数字);
对于每一个i:
wi =model.sv_coef(i); 支持向量的系数(一个标量数字)
xi = model.SVs(i,:) 支持向量(1*2的行向量)
x 是待预测标签的样本 (1*2的行向量)
gamma 就是 -g 参数
这是本人第一次写博客如果有什么错误还请各位指正!本程序所用的数据及源码已经上传下载地址(免积分):http://download.csdn.net/detail/xr1064/7437787点击打开链接。
对于机器学习的人在这里推荐一个网站里面有许多数据可供下载测试:http://archive.ics.uci.edu/ml/index.html点击打开链接,这里给出LIBSVM的使用答疑,绝大多数问题都可以在这里找到答案:http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#faq101点击打开链接
此外本文也参考了其它网站的一些资料在这里表示感谢并给出链接http://www.matlabsky.com/thread-12649-1-1.html点击打开链接。