Post

Disscuss on the training data of SVM

Disscuss on the training data of SVM

关于SVM训练数据维度和过程的详细讨论

笔者在学习了支持向量机的基本原理后,使用matlab训练时,经常遇到向量维度不一致导致的运算错误,认为其原因在于参考一些文章的做法时,大多数作者并没有细致的解释数据集的排列方式,行向量,列向量等,对于初学者来说有些迷惑。

本文基于Matlab中的quadprog 解函数来分析SVM手写推导过程

1. 数据集描述

  • X[57×2000]: 训练集样本 ,57行,2000列,每一列是一个样本,每个样本是57维的列向量
  • Y2000×1: 训练集标签,2000行,1列,每一行保存一个数(1或-1)描述样本的类别

2. 二次型优化问题

2.1拉格朗日求解建立

前面的文章《Support Vector Machines 支持向量机》中提到过(后文简称上篇文章),求解SVM本身就是一个最优化问题,我们由此建立了拉格朗日函数: L=12||w||2αi[yi(wxi+b)1]

L=αi12ijαiαjyiyjxixj

并且由于我们的样本数据有57维,在二维平面空间并不可分,我们采用了核函数来完成高维映射: K(xi,xj)=ϕ(xi)ϕ(xj) 因此改写拉格朗日函数为: L=αi12ijαiαjyiyjK(xi,xj)

2.2 Matlab中的quadprog 解函数

quadprog 是 Matlab中用于求解二次规划(Quadratic Programming)问题的函数。二次规划问题通常具有以下形式: minx12xTHx+fTx 其中,x是待求解的变量,H 是对称正定矩阵, f是一个列向量。

quadprog 函数的语法为:

1
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)

这里是参数的含义:

  • H:二次项系数矩阵,通常是对称正定的。
  • f:一次项系数列向量。
  • Ab:不等式约束矩阵和向量。
  • Aeqbeq:等式约束矩阵和向量。
  • lbub:变量下界和上界。
  • x0:可选的初值。
  • options:优化选项,可以设置迭代次数等参数。

quadprog 函数的返回值包括:

  • x:最优解。
  • fval:目标函数的最优值。
  • exitflag:表示求解器退出状态的标志。
  • output:包含有关求解器操作的详细信息。
  • lambda:最优解处的拉格朗日乘子。

使用 quadprog 函数可以有效地求解二次规划问题,尤其适用于具有线性和二次约束的优化问题。

2.3 用quadprog 求解SVM的拉格朗日乘子

  • 需要最大化的值: L=Q(α)=iNαi12iNjNαiαjyiyjK(xi,xj)

    • 我们的训练集样本是2000个,要处理他们两两之间的内积,N是样本个数2000
  • 限制条件:

    • αiyi=0 见上篇文章中公式5,由Lb=0化简得来
    • 0αiC
      • 如果采用Hard Margin:理论上C=+, 在程序中可用较大的数代替(106
      • 如果是Soft margin:C=0.1,0.6,2.1
  • quadprog求的是最小值,我们需要把求L最大转换成求L的最小值,这样才能代入求解函数中

minx12xTHx+fTx min[Q(α)]=12iNjNαiαjyiyjK(xi,xj)iNαi
  • 注意我们的变量是α

  • 这样对应得到quadprog 函数应该传入的参数如下:

    • H:一个N×N的矩阵, N=2000, 其元素值如下

      • Hi,j=yiyjK(xi,xj)
      • H=Y*Y'.*kernel(X,X);等价的求H矩阵方式
    • f:一个N×1的列向量, N=2000,所有元素值都是1,这样 fT就是一个全是1的行向量,和α[2000×1]相乘后就是 iNαi

    • Ab:不等式约束Axb, 未使用,直接赋空矩阵A=[]b=[]

    • Aeqbeq:等式约束Aeqx=beq, 我们要满足αiyi=0,所以Aeq=Y'beq=0, Y训练集标签本身是列向量,转置后Y'α列向量乘积=0
    • lbub:变量下界和上界,都是N×1的列向量,下界所有元素是0,上界都是C, 表示所有αi的范围都是0αiC
    • 其余参数可选
  • 在上篇文章中介绍过的例子,当向量是支持向量,也就是在范围边界上,那么对应拉格朗日乘子αi的值是1,其他的是0,这是一个具体的例子。
  • 基于KKT条件:对于支持向量,αi0 (理论上>0)
  • 但是由于程序无法达到理论的要求,比如C+,存储的0也不是真的0而是很小的值 等等原因,我们需要设置一个判定标准,来判断向量是否是支持向量。也就是:如果 αi>threshold, 那么这个向量是支持向量。
    • 可以选取 threshold=104,令支持向量的αi=1
    • 同时令αi<threshold 的其他向量αi=0

至此,我们利用quadprog 函数先求解了实际的α向量,然后利用判定门限,得到α的逻辑值。

3. SVM 决策函数参数 wb 的求解

3.1 一般情况推导

  • 依照上篇文章推导出的公式4,不难发现wα 的关系
w=i=1Nαiyixi
  • 另外,由于支持向量满足yi(wxi+b)1=0, 所以
b=1yswTxs
  • 其中,w的维度应该与一个样本xi一致,是57×1

  • 这样得到决策函数: g(x)=wTx+b

3.2 引入核函数

  • 由于我们采用了核函数,已经把xi 映射到了高维的 ϕ(xi)

  • 求解的w变成了: w=i=1Nαiyiϕ(xi)

  • 决策函数变成了: g(x)=wTϕ(x)+b=i=1NαiyiϕT(xi)ϕ(x)+b=i=1NαiyiK(xi,x)+b

  • 预测结果: Ypred=sgn[g(xtest)]

This post is licensed under CC BY 4.0 by the author.