支持向量机SVM介绍以及MATLAB实现

一、介绍

  支持向量机是数据挖掘中的一项新技术,是借助最优化方法来解决机器学习问题的新工具,最初由V.Vapnik等人提出,近几年来在其理论研究和算法实现等方面都取得了很大的进展,开始成为克服“维数灾难”和“过学习”等困难的强有力手段,其理论基础和实现途径的基本框架都已形成。
  支持向量机(Support Vector Machine ,以下简称SVM)在模式识别等领域获得了广泛的应用。其主要思想是找到一个超平面,使得它能够尽可能多地将两类数据点正确分开,同时使分开的两类数据点距离分类面最远,如下图(b)所示。(与图(a)做对比)
  在进行线性分类时,将分类面取在离两类样本距离较大的地方;进行非线性分类时通过高维空间变换,将非线性分类变成高维空间的线性分类问题。
在这里插入图片描述

二、支持向量机分类基本原理

  根据给定的训练集 T T T = { [ a 1 , y 1 ] , [ a 2 , y 2 ] , ⋅ ⋅ ⋅ , [ a l , y l ] [a_1,y_1],[a_2,y_2],···,[a_l,y_l] [a1,y1],[a2,y2],⋅⋅⋅,[al,yl]} ∈ \in ( Ω × Y ) l \Omega \times Y)^l Ω×Y)l, 式中 a i ∈ Ω = R n a_i \in \Omega = R^n aiΩ=Rn Ω \Omega Ω称为输入空间,输入空间中的每个点 a i a_i ai,由 n n n个属性特征组成; y i ∈ Y = y_i \in Y = yiY={-1,1}, i = 1 , 2 , ⋅ ⋅ ⋅ , l i =1,2,···,l i=1,2,⋅⋅⋅,l。寻找 R n R^n Rn上的一个实值函数 g ( x ) g(x) g(x),以便用分类函数
f ( x ) = s i g n ( g ( x ) ) f(x) = sign(g(x)) f(x)=sign(g(x)),
推断任意一个模式 x x x相对应的 y y y值的问题为分类问题。

2.1 线性可分SVM

  支持向量机最初是研究线性可分问题而提出的,因此,这里先详细介绍线性SVM的基本
思想及原理。
  为不失一般性,假设大小为 l l l的训练样本集{( x i , y i x_i,y_i xi,yi), i = 1 , 2 , ⋅ ⋅ ⋅ , l i= 1,2,···,l i=1,2,⋅⋅⋅,l}由两个类别组成。若 x i x_i xi属于第一类,则记 y i y_i yi=1;若 x i x_i xi属于第二类,则记 y i y_i yi= -1。
  若存在分类超平面
ω ⋅ x + b = 0 (2.1.1) \omega ·x +b =0\tag{2.1.1} ωx+b=0(2.1.1)
能够将样本正确地划分成两类,即相同类别的样本都落在分类超平面的同一侧,则称该样本集是线性可分的,即满足
{ ω ⋅ x + b ≥ 1 , y i = 1 ( i = 1 , 2 , ⋅ ⋅ ⋅ , l ) ω ⋅ x + b ≤ − 1 , y i = − 1 ( i = 1 , 2 , ⋅ ⋅ ⋅ , l ) (2.1.2) \begin{cases} \omega· x +b \geq 1,&y_i = 1(i= 1,2,···,l)\tag{2.1.2} \\ \omega· x +b \leq -1,&y_i = -1(i= 1,2,···,l)\\ \end{cases} {ωx+b1,ωx+b1,yi=1(i=1,2,⋅⋅⋅,l)yi=1(i=1,2,⋅⋅⋅,l)(2.1.2)
  定义样本点 x i x_i xi;到式(2.1.1)所指的分类超平面的间隔为
ϵ i = y i ( ω ⋅ x i + b ) = ∣ ω ⋅ x i + b ∣ (2.1.3) \epsilon_i = y_i(\omega· x_i + b) = | \omega ·x_i + b |\tag{2.1.3} ϵi=yi(ωxi+b)=ωxi+b(2.1.3)
将式(2.1.3)中的 ω 和 b \omega 和 b ωb进行归一化,即用 ω ∣ ∣ ω ∣ ∣ 和 b ∣ ∣ b ∣ ∣ \frac{\omega}{||\omega||}和\frac{b}{||b||} ∣∣ω∣∣ω∣∣b∣∣b分别代替原来的 ω 和 b \omega 和b ωb,并将归一化后的间隔定义为集合间隔
δ i = ω ⋅ x i + b ∣ ∣ ω ∣ ∣ (2.1.4) \delta_i = \frac{\omega ·x_i + b}{|| \omega ||}\tag{2.1.4} δi=∣∣ω∣∣ωxi+b(2.1.4)
  同时定义一个样本集到超平面的距离为此集合与分类超平面最近的样本点的几何间隔,即
δ = min ⁡ δ i , ( i = 1 , 2 , ⋅ ⋅ ⋅ , l ) (2.1.5) \delta = \min \delta_i,(i = 1,2,···,l)\tag{2.1.5} δ=minδi,(i=1,2,⋅⋅⋅,l)(2.1.5)
  样本误分次数 N N N与样本集到分类超平面的距离 δ \delta δ之间的关系为
N ≤ ( 2 R δ ) 2 (2.1.6) N \leq (\frac{2R}{\delta})^2\tag{2.1.6} N(δ2R)2(2.1.6)
其中, R = max ⁡ ∣ ∣ x i ∣ ∣ , i = 1 , 2 , ⋅ ⋅ ⋅ , l R = \max ||x_i||,i = 1,2,···,l R=max∣∣xi∣∣,i=1,2,⋅⋅⋅,l,为样本集中间向量长度最长的值。
  由式(2.1.6)可知,误分次数 N N N的上界由样本集到分类超平面的距离 δ \delta δ决定,即 δ \delta δ越大, N N N越小。因此,需要在满足式(2.1.2)的无数个分类超平面中选择一个最优分类面,使得样本集到分类超平面的距离 δ \delta δ最大。
  若间隔 ϵ i = ∣ ω ⋅ x i + b ∣ = 1 \epsilon_i = | \omega ·x_i + b | =1 ϵi=ωxi+b=1,则两类样本点间的距离为 2 ∣ ω ⋅ x i + b ∣ ∣ ∣ ω ∣ ∣ = 2 ∣ ∣ ω ∣ ∣ 2\frac{|\omega· x_i + b|}{|| \omega ||} = \frac{2}{|| \omega ||} 2∣∣ω∣∣ωxi+b=∣∣ω∣∣2。因此,如下图所示,目标即为在满足式(2.1.2)的约束下寻求最优分类超平面,使得 2 ∣ ∣ ω ∣ ∣ \frac{2}{|| \omega ||} ∣∣ω∣∣2最大,即最小化 ∣ ∣ ω ∣ ∣ 2 2 \frac{|| \omega||^2}{2} 2∣∣ω2

用数学语言描述,即,

{ min ⁡ ∣ ∣ ω ∣ ∣ 2 2 s . t . y i ( ω ⋅ x i + b ) ≥ 1 , i = 1 , 2 , ⋅ ⋅ ⋅ , l (2.1.7) \begin{cases} \min \frac{|| \omega||^2}{2}\tag{2.1.7} \\ s.t. \quad y_i(\omega ·x_i + b)\geq 1,i =1,2,···,l \end{cases} {min2∣∣ω2s.t.yi(ωxi+b)1,i=1,2,⋅⋅⋅,l(2.1.7)
  该问题目标函数 ∣ ∣ ω ∣ ∣ 2 2 \frac{|| \omega||^2}{2} 2∣∣ω2 ω \omega ω的凸函数,并且约束条件都是线性的。引入拉格朗日函数
L ( ω , b , α ) = 1 2 ∣ ∣ ω ∣ ∣ 2 − ∑ i = 1 l α i [ y i ( ω ⋅ x i + b ) − 1 ] (2.1.8) L(\omega ,b,\alpha) = \frac{1}{2}||\omega||^2 - \sum_{i=1}^l \alpha_i[y_i(\omega ·x_i +b)-1]\tag{2.1.8} L(ω,b,α)=21∣∣ω2i=1lαi[yi(ωxi+b)1](2.1.8)
其中, α = [ α 1 , ⋅ ⋅ ⋅ , α l ] T ∈ R l + \alpha = [\alpha_1,···,\alpha_l]^T \in R^{l+} α=[α1,⋅⋅⋅,αl]TRl+为拉格朗日乘子。
  由于计算的复杂性,一般不直接求解,而是根据对偶理论,将(2.1.8)转化成对偶问题,即
{ max ⁡ Q ( α ) = ∑ i = 1 l α i − 1 2 ∑ i = 1 l ∑ j = 1 l α i α j y i y j ( x i ⋅ x j ) s . t . ∑ i = 1 l α i y i = 0 , α ≥ 0 (2.1.9) \begin{cases} \max Q(\alpha) = \sum\limits_{i=1}^l \alpha_i-\frac{1}{2}\sum\limits_{i=1}^l\sum\limits_{j=1}^l\alpha_i\alpha_jy_iy_j(x_i·x_j)\tag{2.1.9}\\ s.t. \sum\limits_{i=1}^l\alpha_iy_i = 0,&\alpha \geq 0\\ \end{cases} maxQ(α)=i=1lαi21i=1lj=1lαiαjyiyj(xixj)s.t.i=1lαiyi=0,α0(2.1.9)
  这个问题可以用二次规划方程求解。设最优解为 α ∗ = [ α 1 ∗ , ⋅ ⋅ ⋅ , α l ∗ ] T \alpha^* = [\alpha_1^*,···,\alpha_l^*]^T α=[α1,⋅⋅⋅,αl]T,则可以得到最优解 ω ∗ 和 b ∗ \omega^*和b^* ωb
{ ω ∗ = ∑ i = 1 l α i ∗ x i y i b ∗ = − 1 2 ω ∗ ( x r + x s ) (2.1.10) \begin{cases} \omega^* = \sum\limits_{i=1}^l\alpha^*_ix_iy_i\tag{2.1.10}\\ b^* = -\frac{1}{2}\omega^*(x_r+x_s)\\ \end{cases} ω=i=1lαixiyib=21ω(xr+xs)(2.1.10)
其中, x r 和 x s x_r和x_s xrxs为两个类别中的任意一对支持向量。
  最终得到的分类模型为
f ( x ) = s g n [ ∑ i = 1 l α i ∗ y i ( x ⋅ x i ) + b ∗ ] (2.1.11) f(x) = sgn[\sum\limits_{i=1}^l\alpha_i^*y_i(x·x_i) + b^*]\tag{2.1.11} f(x)=sgn[i=1lαiyi(xxi)+b](2.1.11)
  值得一提的是,若数据集中的绝大多数样本是线性可分的,仅有少数几个样本(可能是异常点)导致寻找不到最优分类超平面(入下图所示)
在这里插入图片描述

针对此类情况,通用的做法是引入松弛变量,并对式(2.1.7)中的优化目标即约束项进行修正,即
{ min ⁡ ∣ ∣ ω ∣ ∣ 2 2 + C ∑ i = 1 l ξ i s . t . { y i ( ω x i + b ) ≥ 1 − ξ i ξ i > 0 , i = 1 , 2 , ⋅ ⋅ ⋅ , l (2.1.12) \begin{cases} \min \frac{|| \omega||^2}{2} + C\sum\limits_{i=1}^l\xi_i\tag{2.1.12} \\ s.t. \quad {\begin{cases} y_i(\omega x_i + b)\geq 1-\xi_i \\ \xi_i>0&,i =1,2,···,l\\ \end{cases}} \\ \end{cases} min2∣∣ω2+Ci=1lξis.t.{yi(ωxi+b)1ξiξi>0,i=1,2,⋅⋅⋅,l(2.1.12)
其中, C C C为惩罚因子,起着控制错分样本惩罚程度的作用,从而实现在错分样本的比例与算法复杂度间的折中。求解方法与式(2.1.8)相同,即转化为其对偶问题
L ( ω , b , ξ , α , γ ) = 1 2 ∣ ∣ ω ∣ ∣ 2 + C ∑ i = 1 l ξ i − ∑ i = 1 l α i [ y i ( ω ⋅ x i + b ) − 1 + ξ i ] − ∑ i = 1 l γ i ξ i L(\omega ,b,\xi,\alpha,\gamma) = \frac{1}{2}||\omega||^2 + C\sum\limits_{i=1}^l\xi_i- \sum_{i=1}^l \alpha_i[y_i(\omega ·x_i +b)-1 + \xi_i] - \sum\limits_{i=1}^l\gamma_i\xi_i L(ω,b,ξ,α,γ)=21∣∣ω2+Ci=1lξii=1lαi[yi(ωxi+b)1+ξi]i=1lγiξi
只是约束条件变为
{ ∑ i = 1 l α i y i = 0 , i = 1 , 2 , ⋅ ⋅ ⋅ , l 0 ≤ α i ≤ C (2.1.13) \begin{cases} \sum\limits_{i=1}^l\alpha_iy_i = 0,&i =1,2,···,l\tag{2.1.13}\\ 0\leq \alpha_i \leq C \end{cases} i=1lαiyi=0,0αiCi=1,2,⋅⋅⋅,l(2.1.13)
最终求得到的分类函数形式与(2.1.11)一样。

2.2 线性不可分SVM

  在实际应用中,绝大多数问题都是非线性的,这时对于线性可分SVM是无能为力的。对于此类线性不可分问题,常用的方法是通过非线性映射 Φ : R d → H \Phi:R^d→H Φ:RdH,将原输人空间的样本映射到高维的特征空间 H H H中,再在高维特征空间 H H H中构造最优分类超平面,如下图所示。另外,与线性可分SVM相同,考虑到通过非线性映射到高维特征空间后仍有因少量样本造成的线性不可分情况,亦考虑引入松弛变量。

  在高维特征空间中寻求最优分类超平面的过程及方法与线性可分SVM情况类似,只是
以核函数取代了高维特征空间中的点积,从而大大减少了计算量与复杂度。
  映射到高维特征空间后对应的对偶问题变为
{ max ⁡ Q ( α ) = ∑ i = 1 l α i − 1 2 ∑ i = 1 l ∑ j = 1 l α i α j y i y j K ( x i ⋅ x j ) s . t . { ∑ i = 1 l α i y i = 0 , , i = 1 , 2 , ⋅ ⋅ ⋅ , l 0 ≤ α i ≤ C (2.1.15) \begin{cases} \max Q(\alpha) = \sum\limits_{i=1}^l \alpha_i-\frac{1}{2}\sum\limits_{i=1}^l\sum\limits_{j=1}^l\alpha_i\alpha_jy_iy_jK(x_i·x_j)\tag{2.1.15}\\ s.t. \quad {\begin{cases} \sum\limits_{i=1}^l\alpha_iy_i = 0,&,i =1,2,···,l \\ 0 \leq \alpha_i\leq C \\ \end{cases}} \\ \end{cases} maxQ(α)=i=1lαi21i=1lj=1lαiαjyiyjK(xixj)s.t. i=1lαiyi=0,0αiC,i=1,2,⋅⋅⋅,l(2.1.15)
设最优解为 α ∗ = [ α 1 ∗ , ⋅ ⋅ ⋅ , α l ∗ ] T \alpha^* = [\alpha_1^*,···,\alpha_l^*]^T α=[α1,⋅⋅⋅,αl]T,则
ω ∗ = ∑ i = 1 l α i ∗ Φ ( x i ) y i (2.1.16) \omega^* = \sum\limits_{i=1}^l\alpha^*_i\Phi(x_i)y_i\tag{2.1.16} ω=i=1lαiΦ(xi)yi(2.1.16)
从而得到最优的分类模型为
f ( x ) = s g n ( ω ∗ Φ ( x ) + b ∗ ) = s g n ( ∑ i = 1 l α i ∗ y i Φ ( x ) ⋅ Φ ( x i ) + b ∗ ) = s g n ( ∑ i = 1 l α i ∗ y i K ( x i , x ) + b ∗ ) (2.1.17) f(x) = sgn(\omega^*\Phi(x) + b^*) = sgn(\sum\limits_{i=1}^l\alpha_i^*y_i\Phi(x)·\Phi(x_i) + b^*) \\= sgn(\sum\limits_{i=1}^l\alpha_i^*y_iK(x_i,x) + b^*)\tag{2.1.17} f(x)=sgn(ωΦ(x)+b)=sgn(i=1lαiyiΦ(x)Φ(xi)+b)=sgn(i=1lαiyiK(xi,x)+b)(2.1.17)
  容易证明,解中将只有一部分(通常是少部分)不为零,非零部分对应的样本 x i x_i xi就是支持向量,决策边界仅由支持向量确定。由式(2.1.15)也可以看出,支持向量机的结构与神经网络的结构较为类似,如下图所示。输出是中间节点的线性组合,每个中间节点对应一个支持向量。

  常用的核函数

函数公式
线性核函数 K ( x , x i ) = x ⋅ x i K(x,x_i) = x·x_i K(x,xi)=xxi
多项式核函数 K ( x , x i ) = ( x ⋅ x i + 1 ) d K(x,x_i) = (x·x_i + 1)^d K(x,xi)=(xxi+1)d
径向基核函数 K ( x , x i ) = e x p ( ∣ ∣ x − x i ∣ ∣ 2 2 σ 2 ) K(x,x_i) = exp(\frac{||x-x_i||^2}{2 \sigma^2}) K(x,xi)=exp(2σ2∣∣xxi2)
Sigmoid核函数 K ( x , x i ) = t a n h ( k ( ( x ⋅ x i ) + θ ) K(x,x_i) = tanh(k((x·x_i) + \theta) K(x,xi)=tanh(k((xxi)+θ)
傅里叶核函数 K ( x , x i ) = ∑ k = 1 n 1 − q 2 2 [ 1 − 2 q c o s ( a i k − a j k ) + q 2 ] K(x,x_i) = \sum\limits_{k=1}^n\frac{1-q^2}{2[1-2qcos(a_{ik}-a_{jk})+q^2]} K(x,xi)=k=1n2[12qcos(aikajk)+q2]1q2

2.3 多分类问题

  由线性可分SVM和线性不可分SVM的原理可知,支持向量机仅限于处理二分类问题,对于多分类问题,须做进一步的改进。目前,构造多分类SVM的方法主要有两个:直接法和间接法。直接法通过修改待求解的优化问题,直接计算出用于多分类的分类函数,该方法计算量较大、求解过程复杂、花费时间较长,实现起来比较困难。间接法主要是通过组合多个二分类SVM来实现多分类SVM的构建,常见的方法有一对一(one-against-one)和一对多(one-against- all)两种。

2.3.1一对一(ovo)

  一对一在 K K K类训练样本中构造所有可能的二分类SVM,即将每类样本与其他类别的样本分别构成二分类问题,共构造 K ( K − 1 ) 2 \frac{K(K-1)}{2} 2K(K1)个二分类SVM。测试样本经过所有的二分类SVM进行分类,然后对所有类别进行投票,得票最多的类别(最占优势的类别)即为测试样本所属的类别。

2.3.2一对多(ovr)

  一对多由 K K K个二分类SVM组成,第 i ( i = 1 , 2 , … , K ) i(i=1,2,…,K) i(i=1,2,,K)个二分类SVM将第 i i i类训练样本的类别标记为+1,而将其余所有训练样本的类别标记为-1。测试样本经过所有二分类SVM进行分类,然后根据预测得到的类别标号判断是否属于第 i ( i = 1 , 2 , … , K ) i(i=1,2,…,K) i(i=1,2,,K)个类别。

2.3.2ovo 和ovr 区别

  区别如下图所示:

三、MATLAB实现

libsvm包实现

  本例将用乳腺癌诊断来对算法进行实现

1.产生训练集/测试集

%% 清空环境变量
clear all
clc
%% 导入数据
load BreastTissue_data.mat
% 随机产生训练集和测试集
n = randperm(size(matrix,1));
% 训练集——80个样本
train_matrix = matrix(n(1:80),:);
train_label = label(n(1:80),:);
% 测试集——26个样本
test_matrix = matrix(n(81:end),:);
test_label = label(n(81:end),:);

2. 数据归一化

%% 数据归一化
[Train_matrix,PS] = mapminmax(train_matrix');
Train_matrix = Train_matrix';
Test_matrix = mapminmax('apply',test_matrix',PS);
Test_matrix = Test_matrix';

3. SVM创建/训练(RBF核函数)

  如前文所述,在创建/训练SVM时应考虑核函数及相关参数对模型性能的影响。这里采用默认的RBF核函数。首先利用交又验证方法寻找最佳的参数 c c c(惩罚因子)和参数 g g g(RBF核函数中的方差),然后利用最佳的参数训练模型。值得一提的是,当模型的性能相同时,为了减少计算时间,优先选择惩罚因子 c c c比较小的参数组合,这是因为惩罚因子 c c c越大,最终得到的支持向量数将越多,计算量越大。具体程序如下:

% 寻找最佳c/g参数——交叉验证方法
[c,g] = meshgrid(-10:0.2:10,-10:0.2:10);
[m,n] = size(c);
cg = zeros(m,n);
eps = 10^(-4);
v = 5;
bestc = 1;
bestg = 0.1;
bestacc = 0;
for i = 1:m
    for j = 1:n
        cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j))];
        cg(i,j) = svmtrain(train_label,Train_matrix,cmd);     
        if cg(i,j) > bestacc
            bestacc = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end        
        if abs( cg(i,j)-bestacc )<=eps && bestc > 2^c(i,j) 
            bestacc = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end               
    end
end
cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
% 创建/训练SVM模型
model = svmtrain(train_label,Train_matrix,cmd);

4. SVM仿真测试

%% SVM仿真测试
[predict_label_1,accuracy_1] = svmpredict(train_label,Train_matrix,model);
[predict_label_2,accuracy_2] = svmpredict(test_label,Test_matrix,model);
result_1 = [train_label predict_label_1];
result_2 = [test_label predict_label_2];

5. 结果展示

%% 绘图
figure
plot(1:length(test_label),test_label,'r-*')
hold on
plot(1:length(test_label),predict_label_2,'b:o')
grid on
legend('真实类别','预测类别')
xlabel('测试集样本编号')
ylabel('测试集样本类别')
string = {'测试集SVM预测结果对比(RBF核函数)';
          ['accuracy = ' num2str(accuracy_2(1)) '%']};
title(string)

结果如下:

  由于训练集和测试集是随机产生的,所以程序每次运行的结果都会不同。某次运行的测试集预测结果如下表所列。从表中可以清晰地看到,只有样本5和7和13预测错误,测试集的预测正确率达到88.46%(23/26)。且如前文所述,乳腺癌、纤维腺瘤和乳腺病(标签分别为1、2和3)为病变组织,乳腺组织、结缔组织和脂肪组织(标签分别为4、5、6)为正常组织,若仅判断为病变组织或正常组织(即二分类),则样本5和7判断正确(将乳腺癌诊断为纤维腺瘤,同为病变组织),预测正确率将达到96.15%(25/26),这也从另外一个角度体现了SVM用于二分类的优越性。

样本编号12345678910111213
真实类别2225314611164
预测类别2225116611161
样本编号14151617181920212223242526
真实类别1331465631366
预测类别1331465631366

  
  
  
  

喜欢的小伙伴麻烦点个赞加关注奥,谢谢啦🙏🙏
代码链接:https://pan.baidu.com/s/1OPzcZVisebc3reS3ycR8tA
提取码:6666

参考:
MATLAB智能算法30案例分析(第二版)

  • 69
    点赞
  • 476
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱听雨的犬猫

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值