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

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

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

1. 数据集描述

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

2. 二次型优化问题

2.1拉格朗日求解建立

前面的文章《Support Vector Machines 支持向量机》中提到过(后文简称上篇文章),求解SVM本身就是一个最优化问题,我们由此建立了拉格朗日函数:
L = 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 − ∑ α i [ y i ( w ⃗ ⋅ x i ⃗ + b ) − 1 ] L=\frac{1}{2}{||\vec{w}||}^2-\sum\alpha_i[y_i(\vec{w} \cdot \vec{x_i}+b) -1] L=21∣∣w ∣∣2αi[yi(w xi +b)1]

L = ∑ α i − 1 2 ∑ i ∑ j α i α j y i y j x i ⃗ ⋅ x j ⃗ L=\sum\alpha_i-\frac{1}{2}\sum_i\sum_j\alpha_i\alpha_jy_iy_j \vec{x_i}\cdot\vec{x_j} L=αi21ijαiαjyiyjxi xj

并且由于我们的样本数据有57维,在二维平面空间并不可分,我们采用了核函数来完成高维映射:
K ( x i ⃗ , x j ⃗ ) = ϕ ( x i ⃗ ) ⋅ ϕ ( x j ⃗ ) K(\vec{x_i},\vec{x_j})=\phi(\vec{x_i})\cdot\phi(\vec{x_j}) K(xi ,xj )=ϕ(xi )ϕ(xj )
因此改写拉格朗日函数为:
L = ∑ α i − 1 2 ∑ i ∑ j α i α j y i y j K ( x i ⃗ , x j ⃗ ) L=\sum\alpha_i-\frac{1}{2}\sum_i\sum_j\alpha_i\alpha_jy_iy_j K(\vec{x_i},\vec{x_j}) L=αi21ijαiαjyiyjK(xi ,xj )

2.2 Matlab中的quadprog 解函数

quadprog 是 Matlab中用于求解二次规划(Quadratic Programming)问题的函数。二次规划问题通常具有以下形式:
min ⁡ x 1 2 x T H x + f T x \min_x \frac{1}{2} x^T H x + f^T x xmin21xTHx+fTx
其中, x x x是待求解的变量, H H H 是对称正定矩阵, f f f是一个列向量。

quadprog 函数的语法为:

[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 ( α ) = ∑ i N α i − 1 2 ∑ i N ∑ j N α i α j y i y j K ( x i ⃗ , x j ⃗ ) L=Q(\alpha)=\sum^N_i\alpha_i-\frac{1}{2}\sum_i^N\sum_j^N\alpha_i\alpha_jy_iy_j K(\vec{x_i},\vec{x_j}) L=Q(α)=iNαi21iNjNαiαjyiyjK(xi ,xj )

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

    • ∑ α i y i = 0 \sum\alpha_iy_i=0 αiyi=0 见上篇文章中公式5,由 ∂ L ∂ b = 0 \frac{\partial L}{\partial b}=0 bL=0化简得来
    • 0 ≤ α i ≤ C 0\leq\alpha_i\leq C 0αiC
      • 如果采用Hard Margin:理论上 C = + ∞ C = + \infty C=+, 在程序中可用较大的数代替( 1 0 6 10^6 106
      • 如果是Soft margin: C = 0.1 , 0.6 , 2.1... C =0.1,0.6,2.1... C=0.1,0.6,2.1...
  • quadprog求的是最小值,我们需要把求 L L L最大转换成求 − L -L L的最小值,这样才能代入求解函数中

min ⁡ x 1 2 x T H x + f T x \min_x \frac{1}{2} x^T H x + f^T x xmin21xTHx+fTx

m i n [ − Q ( α ) ] = 1 2 ∑ i N ∑ j N α i α j y i y j K ( x i ⃗ , x j ⃗ ) − ∑ i N α i min[-Q(\alpha)]=\frac{1}{2}\sum_i^N\sum_j^N\alpha_i\alpha_jy_iy_j K(\vec{x_i},\vec{x_j})-\sum^N_i\alpha_i min[Q(α)]=21iNjNαiαjyiyjK(xi ,xj )iNαi

  • 注意我们的变量是 α \alpha α

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

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

      • H i , j = y i y j K ( x i , x j ) H_{i,j}=y_iy_jK(x_i,x_j) Hi,j=yiyjK(xi,xj)
      • H=Y*Y'.*kernel(X,X);等价的求H矩阵方式
    • f:一个 N × 1 N\times 1 N×1的列向量, N = 2000 N=2000 N=2000,所有元素值都是 − 1 -1 1,这样 f T f^T fT就是一个全是 − 1 -1 1的行向量,和 α [ 2000 × 1 ] \alpha_{[2000\times 1]} α[2000×1]相乘后就是 − ∑ i N α i -\sum^N_i\alpha_i iNαi

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

    • Aeqbeq:等式约束 A e q ⋅ x = b e q Aeq\cdot x = beq Aeqx=beq, 我们要满足 ∑ α i y i = 0 \sum\alpha_iy_i=0 αiyi=0,所以Aeq=Y'beq=0, Y训练集标签本身是列向量,转置后Y' α \alpha α列向量乘积=0

    • lbub:变量下界和上界,都是 N × 1 N\times 1 N×1的列向量,下界所有元素是0,上界都是 C C C, 表示所有 α i \alpha_i αi的范围都是 0 ≤ α i ≤ C 0\leq\alpha_i\leq C 0αiC

    • 其余参数可选

  • 在上篇文章中介绍过的例子,当向量是支持向量,也就是在范围边界上,那么对应拉格朗日乘子 α i \alpha_i αi的值是1,其他的是0,这是一个具体的例子。

  • 基于KKT条件:对于支持向量, α i ≠ 0 \alpha_i \neq 0 αi=0 (理论上 > 0 >0 >0)

  • 但是由于程序无法达到理论的要求,比如 C ≠ + ∞ C\neq+\infty C=+,存储的0也不是真的0而是很小的值 等等原因,我们需要设置一个判定标准,来判断向量是否是支持向量。也就是:如果 α i > t h r e s h o l d \alpha_i > threshold αi>threshold, 那么这个向量是支持向量。

    • 可以选取 t h r e s h o l d = 1 0 − 4 threshold=10^{-4} threshold=104,令支持向量的 α i = 1 \alpha_i=1 αi=1
    • 同时令 α i < t h r e s h o l d \alpha_i<threshold αi<threshold 的其他向量 α i = 0 \alpha_i=0 αi=0

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

3. SVM 决策函数参数 w ⃗ \vec{w} w b b b 的求解

3.1 一般情况推导
  • 依照上篇文章推导出的公式4,不难发现 w ⃗ \vec{w} w α \alpha α 的关系

w ⃗ = ∑ i = 1 N α i y i x i ⃗ \vec{w}=\sum_{i=1}^N\alpha_iy_i\vec{x_i} w =i=1Nαiyixi

  • 另外,由于支持向量满足 y i ( w ⃗ ⋅ x i ⃗ + b ) − 1 = 0 y_i(\vec{w} \cdot \vec{x_i}+b) -1= 0 yi(w xi +b)1=0, 所以

b = 1 y s − w ⃗ T ⋅ x s ⃗ b=\frac{1}{y_s}-\vec{w}^T\cdot \vec{x_s} b=ys1w Txs

  • 其中, w w w的维度应该与一个样本 x i x_i xi一致,是 57 × 1 57\times 1 57×1

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

3.2 引入核函数
  • 由于我们采用了核函数,已经把 x i x_i xi 映射到了高维的 ϕ ( x i ) \phi(x_i) ϕ(xi)

  • 求解的 w w w变成了:
    w = ∑ i = 1 N α i y i ϕ ( x i ) w=\sum_{i=1}^N\alpha_iy_i\phi(x_i) w=i=1Nαiyiϕ(xi)

  • 决策函数变成了:
    g ( x ) = w T ϕ ( x ) + b = ∑ i = 1 N α i y i ϕ T ( x i ) ϕ ( x ) + b = ∑ i = 1 N α i y i K ( x i , x ) + b g(x)=w^T\phi(x)+b\\ =\sum_{i=1}^N\alpha_iy_i\phi^T(x_i)\phi(x)+b\\ =\sum_{i=1}^N\alpha_iy_iK(x_i,x)+b g(x)=wTϕ(x)+b=i=1NαiyiϕT(xi)ϕ(x)+b=i=1NαiyiK(xi,x)+b

  • 预测结果:
    Y p r e d = s g n [ g ( x t e s t ) ] Y_{pred}=sgn[g(x_{test})] Ypred=sgn[g(xtest)]

  • 30
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值