机器学习(MATLAB实现)——SVM支持向量机(一)

SVM支持向量机

  • 支持向量机理论概述
    • 二分类支持向量机
    • 多分类支持向量机
    • libsvm工具箱使用简介
      • 训练函数
      • 预测函数
      • libsvm参数实例
      • 一点拓展
        • 参考文献

支持向量机理论概述

核函数用于将支持向量机的点集合映射到更高维的空间,这样就可以将现有空间中的数据点实现用超平面的划分。
常用的核函数如下:
线性核函数: K ( x , x i ) = x T x i K(x,x_i)=x^Tx_i K(x,xi)=xTxi;
多项式核函数: K ( x , x i ) = ( γ x T x i + r ) p K(x,x_i)=({\gamma}x^Tx_i+r)^p K(x,xi)=(γxTxi+r)p
径向基核函数: K ( x , x i ) = e x p ( − γ ∣ ∣ x − x i ∣ ∣ 2 ) , γ > 0 K(x,x_i)=exp(-{\gamma}||x-x_i||^2),{\gamma}>0 K(x,xi)=exp(γxxi2),γ>0
两层感知器核函数: K ( x , x i ) = t a n h ( γ x T x i + r ) K(x,x_i)=tanh({\gamma}x^Tx_i+r) K(x,xi)=tanh(γxTxi+r)

二分类支持向量机

推导过程略(详见周志华《机器学习》[^2])
构造决策函数: f ( x ) = s g n ( ∑ i = 1 l a i ∗ y i K ( x , x i ) + b ∗ ) f(x)=sgn(\sum_{i=1}^{l}a_i^*y_iK(x,x_i)+b^*) f(x)=sgn(i=1laiyiK(x,xi)+b)

多分类支持向量机

构造多分类支持向量机的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多分类。这种方法对于计算复杂度比较高,实现较为困难。另一类是间接法,通过组合多个二分类器来实现多分类器的构造,常见的方法有一对多和一对一两种。
(1)一对多:训练时依次把某个类别的样本归为一类,其它剩余的样本归为另一类,这样k个类别就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
(2)一对一:在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计 k ( k − 1 ) / 2 k(k-1)/2 k(k1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别就是该未知样本的类别。
(3)层次支持向量机。层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,知道得到一个单独的类别为止。
上述的多分类支持向量机在MATLAB中可以通过fitcecoc实现,这样就可以在仅包含有二分类的MATLAB中实现多级分类。

libsvm工具箱使用简介

训练函数

model=svmtrain(train_label,train_data,options);

输入:
train_data:训练集属性矩阵,大小为nm,n表示样本数,m表示属性数目(维数),数据类型double。
train_label:训练集标签,大小为n
1,n表示样本数,数据类型double
options:参数选项。
输出:
model:训练得到的模型,是一个结构体。

预测函数

[predict_label,accuracy/mse,dec_value]=svmpredict(test_label,test_data,model);

输入:
test_data:测试集属性矩阵,大小为Nm,N表示测试集样本数,m表示属性数目(维数),数据类型为double。
test_label:测试集标签,大小为N
1,N表示样本数,数据类型为double。注意:如果没有测试集标签,虽然可以用任意的N1向量来代替但是此时输出的accuracy/mse就没有参考价值。
model:svmtrain训练得到的模型
输出:
predict_label:预测的测试集的标签,大小为N
1,N表示样本数,数据类型为double.
accuracy/mse:一个3*1的列向量,第一个数表示分类准确率(分类问题使用),第二个数表示mse(回归问题使用),第三个数表示平方相关系数(回归问题使用)。注意:如果测试集的真实标签事先无法得知,次返回值没有参考意义。
dec_value:决策值。

libsvm参数实例

options为一些参数的选项,主要有:
-s svm类型:SVM模型设置类型(默认值为0)
0:C-SVC(C-Support Vector Classification)
1:nu-SVC(nu-Support Vector Classification)
2:one-class SVM
3:epsilon-SVR(epsilon-Support Vector Regression)
4:nu-SVR(nu-Support Vector Regression)
-t 核函数类型:核函数上设置类型(默认值为2)
0:线性核函数 u ′ v u'v uv
1:多项式核函数 ( r ∗ u ′ v + c o e f 0 ) d e g r e e (r*u'v+coef0)^{degree} (ruv+coef0)degree
2:RBF核函数(也称为高斯核函数) e x p ( − r ∣ u − v ∣ 2 ) exp(-r|u-v|^2) exp(ruv2)
3:sigmoid核函数 t a n h ( r ∗ u ′ v + c o e f 0 ) tanh(r*u'v+coef0) tanh(ruv+coef0)
-d degree:核函数中的degree参数设置(针对多项式核函数默认值为3)
-g r(gama):核函数中的gamma参数函数设置(针对多项式rbf/sigmoid核函数,默认值为属性数目的倒数,即若k为属性数目,则-g参数默认为1/k)
-r coef0:核函数中的coef0参数设置(针对多项式/sigmoid核函数,默认值为0)
-c cost:设置C-SVC,epsilon-SVR和nu-SVR的参数(默认值为1)
-n nu:设置nu-SVC,one-classSVM和nu-SVR的参数(默认值为0.5)
-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
下面是自行按照西瓜书中的3 α \alpha α数据集来实现的MATLAB代码:

clc,clear
data=load('xigua3_alpha.txt');
ind=find(data(:,4)==0);
data(ind,4)=-1;
% ind=randi([1,17],17,1);
train_data=[data(1:5,:);data(9:14,:)];
test_data=[data(6:8,:);data(15:end,:)];
model=svmtrain_matlab(train_data(:,4),train_data(:,2:3),'-s 0 -t 0 -c 2');
[predict_label,accuracy,~]=svmpredict_matlab(test_data(:,4),test_data(:,2:3),model);

运行结果如下:

model = 
  包含以下字段的 struct:

    Parameters: [5×1 double]
      nr_class: 2
       totalSV: 10
           rho: 1.5519
         Label: [2×1 double]
    sv_indices: [10×1 double]
         ProbA: []
         ProbB: []
           nSV: [2×1 double]
       sv_coef: [10×1 double]
           SVs: [10×2 double]
Parameters =
         0
         0
    3.0000
    0.5000
         0
label =
     1
    -1
nr_class =
     2
totalSV =
    10
nSV =
     5
     5

据此我们可以分析svmtrain函数的输出内容:

一点拓展

1、MATLAB自带的SVM事先函数仅支持分类问题,不支持回归问题;而libsvm工具箱支持分类和回归问题。
2、MATLAB自带的函数SVM事先函数仅支持二分类问题,不支持多分类问题,libsvm默认采用一对一法支持多分类。
3、libsvm中的最优化问题的解决算法是序列最小最优化算法(SMO),而MATLAB自带的SVM实现函数中有三种解法可供选择:经典二次规划算法(Quadratic Programming)、序列最小最优化算法(SMO)、最小二乘法(Least-Square)。

参考文献

[1] 王小川等. MATLAB神经网络43个案例分析. 北京:北京航空航天大学出版社,2013.
[2] 周志华. 机器学习. 北京:清华大学出版社,2016

你可能感兴趣的:(机器学习,支持向量机)