什么是核函数
在 SVM 算法中有一个很重要的概念叫做核函数(Kernel Function)。那什么是核函数呢?这篇博客将以多项式核为例向大家介绍 SVM 中核函数到底是什么?
对于 SVM 的本质,其实就是求解下面这样一个最优化问题:
但是在求解这个最优化的问题中,我们还是需要将这个问题进行变形,变成一个在数学上更好解的问题:
这个式子看起来非常的复杂,这里略去推导过程。在上面这个式子中有非常重要的一项:
换句话说,这一项意味着对于样本数据集中的任意两个向量都要做一下向量间的点乘。如果我们要使用多项式特征,对于原来的样本
x
i
x^i
xi ,我们给它添加上多项式特征后变成:
对于另外一个样本
x
j
x^j
xj 同理:
这样做完之后,由于我们要使用新的特征了,我们不再使用
x
i
x^i
xi 和
x
j
x^j
xj 了,所以我们的目标函数就变成了:
那么核函数,它是这样一个思想:我们有没有可能不将
x
i
x^i
xi 和
x
j
x^j
xj 先分别转换成
x
′
i
x'^i
x′i 和
x
′
j
x'^j
x′j 再做这个乘法。我们有没有一种可能设置一个函数
K
K
K ,这个函数传入两个参数
x
i
x^i
xi 和
x
j
x^j
xj,我们直接对原来的两个样本进行数学运算,直接计算出
x
′
i
x'^i
x′i
x
′
j
x'^j
x′j。
如果我们能设计出这样的一个函数
K
K
K 的话,那么在目标函数中我们就可以进行相应的替换:
这里的
K
K
K 取不同的函数就相当于是现在我们的原始数据集上进行了一个变化,之后把
x
i
x^i
xi 变成了
x
’
i
x’^i
x’i,把
x
j
x^j
xj 变成了
x
′
j
x'^j
x′j,之后再对这两个样本进行乘法。我们的
K
K
K 函数的作用是想省略掉这一步,我们不进行这种变形了,我们直接拿原来的样本带进一个函数中,用这个函数直接算出来
x
′
i
x'^i
x′i 和
x
′
j
x'^j
x′j 点乘之后得到的结果。那么这个
K
K
K 函数就是核函数。
其实核函数不是 SVM 本身特有的一种技巧。事实上,只要我们的式子中存在 x i x^i xi x j x^j xj 这样的式子或者类似这样的式子,我们都可以应用核函数技巧。
下面就以多项式核函数为例,让我们更清晰的看到核函数是如何运作的?
在多项式核函数中,核函数的定义如下:
对于两个向量
x
x
x 和
y
y
y,我们将上面的式子进行展开:
相当于我们给原来的向量添加了二次方的多项式项,然后再进行点乘,这个过程我们可以不把变换后的数据表示出来,我们直接用原本数据带入以下式子就好了:
这个式子和
x
′
⋅
y
′
x' · y'
x′⋅y′ 点乘的结果是一致的。这就是核函数的一个优势,它大大降低了我们计算的复杂度。
再回到之前的目标函数中,我们将 K K K 函数进行替换,我们就完成了给我们的样本添加二次方这样的特征之后再使用 SVM 进行计算。
当然,我们需要拓展一下,由于我们的多项式不仅仅能制造二次方这样的多项式特征,我们可以计算任意的
d
e
g
r
e
e
degree
degree 这样的特征,所以
K
K
K 函数可以写成:
我们也将原来小括号内的 1 换成了
c
c
c,这里的
d
d
d 和
c
c
c 相当于两个新的超参数。这就是多项式核函数。
我们也可以查看 sklearn 官方文档
其实核函数的基本原理就是在替换原来样本的
x
⋅
y
x · y
x⋅y,其实我们可以利用核函数的思路来表示线性 SVM:
当我们理解了核函数的概念之后,就可以介绍很多不同的核函数,它们对应不同的对于我们原始数据样本点相应的转换。其中最为著名的核函数就是高斯核函数,下一篇博客将对高斯核函数进行具体介绍。