简单介绍
在不使用kernel function的情况下,SVM只可以用来解决线性可分问题,面对线性不可分问题时,使用效果不佳.但是加入kernel function后,SVM的表达能力将会显著增加,下面将会简单介绍其原因,并使用PyTorch加以实现.
源代码以及题目等文件见博客
原理
SVM的原理不再进行赘述,具体可见博客.我们需要理解两个方面,1.为什么要使用kernel function.2.为什么使用kernel function可以解决线性不可分问题.
对于问题2,原因在于如果原始空间是有限维,即属性有限时,一定存在一个高维特征空间使样本可分.通俗的说,也就是当样本特征维度有限时,我们可以通过一定方式,扩展样本特征,使其从线性不可分变为线性可分.(机器学习(周志华)有讲,但我还没看到证明部分,不清楚具体原因)
对于问题1,原因在于对于SVM,实际上就是求解有约束优化问题,它的形式如下:
m i n 1 2 ∣ ∣ w ∣ ∣ 2 s . t . y ( w T ϕ ( x ) + b ) > = 1 min \frac{1}{2}||w||^2 \\ s.t. \\ y(w^T\phi(x)+b)>=1 min21∣∣w∣∣2s.t.y(wTϕ(x)+b)>=1
其中 ϕ ( x ) \phi(x) ϕ(x)表示将原先的 x x x映射到更高维度的空间,使其变为线性可分.
使用拉格朗日乘子法,我们可以将其转化为如下对偶问题:
m a x ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j ϕ ( x i ) T ϕ ( x j ) s . t . ∑ i = 1 m α i y i = 0 α i > = 0 , i = 1 , 2 , . . . , m max \sum_{i=1}^m\alpha_i-\frac{1}{2}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j\phi(x_i)^T\phi(x_j) \\ s.t. \\ \sum_{i=1}^m\alpha_iy_i=0 \\ \alpha_i>=0, i=1,2,...,m maxi=1∑mαi−21i=1∑mj=1∑mαiαj