Disscuss on the training data of SVM
关于SVM训练数据维度和过程的详细讨论
笔者在学习了支持向量机的基本原理后,使用matlab训练时,经常遇到向量维度不一致导致的运算错误,认为其原因在于参考一些文章的做法时,大多数作者并没有细致的解释数据集的排列方式,行向量,列向量等,对于初学者来说有些迷惑。
本文基于Matlab中的
quadprog
解函数来分析SVM手写推导过程
1. 数据集描述
: 训练集样本 ,57行,2000列,每一列是一个样本,每个样本是57维的列向量 : 训练集标签,2000行,1列,每一行保存一个数(1或-1)描述样本的类别
2. 二次型优化问题
2.1拉格朗日求解建立
前面的文章《Support Vector Machines 支持向量机》中提到过(后文简称上篇文章),求解SVM本身就是一个最优化问题,我们由此建立了拉格朗日函数:
并且由于我们的样本数据有57维,在二维平面空间并不可分,我们采用了核函数来完成高维映射:
2.2 Matlab中的quadprog
解函数
quadprog
是 Matlab中用于求解二次规划(Quadratic Programming)问题的函数。二次规划问题通常具有以下形式:
quadprog
函数的语法为:
1
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
这里是参数的含义:
H
:二次项系数矩阵,通常是对称正定的。f
:一次项系数列向量。A
、b
:不等式约束矩阵和向量。Aeq
、beq
:等式约束矩阵和向量。lb
、ub
:变量下界和上界。x0
:可选的初值。options
:优化选项,可以设置迭代次数等参数。
quadprog
函数的返回值包括:
x
:最优解。fval
:目标函数的最优值。exitflag
:表示求解器退出状态的标志。output
:包含有关求解器操作的详细信息。lambda
:最优解处的拉格朗日乘子。
使用 quadprog
函数可以有效地求解二次规划问题,尤其适用于具有线性和二次约束的优化问题。
2.3 用quadprog
求解SVM的拉格朗日乘子
需要最大化的值:
- 我们的训练集样本是2000个,要处理他们两两之间的内积,
是样本个数2000
- 我们的训练集样本是2000个,要处理他们两两之间的内积,
限制条件:
见上篇文章中公式5,由 化简得来- 如果采用Hard Margin:理论上
, 在程序中可用较大的数代替( ) - 如果是Soft margin:
- 如果采用Hard Margin:理论上
quadprog
求的是最小值,我们需要把求 最大转换成求 的最小值,这样才能代入求解函数中
注意我们的变量是
这样对应得到
quadprog
函数应该传入的参数如下:H
:一个 的矩阵, , 其元素值如下-
H=Y*Y'.*kernel(X,X);
等价的求H矩阵方式
-
f
:一个 的列向量, ,所有元素值都是 ,这样 就是一个全是 的行向量,和 相乘后就是 项A
、b
:不等式约束 , 未使用,直接赋空矩阵A=[]
、b=[]
Aeq
、beq
:等式约束 , 我们要满足 ,所以Aeq=Y'
、beq=0
, Y训练集标签本身是列向量,转置后Y'
与 列向量乘积=0lb
、ub
:变量下界和上界,都是 的列向量,下界所有元素是0,上界都是 , 表示所有 的范围都是- 其余参数可选
- 在上篇文章中介绍过的例子,当向量是支持向量,也就是在范围边界上,那么对应拉格朗日乘子
的值是1,其他的是0,这是一个具体的例子。 - 基于KKT条件:对于支持向量,
(理论上 ) - 但是由于程序无法达到理论的要求,比如
,存储的0也不是真的0而是很小的值 等等原因,我们需要设置一个判定标准,来判断向量是否是支持向量。也就是:如果 , 那么这个向量是支持向量。- 可以选取
,令支持向量的 - 同时令
的其他向量
- 可以选取
至此,我们利用quadprog
函数先求解了实际的
3. SVM 决策函数参数 和 的求解
3.1 一般情况推导
- 依照上篇文章推导出的公式4,不难发现
和 的关系
- 另外,由于支持向量满足
, 所以
其中,
的维度应该与一个样本 一致,是这样得到决策函数:
3.2 引入核函数
由于我们采用了核函数,已经把
映射到了高维的求解的
变成了:决策函数变成了:
预测结果: