笔者在学习了支持向量机的基本原理后,使用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=∑αi−21i∑j∑α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=∑α