面对非线性问题时,会用到“核函数”的技巧,那么到底什么是核函数呢?
核函数:映射关系的内积。映射函数本身仅仅是一种映射关系,并没有增加维度的特性,不过可以利用核函数的特性,构造可以增加维度的核函数。
二维映射到三维,区分就容易了,这是常用核函数的原因。为什么PCA降维算法也使用核函数呢?
要注意,核函数和映射没有关系。核函数只是用来计算映射到高维空间之后的内积的一种简便方法。
举一个知乎上霍华德的例子。假设我们的任务是要预测那些微博可以上微博热搜榜。
有两个离散特征,一个代表某个微博里有“鹿晗”,一个代表某个微博里有“关晓彤”。
两个特征单独看热度都一般,此时我们用二阶多项式核方法:
K ( 鹿 晗 , 关 晓 彤 ) = < 鹿 晗 , 关 晓 彤 > 2 K(鹿晗,关晓彤) = <鹿晗,关晓彤>^2 K(鹿晗,关晓彤)=<鹿晗,关晓彤>2
这个核函数可以把二维空间投射到三维空间,展开之后是:
K ( 鹿 晗 , 关 晓 彤 ) = ( 鹿 晗 2 , 2 鹿 晗 × 关 晓 彤 , 关 晓 彤 2 ) K(鹿晗,关晓彤) =(鹿晗^2,\sqrt{2}鹿晗\times 关晓彤,关晓彤^2) K(鹿晗,关晓彤)=(鹿晗2,2鹿晗×关晓彤,关晓彤2)
这样就把二维特征变成了三维,多了一维 鹿 晗 × 关 晓 彤 鹿晗\times 关晓彤 鹿晗×关晓彤 ,代表着某条微博里鹿晗和关晓彤同时出现。
结果大家都知道了,鹿晗关晓彤同时出现的那条微博超级火,把新浪服务器都挤爆了。
举一个知乎上王赟 Maigo的例子。
目标:区分红色和黑色两部分
可以看到图一中明显不是线性可分的,图三可看出是二维曲线,但是通过核函数映射到三维,可以明显看到中间绿色的部分将原图线性可分了。
我们现在考虑核函数 k ( v 1 , v 2 ) = < v 1 , v 2 > 2 k(v_1,v_2) = <v_1, v_2>^2 k(v1,v2)=<v1,v2>2,即“内积平方”。
这里面 v 1 = ( x 1 , y 1 ) v_1 = (x_1,y_1) v1=(x1,y1), v 2 = ( x 2 , y 2 ) v_2 = (x_2,y_2) v2=(x2,y2)是二维空间中的两个点。
这个核函数对应着一个二维空间到三维空间的映射,它的表达式是:
P ( x , y ) = ( x 2 , ( 2 ) x y , y 2 ) P(x, y) = (x^2, \sqrt(2)xy, y^2) P(x,y)=(x2,(2)xy,y2)
可以验证,
< P ( v 1 ) , P ( v 2 ) > = < ( x 1 2 , 2 x 1 y 1 , y 1 2 ) , ( x 2 2 , 2 x 2 y 2 , y 2 2 ) > < P(v_1), P(v_2) > = <(x_1^2, \sqrt2x_1y_1, y_1^2), (x_2^2, \sqrt2x_2y_2, y_2^2)> <P(v1),P(v2)>=<(x12,2x1y1,y12),(x22,2x2y2,y22)>
= x 1 2 x 2 2 + 2 x 1 x 2 y 1 y 2 + y 1 2 y 2 2 = x_1^2x_2^2 + 2x_1x_2y_1y_2 + y_1^2y_2^2 =x12x22+2x1x2y1y2+y12y22
= ( x 1 2 x 2 + y 1 y 2 ) 2 = (x_1^2x_2 + y_1y_2)^2 =(x12x2+y1y2)2
= < v 1 , v 2 > 2 = <v_1,v_2>^2 =<v1,v2>2
= K ( v 1 , v 2 ) =K(v_1, v_2) =K(v1,v2)
现实生活中有很多非线性非常强的特征 而核方法能够捕捉它们。核技巧(kernel trick)的作用,一句话概括的话,就是降低计算的复杂度,甚至把不可能的计算变为可能。
在机器学习中常用的核函数,一般有这么几类,也就是LibSVM中自带的这几类:
- 线性: K ( v 1 , v 2 ) = < v 1 , v 2 > K(v_1,v_2) = <v_1,v_2> K(v1,v2)=<v1,v2>
- 多项式: K ( v 1 , v 2 ) = ( γ < v 1 , v 2 > + c ) n K(v_1,v_2) = (\gamma<v_1,v_2>+c)^n K(v1,v2)=(γ<v1,v2>+c)n
- Radial basis function: K ( v 1 , v 2 ) = exp ( − γ ∣ ∣ v 1 − v 2 ∣ ∣ 2 ) K(v_1,v_2)=\exp(-\gamma||v_1-v_2||^2) K(v1,v2)=exp(−γ∣∣v1−v2∣∣2)
- Sigmoid:
K
(
v
1
,
v
2
)
=
tanh
(
γ
<
v
1
,
v
2
>
+
c
)
K(v_1,v_2)=\tanh(\gamma<v_1,v_2> + c)
K(v1,v2)=tanh(γ<v1,v2>+c)
举的例子是多项式核函数中 γ = 1 , c = 0 , n = 2 \gamma = 1,c = 0,n = 2 γ=1,c=0,n=2的情况。