在MATLAB中使用libSVM的方法
libsvm库下载:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
详解:http://www.matlabsky.com/thread-11925-1-1.html
安装libsvm方法,参考博客:http://blog.csdn.net/abcjennifer/article/details/7370177
先举一个栗子:
代码:
<span style="font-size:12px;"> clc,clear
%4个训练样本4*4,每个样本4条属性(特征)
train_data=[5.1 3.5 1.4 0.2;4.9 3.0 1.4 0.2;4.7 3.2 1.3 0.2;4.6 3.11.5 0.2];
%4个测试样本4*4,每个样本4条属性(特征)
test_data=[5.0 3.6 1.4 0.2;5.4 3.9 1.7 0.4;4.6 3.4 1.4 0.3;5.0 3.41.5 0.2];
train_labels=[1,1,2,2]';%训练样本标签4*1
test_labels=[1,1,1,1]';%测试样本标签4*1
model = svmtrain(train_labels, train_data);
[predict_label, accuracy,dec_values] =svmpredict(test_labels,test_data, model);
</span>
结果:
optimization finished, #iter = 2
nu = 1.000000
obj = -3.872840, rho = -0.009619
nSV = 4, nBSV = 4
Total nSV = 4
Accuracy = 75% (3/4) (classification)
1.分类问题处理整体正规流程
step1. 选定训练集和测试集 >>规范化 >> 特征提取
step2. 利用训练集训练分类器得到model
step3. 利用model对测试集进行预测
step4. 分类器性能评测[分类准确率的高低
2.svmtrain(… ) 通过训练集来训练模型
函数:model= svmtrain(train_label, train_matrix, ['libsvm_options']);
-train_label:
An m by 1 vector oftraining labels (type must be double). 标签数据应是m行1列的数据
-train_matrix:
An m by n matrix of mtraining instances with n features.
It can be dense or sparse(type must be double). 训练数据应是m行n列,m表示样本数,n表示1个样本有n中属性
-libsvm_options:
A stringof training options in the same format as that of LIBSVM. 是一个字符串如:'-c 2 -g 0.02 -t 2'
Options:可用的选项即表示的涵义如下:
-ssvm类型:SVM设置类型(默认0)
0 -- C-SVC(C-support vector classification)
1 -- nu-SVC(nu-support vectorclassification)
2 -- one-class SVM (distributionestimation) 一类SVM
3 -- epsilon-SVR(epsilon-support vectorregression)
4 -- nu-SVR (nu-support vectorregression)
-t核函数类型:核函数设置类型(默认2)
0 – 线性:u'v
1 – 多项式:(r*u'v+ coef0)^degree
2 – RBF函数:exp(-r|u-v|^2)
3 –sigmoid:tanh(r*u'v+ coef0)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-c cost:设置C-SVC,e-SVR和v-SVR的参数(损失函数)(默认1)
-n nu:设置v-SVC,一类SVM和v-SVR的参数(默认0.5)
-p p:设置e -SVR 中损失函数p的值(默认0.1)
-m cachesize:设置cache内存大小,以MB为单位(默认40)
-e eps:设置允许的终止判据(默认0.001)
-h shrinking:是否使用启发式,0或1(默认1)
-wi weight:设置第几类的参数C为weight?C(C-SVC中的C)(默认1)
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
其中-g选项中的k是指输入数据中的属性数。option-v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
model:SVM根据样本训练的得到的分类器
model是struct结构[Parameters, nr_class,totalSV, rho, Label, ProbA, ProbB, nSV, sv_coef, SVs]
model.Parameters参数(均是用户自定义或者默认的)意义从上到下依次为:
-s svm类型:SVM设置类型(默认0)
-t 核函数类型:核函数设置类型(默认2)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认类别数目的倒数)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
model.nr_class表示数据集中有多少类别;=2 for regression/one-class svm
model.Label表示数据集中类别的标签都是什么
model.totalSV代表总共的支持向量的数目
model.nSV表示每类样本的支持向量的数目
model.ProbA和model.ProbB使用-b参数时才能用到,用于概率估计。
-b probability_estimates: whether to train a SVC or SVR model for probabilityestimates,0 or 1 (default 0)
model.sv_coef是一个totalSV*1的矩阵,承装的是totalSV个支持向量在决策函数中的系数
model.SVs是一个totalSV×维度的稀疏矩阵,承装的是totalSV个支持向量
model.rho是决策函数中的常数项的相反数
3.svmpredict(….) 对测试集进行预测
函数:[predicted_label,accuracy, decision_values/prob_estimates] = svmpredict(test_label, test_matrix,model, ['libsvm_options']);
返回参数:
predict_label是预测标签向量
accuracy从上到下依次的意义分别是:
-分类准率(分类问题中用到的参数指标)
-平均平方误差(MSE(mean squared error))[回归问题中用到的参数指标]
-平方相关系数(r2(squared correlation coefficient))[回归问题中用到的参数指标]
dec_values是一个包含decision值或概率估计(-b1)的矩阵,如果k个类,对于decision值,每行包含k(k-1)/2个二分类问题的结果;对于概率,每列包含k个属于每类的概率值
4.注意事项
1.测试数据的格式要求必须是每一列代表一个属性,每一列代表一个样本.
2.数据类型需要是double型.
3.如果自己编写的程序使用到libsvm,就应该将libsvm中的MATLAB代码复制到自编程序位置,否则MATLAB会调用自带的SVM程序,报错“Ymust be a vector or a character array.”
4.跟编译器有关吧,在使用SVM做预测的时候,返回的参数必须填全,否则出来的预测结果是空的,即是:
[predicted_label, accuracy, decision_values] =svmpredict(test_label, test_matrix, model);