『ML笔记』Matlab中如何使用libsvm进行分类

一. 入门案例

1.1. 分类的小例子–根据身高体重进行性别预测

本博客针对刚刚接触libsvm(svm)的同学如何利用libsvm进行分类预测,关于参数寻优的问题在这里姑且不谈,另有帖子详述。如果没有安装libsvm;参考博客 libsvm安装使用小结
其实使用libsvm进行分类很简单,只需要有属性矩阵和标签,然后就可以建立分类模型(model),然后利用得到的这个model进行分类预测了。
那什么是属性矩阵?什么又是标签呢?我举一个直白的不能在直白的例子:

例如:说一个班级里面有两个男生(男生1、男生2),两个女生(女生1、女生2),其中

男生1 身高:176cm 体重:70kg;
男生2 身高:180cm 体重:80kg;
女生1 身高:161cm 体重:45kg;
女生2 身高:163cm 体重:47kg;

如果我们将男生定义为1,女生定义为-1,并将上面的数据放入矩阵train_data中,即:

train_data = [176 70;
        180 80;
        161 45;
        163 47];

在label中存入男女生类别标签(1、-1),即:

train_label = [1;1;-1;-1];

这样上面的train_data矩阵就是一个属性矩阵,行数4代表有4个样本,列数2表示属性有两个,label就是标签(1、-1表示有两个类别:男生、女生)。
现在回归正题,有了上面的属性矩阵train_data,和标签train_label就可以利用libsvm建立分类模型了,简要代码如下:

model = svmtrain(train_label,train_data);

有了model我们就可以做分类预测,比如此时该班级又转来一个新学生,其身高190cm,体重85kg
我们想通过上面这些信息就给出其标签(想知道其是男【1】还是女【-1】)。比如 令 testdata = [190 85]; 由于其标签我们不知道,我们假设其标签为-1(也可以假设为1)。话归正传,即:

test_data = [190 85];
test_label = -1;

然后利用libsvm来预测这个新来的学生是男生还是女生,代码如下:

[predictlabel,accuracy] = svmpredict(testdatalabel,testdata,model)

下面我们整体运行一下上面这段代码,也有结果的:

% 使用Libsvm进行分类的小例子
% 训练数据和标签
train_data = [176 70;
        180 80;
        161 45;
        163 47];
train_label = [1;1;-1;-1];

% 建立模型
model = svmtrain(train_label,train_data);

% 测试数据和标签
test_data = [190 85];
test_label = -1;

% 预测
[predict_label,accuracy,dec_value] = svmpredict(test_label,test_data,model);
predict_label
if 1 == predict_label
    disp('该生为男生');
end
if -1 == predict_label
    disp('该生为女生');
end

运行结果显示:

1.2. 回归的小例子 y = x 2 y=x^2 y=x2

利用训练集合已知的x,y来建立回归模型 model ,然后利用这个 model 去预测。
本例中的x相当于1.1中的属性矩阵train_data ,y 相当于其中的 train_label ;相应的回归问题中 x 就是自变量,y 就是因变量。

%% 使用Libsvm进行回归的小例子
% 生成待回归的数据
x = (-1:0.1:1)';
y = -x.^2;               %矩阵中的每个元素都求平方

 % 建模回归模型
model = svmtrain(y,x,'-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01');
 
% 利用建立的模型看其在训练集合上的回归效果
[py,mse,dec_value] = svmpredict(y,x,model);
 
scrsz = get(0,'ScreenSize');
figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6  scrsz(3)*4/5 scrsz(4)]*3/4);
plot(x,y,'o');
hold on;
plot(x,py,'r*');
legend('原始数据','回归数据');
grid on;
 
% 进行预测
testx = 1.1;
display('真实数据')
testy = -testx.^2
 
[ptesty,tmse,tdec_value] = svmpredict(testy,testx,model);
display('预测数据');
ptesty

二. 参数详解

2.1. 主要函数

  • LIBSVM工具箱的主要函数为 svmtrain 和 svmpredict ,其调用格式为:
model = svmtrain(train_label,train_data,options);
[predict_label,accuracy/mse,dec_value] = svmpredict(test_label,test_data,model);

2.2. options 参数

options的参数设置可以按照 SVM 的类型和核函数所支持的参数进行任意组合。如果设置的参数在函数或 SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。主要有:

- s svm类型:SVM模型设置类型(默认值为0)
    0:C - SVC
    1:nu - SVC
    2:one - class SVM
    3: epsilon - SVR
    4: nu - SVR
- t 核函数类型:核函数设置类型(默认值为2)
    0:线性核函数 u'v
    1:多项式核函数(r *u'v + coef0)^degree
    2:RBF 核函数 exp( -r|u - v|^2)
    3:sigmiod核函数 tanh(r * u'v + coef0)
- d degree:核函数中的 degree 参数设置(针对多项式核函数,默认值为3)
- g r(gama):核函数中的gama参数设置(针对多项式/sigmoid 核函数/RBF/,默认值为属性数目的倒数)
- r coef0:核函数中的coef0参数设置(针对多项式/sigmoid核函数,默认值为0)
- c cost:设置 C - SVC,epsilon - SVR 和 nu - SVR的参数(默认值为1)
- n nu:设置 nu-SVC ,one - class SVM 和 nu - SVR的参数
- p epsilon:设置 epsilon - SVR 中损失函数的值(默认值为0.1)
- m cachesize:设置 cache 内存大小,以 MB 为单位(默认值为100)
- e eps:设置允许的终止阈值(默认值为0.001)
- h shrinking:是否使用启发式,0或1(默认值为1)
- wi weight:设置第几类的参数 C 为 weight * C(对于 C - SVC 中的 C,默认值为1)
- v n:n - fold 交互检验模式,n为折数,必须大于等于2

2.3. 分类模型 model 解析

测试数据使用 LIBSVM 工具箱自带的 heart_scale.mat 数据(共计270个样本,每个样本有13个属性)。测试代码如下:

clear;
clc;
close all;
 
% 首先载入数据
[label,data]=libsvmread('heart_scale');
% 建立分类模型
model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8');
% 利用建立的模型看其在训练集合上的分类效果
[PredictLabel, accuracy, dec_values] = svmpredict(label,data, model);

% 分类模型model解密
% <br>model<br>Parameters = model.Parameters
% Label = model.Label
% nr_class = model.nr_class
% totalSV = model.totalSV
% nSV = model.nSV
  • svmtrain 的输出 model:
optimization finished, #iter = 505	%iter为迭代次数
nu = 0.679187						%nu 是你选择的核函数类型的参数
obj = -113.509601, rho = 0.051363   %obj为SVM文件转换为的二次规划求解得到的最小值
nSV = 259, nBSV = 18				%nSV 为标准支持向量个数(0<a[i]<c);nBSV为边界上的支持向量个数(a[i]=c);
Total nSV = 259						%nBSV为边界上的支持向量个数(a[i]=c);对于两类来说,因为只有一个分类模型Total nSV = nSV,
                                    %但是对于多类,这个是各个分类模型的nSV之和
model = 
  包含以下字段的 struct:			

    Parameters: [5×1 double]		%结构体变量,依次保存的是 -s -t -d -g -r等参数
      nr_class: 2				    %分类的个数   
       totalSV: 259				    %总的支持向量个数
           rho: 0.0514				%b=-model.rho
         Label: [2×1 double]
    sv_indices: [259×1 double]
         ProbA: []
         ProbB: []
           nSV: [2×1 double]	    %每一类的支持向量的个数
       sv_coef: [259×1 double]	    %支持向量的系数
           SVs: [259×13 double]	    %具体的支持向量,以稀疏矩阵的形式存储
% 其中:
%    w*x+b=0%      w=model.SVs'*model.sv_coef
%      b=-model.rho
% w是高维空间中分类 超平面的法向量,b是常数项。
  • model.Paramenters %参数表
Parameters =
         0
    2.0000
    3.0000
    2.8000
         0
```c
-  model.Paraments 参数意义从上到下依次为

```c
-s svm类型:SVM模型设置类型(默认值为0- t 核函数类型:核函数设置类型(默认值为2- d degree:核函数中的 degree 参数设置(针对多项式核函数,默认值为3- g r(gama):核函数中的gama参数设置(针对多项式/sigmoid 核函数/RBF/,默认值为属性数目的倒数)
 
- r coef0:核函数中的coef0参数设置(针对多项式/sigmoid核函数,默认值为0)
  • model.Label model.nr_class
model.label 表示数据集中类别的标签都有什么

model.nr_class 表示数据集职工有多少个类别
  • model.totalSV model.nSV
model.total SV 代表总共的支持向量机的数目,这里一共259个。
model.nSV 代表每类样本的支持向量的数目,model.nSV 所代表的顺序是和 model.label 相对应。 标签为1的样本118个,标签为-1的样本 141 个。
  • model.sv_coef model.SVs model.rho
sv_coef: [259x1 double]
    SVs: [259x13 double]<br>  model.rho = 0.0514

sv_coef,承装的是259个支持向量在决策函数中的系数;
model.SVs 承装的是259个支持向量;
model.rho = 0.0514   是决策函数中的常数项的相反数。
  • accuracy

返回参数accuracy 从上到下的意义依次是:

分类准确率,分类问题中用到的参数指标;

平均平方误差( mean squared error,MSE),回归问题中用到的参数指标;

平方相关系数( squared correlation coefficient ,r2),回归问题中用到的参数指标。
M S E = 1 n ∑ i = 1 n ( f ( x i ) − y i ) 2 \mathrm{MSE}=\frac{1}{n} \sum_{i=1}^{n}\left(f\left(x_{i}\right)-y_{i}\right)^{2} MSE=n1i=1n(f(xi)yi)2
r 2 = ( n ∑ i = 1 n f ( x i ) y i − ∑ i = 1 n f ( x i ) ∑ i = 1 n y i ) 2 ( n ∑ i = 1 n f ( x i ) 2 − ( ∑ i = 1 n f ( x i ) ) 2 ) ( n ∑ i = 1 n y i 2 − ( ∑ i = 1 n y i ) 2 ) r^{2}=\frac{\left(n \sum_{i=1}^{n} f\left(x_{i}\right) y_{i}-\sum_{i=1}^{n} f\left(x_{i}\right) \sum_{i=1}^{n} y_{i}\right)^{2}}{\left(n \sum_{i=1}^{n} f\left(x_{i}\right)^{2}-\left(\sum_{i=1}^{n} f\left(x_{i}\right)\right)^{2}\right)\left(n \sum_{i=1}^{n} y_{i}^{2}-\left(\sum_{i=1}^{n} y_{i}\right)^{2}\right)} r2=(ni=1nf(xi)2(i=1nf(xi))2)(ni=1nyi2(i=1nyi)2)(ni=1nf(xi)yii=1nf(xi)i=1nyi)2

三. 决策函数

3.1. 理论分析

3.2. 代码实现

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
  • 22
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI新视界

感谢您的打赏,我会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值