引言:
对于SVM的核函数,许多初学者可能在一开始都不明白核函数到底是怎么做到从二维空间映射到三维空间(这里我们特征空间以二维为例),因此本文主要讲解其中一种核函数-------高斯核函数作为介绍,另外感谢Andrew Ng在网易云课堂深入浅出的讲解,不但加深了我的理解,也为我写这篇博客提供了不少素材。
代价函数:
相比于Logistic Regression的代价函数:
SVM的代价函数只是稍微进行修改:
其中
h
θ
(
x
(
i
)
)
=
1
1
+
e
−
θ
T
x
h_\theta(x^{(i)})=\frac1{1+e^{-\theta^Tx}}
hθ(x(i))=1+e−θTx1其实也就是sigmod函数。
而cost函数可以由下图中的粉线表示:
![](https://i-blog.csdnimg.cn/blog_migrate/9a2a1b366ab37708b547c493d94bbf90.png)
当然其中的转折点是人为定义的,这里选择以1为转折点。
此外,我们还能发现,相比于Logistic regression,SVM的优化函数只不是过
1
λ
\frac1{\lambda}
λ1换成了
C
C
C和修改了
c
o
s
t
cost
cost函数,其实差别并不大。当然,我们也能从老师PPT的图中可以看出sigmod函数的大致走向。
当然啦,如果你看不懂这个也没关系,这与下面的高斯核函数的理解上联系并不紧密。
下面先给一个高斯核的效果图,让大家先有一个大致的理解
![](https://i-blog.csdnimg.cn/blog_migrate/c0b68b1725534dab02d4af53c604e0da.png)
此图来自于github上的CS299的知识图谱总结
为了引出核函数的作用,我们先来观察决策边界为非线性的情况:
![](https://i-blog.csdnimg.cn/blog_migrate/35b74da15a008bcc43e7976d355ec766.png)
当
θ
T
x
(
i
)
>
=
1
\theta^Tx^{(i)} >= 1
θTx(i)>=1时
y
=
1
y=1
y=1为图中红色X
否则,
y
=
0
y=0
y=0为图中蓝色O
要想拟合这个非线性的决策边界,其中有一种方法就是用高阶函数去拟合这个特征,事实上,这个方案是并不可行,因为这样做存在一定的问题:从理论上来说,我们有很多不同的特征去选择来拟合这个边界(选择起来是一个问题)或者可能会存在比这些高阶多项式更好的特征,因为我们并不知道这些高阶多项式的组合是否一定对模型的提升有帮助。
引入高斯核函数:
首先我们先来看一下二维正态分布的图像:
![](https://i-blog.csdnimg.cn/blog_migrate/784df8492748213b9e7cdabc1620a090.png)
从图像中我们可以看出,离中心点越近,函数值就越接近于1。
其公式为:
y
=
e
(
−
(
x
1
−
μ
)
2
+
(
x
2
−
μ
)
2
2
σ
2
)
y = e^{(-{\frac{(x_1-\mu)^2+(x_2-\mu)^2}{2\sigma^2}})}
y=e(−2σ2(x1−μ)2+(x2−μ)2)
由指数函数的特征,我们可以看到,如果指数部分为接近0,那么
y
y
y就会接近1;如果指数部分越小,那么
y
y
y就会越接近于0。
讲到这里,是否有点熟悉的感觉?没错,之前我在讲标签判定的时候,说到
θ
T
x
(
i
)
\theta^Tx^{(i)}
θTx(i)决定着最后类别的确定,那么试想一下,如果我们把2维平面上的点,映射到到上图中,那么从上往下看就会看到类似于下面这张同心圆的图:
![](https://i-blog.csdnimg.cn/blog_migrate/5c78ece9090710d82014eaf3c5169549.png)
因此以任意一种颜色的同心圆作为决策边界,我们都可以完成对数据集的简单非线性划分。那么问题来了,如何映射到高维空间上去呢?------------------高斯核函数!
我们可以在二维空间中构造3个新特征,如下图(PS:这是只是打个比方,现实中并不一定是3个特征)
![](https://i-blog.csdnimg.cn/blog_migrate/e8702e2902dd8ca17cdb9dd0d8cab1ba.png)
然后重新定义我们的假设:
当 θ T f ( x ( i ) ) > = 1 \theta^Tf(x^{(i)}) >= 1 θTf(x(i))>=1时 y = 1 y=1 y=1为图中 红色X
否则, y = 0 y=0 y=0为图中的 蓝色O
其中 f ( x ( i ) ) f(x^{(i)}) f(x(i))就为我们的高斯核函数 f ( x ( i ) ) = e ( − ∣ ∣ x i − l i ∣ ∣ 2 2 σ 2 ) f(x^{(i)})=e^{(-{\frac{{||x_i - l_i||}^2}{2\sigma^2}})} f(x(i))=e(−2σ2∣∣xi−li∣∣2)
那么就在这个平面上而言,越是接近于这三个点的点,他由通过高斯核函数对3个特征点进行计算时,结果之和就越容易大于1。
高斯核的实现代码:
# 高斯核的实现方法
def RBF(x, L, sigma):
'''
x: 待分类的点的坐标
L: 某些中心点,通过计算x到这些L的距离的和来判断类别
'''
return np.exp(-(np.sum((x - L) ** 2)) / (2 * sigma**2))
![](https://i-blog.csdnimg.cn/blog_migrate/eb2188a517e6b3ee109badc9b55bc493.png)
因为如果
x
i
x_i
xi和
l
i
l_i
li越是接近,2范数就越趋向于0,则指数函数趋向于1,而对于那些别叫远的点而言,指数项中的
∣
∣
x
i
−
l
i
∣
∣
2
{||x_i - l_i||}^2
∣∣xi−li∣∣2则会越大,前面添上"
−
-
−"号,就越小,那么有指数函数的变化可得,结果之和会小于1。
所以到这里,我们便可以把二维平面上的数据点,映射到三维空间中,从而达到了可以进行复杂的非线性决策边界的学习。
Note:
对于高斯核函数参数的选择,我们可以参考下图
![](https://i-blog.csdnimg.cn/blog_migrate/ed0fb0253ff0906a7b2dd8632484a9b7.png)
也就是说我们在选择
σ
\sigma
σ时,尽量不要选择过小的值,否则容易导致过拟合!
如果觉得我有地方讲的不好的或者有错误的欢迎给我留言,谢谢大家阅读(点个赞我可是会很开心的哦)~