核技巧 II

视频主要内容

  • 使用核函数的细节实现
  • 如何选择地标

如何选择下标

通常是根据训练集的数量选择地标的数量,即如果训练集中有 m 个实例,则我们 选取 m 个地标,并且令:$ l^{(1)}=x^{(1)},l^{(2)}=x^{(2)},…,l^{(m)}=x^{(m)}$。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:

SVM中的核函数

下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:

  • 给定 x,计算新特征 f,当 $\theta^Tf>=0$ 时,预测 y=1,否则反之。

在具体实施过程中,还需要对最后的正则化项进行些微调整,在计算$\sum^{n=m}_{j=1}\theta^2_j=\theta^T\theta$
时,我们用 $\theta^TM\theta$ 代替$\theta^T\theta$,其中 M 是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。

理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用 M 来简化计算的方法 不适用与逻辑回归,因此计算将非常耗费时间。

在此,我们不介绍最小化支持向量机的代价函数的方法,你可以使用现有的软件包(如 liblinear,libsvm 等)。在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的

另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel), 当我们不采用非常复杂的函数,或者我们的训练集特征非常多而实例非常少的时候,可以采用这种不带核函数的支持向量机。

SVM参数C与$\sigma$

下面是支持向量机的两个参数 C (1/λ)和 σ 的影响:

  • C 较大时,相当于 λ 较小,可能会导致过拟合,高方差;
  • C 较小时,相当于 λ 较大,可能会导致低拟合,高偏差;
  • σ 较大时,可能会导致低方差,高偏差;
  • σ 较小时,可能会导致低偏差,高方差。

牛刀小试

我们来实现以下Guassian Kernel

import numpy as np
def kernelWithGuassian(x1, x2, sigma):
    result = np.exp(- np.power(x1 - x2, 2) / (2 * (sigma ** 2)))
    return result
x1 = np.array([1, 2, 1])
x2 = np.array([0, 4, -1])
sigma = 2

kernelWithGuassian(x1, x2, sigma)

array([0.8824969 , 0.60653066, 0.60653066])

另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel), 当我们不采用非常复杂的函数,或者我们的训练集特征非常多而实例非常少的时候,可以采用这种不带核函数的支持向量机。