回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类
问题:
为了获得上图所示的判定边界,我们的模型可能是?0 + ?1?1 + ?2?2 + ?3?1?2 + ?4?²1 +?5?²2 + ⋯的形式。
我们可以用一系列的新的特征f 来替换模型中的每一项。例如令: ?1 = ?1, ?2 = ?2, ?3 =?1?2, ?4 = ?²1, ?5 = ?²2
...得到ℎ? (?) = ?1?1 + ?2?2+. . . +????。然而,除了对原有的特征进行组合以外,有没有
更好的方法来构造?1, ?2, ?3?我们可以利用核函数来计算出新的特征。给定一个训练实例? , 我们利用? 的各个特征与我们预先选定的地标
(landmarks)?(1), ?(2), ?(3)的近似程度来选取新的特征?1, ?2, ?3。
例如:
其中:
为实例?中所有特征与地标?(1)之间的距离的和。
上例中的??????????(?, ?(1))就是核函数,具体而言,这里是一个高斯核函数(Gaussian Kernel)。
注:这个函数与正态分布没什么实际上的关系,只是看上去像而已。这些地标的作用是什么?如果一个训练实例?与地标?之间的距离近似于0,则新特征 ?近似于?−0 = 1,如果训练实例?与地标?之间距离较远,则?近似于?−(一个较大的数) = 0。
假设我们的训练实例含有两个特征[?1 ?2],给定地标?(1)与不同的?值,见下图:
图中水平面的坐标为 ?1,?2而垂直坐标轴代表?。可以看出,只有当?与?(1)重合时?才
具有最大值。随着?的改变?值改变的速率受到?2的控制。在下图中,当实例处于洋红色的点位置处,因为其离?(1)更近,但是离?(2)和?(3)较远,因
此?1接近1,而?2,?3接近0。因此ℎ? (?) = ?0 + ?1?1 + ?2?2 + ?1?3 > 0,因此预测? = 1。同理可以求出,对于离?(2)较近的绿色点,也预测? = 1,但是对于蓝绿色的点,因为其离三个地标都较远,预测? = 0。
这样,图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练实例和我们选
取的地标所得出的判定边界,在预测时,我们采用的特征不是训练实例本身的特征,而是通过核函数计算出的新特征?1, ?2, ?3。如何选择地标?
我们通常是根据训练集的数量选择地标的数量,即如果训练集中有?个实例,则我们选取?个地标,并且令:?(1) = ?(1), ?(2) = ?(2), . . . . . , ?(?) = ?(?)。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:
下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:
• 给定?,计算新特征?,当??? >= 0 时,预测 ? = 1,否则反之。相应地修改代价函数为:
在具体实施过程中,我们还需要对最后的正则化项进行些微调整,在计算
时,
我们用????代替
???,其中?是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用 ?来简化计算的方法
不适用与逻辑回归,因此计算将非常耗费时间。在此,我们不介绍最小化支持向量机的代价函数的方法,你可以使用现有的软件包(如
liblinear,libsvm 等)。在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的。另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),
当我们不采用非常复杂的函数,或者我们的训练集特征非常多而实例非常少的时候,可以采用这种不带核函数的支持向量机。下面是支持向量机的两个参数?和?的影响:
? = 1/?? 较大时,相当于?较小,可能会导致过拟合,高方差;? 较小时,相当于?较大,可能会导致低拟合,高偏差;?较大时,可能会导致低方差,高偏差;?较小时,可能会导致低偏差,高方差。