支持向量机系列学习笔记包括以下几篇:
Spark机器学习系列之13: 支持向量机SVM :http://blog.csdn.net/qq_34531825/article/details/52881804
支持向量机学习之2:核函数http://blog.csdn.net/qq_34531825/article/details/52895621
支持向量机学习之3:SVR(回归)http://blog.csdn.net/qq_34531825/article/details/52891780
本文绝大部分内容转载自 http://blog.csdn.net/xiaojiegege123456/article/details/7728198,xiaojiegege123456 CSDN,在我读完参考文献2,3之后,对原文有微细的增改。
SVM最终要转换为对偶问题如下:
的求解需要计算 <xi,xj> <script type="math/tex" id="MathJax-Element-3"> </script>这个内积,而如果输入样本线性不可分的话,我们采取的方法是通过 Φ:X↦F 函数映射将输入样本映射到另外一个高维空间并使其线性可分。
以库克定律为例(http://zh.wikipedia.org/zh-cn/%E9%9D%99%E7%94%B5%E5%8A%9B):
一个电量为 q′ 的点电荷作用于另一个电量为 q 的点电荷,其静电力 F 的大小,可以用方程表达为:
F=keqq′r2其中, r 是两个点电荷之间的距离, ke 是库仑常数。
显然这个定律无法用线性学习器来表达,看到乘积想到ln函数,对原始形式两边取ln,得到:lnF(q,q′,r)=ln(ke)+ln(q)+ln(q′)−2ln(r)>,令 x2=ln(q),x3=ln(q′),x4=ln(r),x1=in(ke),G(x⃗ )=ln(F(q,q′,r)) ,那么就得到一个线性学习器:
G(x⃗ )=x1+x2+x3−2x4=wTx⃗ ,其中x⃗ =[x1,x2,x3,x4]T
这个过程可以用下图说明:
考虑映射 Φ ,将一个低维空间的特征如 R2 空间 (x1,x2) 映射为 R3 空间 (x21,2√x1x2,x22) ,这样也许原来不可分的数据在高维度空间就变得可分了。
完成映射之后,原来需要计算
<xi,xj>
<script type="math/tex" id="MathJax-Element-19">
</script>,现在需要计算
<Φ(xi),Φ(xj)>
<script type="math/tex" id="MathJax-Element-20"><\Phi(x_i),\Phi(x_j)></script>:
但是随之而来的问题是,维度增加意味着特征个数增加,SVM中需要增加
αi
的个数,复杂度提高了,从而导致模型的泛化能力(学习器对训练样本以外数据的适应性)会随着维度的增长而大大降低,这也违反了“奥坎姆的剃刀”(这个原理称为“如无必要,勿增实体”,即“简单有效原理”。)
也许看到这里会觉得从
Φ:R2↦R3
有什么呀,不就多一个特征吗?其实上面是最简单的一个特殊例子,一般来说,如果我们把一个维度为
d
的低维度空间特征映射到高维度空间,假设映射后单项式的次数为
因此想要:先找到这种映射,然后将输入空间中的样本映射到新的空间中,最后在新空间中去求内积
<Φ(xi),Φ(xj)>
<script type="math/tex" id="MathJax-Element-29"><\Phi(x_i),\Phi(x_j)></script>是绝对不可行的。
因此我们需要找到某种方法,它不需要显式的将输入空间中的样本映射到新的空间中而能够在输入空间中直接计算出内积
<Φ(xi),Φ(xj)>
<script type="math/tex" id="MathJax-Element-30"><\Phi(x_i),\Phi(x_j)></script>。核函数就这样被研究出来了。再调强以下,它是对输入空间向高维空间的一种隐式映射,它不需要显式的给出那个映射,在输入空间就可以计算
<Φ(xi),Φ(xj)>
<script type="math/tex" id="MathJax-Element-31"><\Phi(x_i),\Phi(x_j)></script>:
定义1:核是一个函数
K
,对于所有的
于是输入空间的标准内积就被推广了。
对于前面提到的:映射
Φ
,将一个低维空间的特征如
R2
空间
x=(x1,x2)
映射为
R3
空间
(x21,2√x1x2,x22)
,
可以证明:
所以就找了 K(x,x′)=<x,x′>2 ,是不是输入空间的标准内积 <x,x′) <script type="math/tex" id="MathJax-Element-45"> 上面是一个特殊的例子,那么一般核函数K(x,y)通过什么样的方法去寻找呢?
假设有输入空间 X=x1,x2,....xn 且 K(x,y) 为对称函数,那么对于所有样本得到下面矩阵: k=(K(xi,xj))(i,j=0,...n) ,显然,这个是个对称矩阵,那么对于对称矩阵一定存在一个正交矩阵,使得 PTkP=Λ ,这里 Λ 是包含 k 的特征值
ϕ:xi|−>(λ1−−√v1i,λ2−−√v2i...λn−−√vtn)∈Rn(i=1,...n)
于是有 <ϕ(xi),ϕ(xj)>=∑t=1nλtvtivtj=(VΛVT)i,j=ki,j=K(xi,xj) <script type="math/tex" id="MathJax-Element-58"><\phi(x_i),\phi(x_j)>=\sum\limits_{t=1}^n{\lambda_tv_{ti}v_{tj}}=(V\Lambda V^T)_{i,j}=k_{i,j}=K(x_i,x_j)</script>,( 其中V为特征向量组成的矩阵,Λ为相应特征值组成的三角矩阵),也就是说K是对应于映射ϕ的核函数 。
例子:
k=⎡⎣⎢400031013⎤⎦⎥,其特征向量: v1=(1,0,0)T和v2=(0,12√,12√)T,v3=(0,−12√,12√)T,V=(v1,v2,v3)=⎡⎣⎢⎢⎢10001(√2)1(√2)0−1(√2)1(√2)⎤⎦⎥⎥⎥,满足V−1kV=Λ=⎡⎣⎢400040002⎤⎦⎥,对所有输入样本做映射得: >
ϕ(x1)=(4√∗1,4√∗0,2√∗0)=(2,0,0)T ;>
ϕ(x2)=(4√∗0,4√∗12√,2√∗(−12√))T=(0,2√,−1) ;
ϕ(x3)=(4√∗0,4√∗12√,2√∗12√)T=(0,2√,1) 。
随便选两个做内积,如 <ϕ(x2),ϕ(x3)>=0∗0+2√∗2√+(−1)∗1=1=K(x2,x3) <script type="math/tex" id="MathJax-Element-65"><\phi(x_2),\phi(x_3)>=0*0+\sqrt{2}*\sqrt{2}+(-1)*1=1=K(x_2,x_3)</script>。
由此可见:K(x,y)就是对应于特征映射 ϕ 的核函数,
可以得到下面的结论:
定理1:存在有限输入空间
X,K(x,y)为X
上的对称函数,那么
K(x,y)
是核函数的充要条件是矩阵
k=(K(xi,xj))(i,j=0,...n)
半正定,此时相当于对输入空间向特征空间进行了隐式的
ϕ
映射。
对于上面的映射
ϕ,令ϕi(xj)=λi−−√vij,
于是
ϕ(x)=(ϕ1(x),ϕ2(x),...ϕn(x))
,
进而K(x,y)=∑i=1∞λiϕi(x)ϕi(y) 。
定理3:设
X
是
这里 L2 指的是由满足条件 ∫f(x)2dx<∞ 的所有函数f(x)组成的空间。
在X×X上扩展K(x,y)到一个一致收敛的序列,该序列由Tk的特征函数ϕj∈L2(x)构成,归一化使得||ϕj||L2=1,且所有特征值λj≥0,则核函数K(x,y)可以被特征分解
为:
K(x,y)=∑i=1∞λiϕi(x)ϕi(y)
定义2:设H是希尔伯特函数空间,其元素是某个抽象集合X上的实值或复值函数,如果对于任何
y∈X,K(x,y)
作为x的函数都是H中的元素,而且对于任何y \in X及f \in H取内积有:
f(y)=<f(x),K(x,y)>
则H称为为再生核希尔伯特空间(Reproducing Kernel Hilbert Space,RKHS);称
K(x,y)
为再生核空间H的再生核(简称RK)。
定理4:对于定义在域
X⊂Rd
上的每一个Mercer核
K(x,y)
,存在一个定义在X上的函数的再生希尔伯特空间RKHS,其中K是再生核。反过来,对于线性有界函数的任意希尔伯特空间,存在再生核这个命题也成立。
当然也可以利用核函数来构造核函数,有时候这种构造会很有效的解决问题:
条件:设
K1(x,y)、K2(x,y)是X×X
上的核,
X⊆Rn,f
是X上的实值函数,
ϕ:X−>Rm,K3(x,y)
是
Rm×Rm
上的核,
A
是一个对称半正定矩阵,则下面的函数都是核:
核的选择对于支持向量机至关重要,选定核K(x_i,x_j)后,原问题就变成了:
这个优化问题有最优解么?记得核要满足Mercer条件,即矩阵
k=(K(xi,xj))(i,j=0,...n)
在所有训练集上半正定,这说明这个优化是凸优化,于是这个条件保证了最大化间隔优化问题有唯一解,简直是天作之合啊,配合的天衣无缝;最后求的
(α∗)
和b,那么从输入空间向特征空间隐式映射后得到的最大间隔超平面也就出来了:
f(x)=∑i=1nα∗yiK(xi,x)+b∗,且有几何间隔γ=1||w∗||=(∑i∈supportvectorα∗i)1/2
。
常用核函数总结如下:
线性核函数:
K<x,y>=<x,y>d
多项式核函数:
K(x,y)=(<x,y>+1)d
高斯核函数:
K(x,y)=e−||x−y||22δ2
Sigmoid核函数:
K(x,y)=tanh(ρ<x,y>+c)
下面这个链接收集了若干核函数:
http://www.shamoxia.com/html/y2010/2292.html
关于核方法的理论部分涉及到泛函分析、微积分等等,水比较深,我推荐一本书:《Kernel Methods for Pattern Analysis》(模式分析的核方法),作者是:John Shawe-Taylor和Nello Cristianini 。
主要参考文献
(1)http://blog.csdn.net/xiaojiegege123456/article/details/7728198,xiaojiegege123456 CSDN
(2)支持向量机通俗导论(理解SVM的三层境界) http://blog.csdn.net/v_july_v/article/details/7624837
(3)A Tutorial on Support Vector Regression, Alex J. Smola and Bernhard Scholkopf