zoukankan      html  css  js  c++  java
  • 支持向量机(四)-- 核函数

    一、核函数的引入

    问题1:

    SVM显然是线性分类器。但数据假设根本就线性不可分怎么办?

    解决方式1:

    数据在原始空间(称为输入空间)线性不可分。可是映射到高维空间(称为特征空间)后非常可能就线性可分了。

    问题2:

    映射到高维空间同一时候带来一个问题:在高维空间上求解一个带约束的优化问题显然比在低维空间上计算量要大得多,这就是所谓的“维数灾难”。

    解决方式2:

    于是就引入了“核函数”。核函数的价值在于它尽管也是讲特征进行从低维到高维的转换。


    二、实例说明
    比如图中的两类数据,分别分布为两个圆圈的形状,不论是不论什么高级的分类器,仅仅要它是线性的。就没法处理。SVM 也不行。

    由于这种数据本身就是线性不可分的。



    从上图我们能够看出一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。

    假设用 X1 和 X2 来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程能够写作这种形式:

    a1X1+a2X21+a3X2+a4X22+a5X1X2+a6=0

    注意上面的形式,假设我们构造另外一个五维的空间,当中五个坐标的值分别为 Z1=X1Z2=X21Z3=X2Z4=X22Z5=X1X2,那么显然。上面的方程在新的坐标系下能够写作:

    i=15aiZi+a6=0

    关于新的坐标 Z 。这正是一个超平面 的方程!

    也就是说,假设我们做一个映射 ϕ:R2R5 。将 X 依照上面的规则映射为 Z ,那么在新的空间中原来的数据将变成线性可分的,从而使用之前我们推导的线性分类算法就能够进行处理了。这正是 Kernel 方法处理非线性问题的基本思想。

    三、具体分析

    还记得之前我们用内积clip_image077[6]这里是二维模型,可是如今我们须要三维或者更高的维度来表示样本。这里我们如果是维度是三。

    那么首先须要将特征x扩展到三维clip_image002[6],然后寻找特征和结果之间的模型。我们将这样的特征变换称作特征映射(feature mapping)。映射函数称作clip_image004[10],在这个样例中

    clip_image006[6]

    我们希望将得到的特征映射后的特征应用于SVM分类,而不是最初的特征。

    这样,我们须要将前面clip_image008[4]公式中的内积从clip_image010[16],映射到clip_image012[42]。 

    为什么须要映射后的特征而不是最初的特征来參与计算,一个重要原因是例子可能存在线性不可分的情况,而将特征映射到高维空间后,往往就可分了。

    核函数的定义:

    将核函数形式化定义。假设原始特征内积是clip_image014[4],映射后为clip_image016[6]。那么定义核函数(Kernel)为

    clip_image018[8]

    如今有了以上的概念。我们如今要计算K(x,z)仅仅要简单的计算clip_image020[10],然后计算clip_image022[10],在求出它们的内积。可是如今有一个问题,那是计算K(x,z)的时间复杂度是提高了。即使是clip_image020[10]计算也是非常复杂的。那如今怎么解决呢?

    如今我们如果:x,z都是n维。同一时候有

    clip_image028[4]

    展开


    发现我们能够仅仅计算原始特征x和z内积的平方(时间复杂度是O(n))。就等价与计算映射后特征的内积。也就是说我们不须要花clip_image026[7]时间了。

     

    如今看一下映射函数(n=3时)。依据上面的公式。得到

    clip_image031[4]

    也就是说核函数clip_image033[4]仅仅能在选择这种clip_image004[11]作为映射函数时才可以等价于映射后特征的内积。

    再看一个核函数

    clip_image034[4]

    相应的映射函数(n=3时)是

    clip_image035[4]

    更一般地,核函数clip_image037[4]相应的映射后特征维度为clip_image039[4]


    四、怎样映射到核函数
    如今介绍了核函数之后那究竟怎么来使用核函数到样本了?

    设超平面实际的方程是这个样子(圆心在 X2 轴上的一个正圆):

    a1X21+a2(X2c)2+a3=0

    因此我仅仅须要把它映射到 Z1=X21Z2=X22Z3=X2 这样一个三维空间中就可以,下图是映射之后的结果。将坐标轴经过适当的旋转。就能够非常明显地看出,数据是能够通过一个平面来分开的:



    如今让我们再回到 SVM 的情形。如果原始的数据时非线性的,我们通过一个映射 ϕ() 将其映射到一个高维空间中,数据变得线性可分了,这个时候。我们就能够使用原来的推导来进行计算,仅仅是全部的推导如今是在新的空间,而不是原始空间中进行。


    我们上一次得到的终于的分类函数是这种:



    如今则是在映射过后的空间,即:

    而当中的 α 也是通过求解例如以下 dual 问题而得到的:



    回到我们之前构造的一个五维的空间:
    到如今貌似我们还没实用到核函数。可是如今我们能够看出。数据映射到新空间后,由于新空间是多维的,计算量肯定是添加了不少了,如今就仅仅能用核函数来攻克了。


    最好还是还是从最開始的简单样例出发,设两个向量和  。而ϕ(*) 即是到前面说的五维空间的映射。

    五个坐标的值分别为 Z1=X1Z2=X21Z3=X2Z4=X22Z5=X1X2

    因此映射过后的内积为:


    依据我们之前简单介绍的核函数的实现,详细来说,上面这个式子的计算结果实际上映射了


    这样一来计算的问题就算攻克了。避开了直接在高维空间中进行计算。而结果却是等价的。


    五、高斯核函数

    再看另外一个核函数

    clip_image042[6]

    这时。假设x和z非常相近(clip_image044[6])。那么核函数值为1。假设x和z相差非常大(clip_image046[6]),那么核函数值约等于0。因为这个函数类似于高斯分布,因此称为高斯核函数,也叫做径向基函数(Radial Basis Function 简称RBF)。

    它可以把原始特征映射到无穷维。

    既然高斯核函数可以比較x和z的相似度。并映射到0到1。回忆logistic回归。sigmoid函数可以,因此还有sigmoid核函数等等。 

    注意。使用核函数后。怎么分类新来的样本呢?线性的时候我们使用SVM学习出w和b,新来样本x的话。我们使用clip_image050[8]来推断。假设值大于等于1,那么是正类,小于等于是负类。

    在两者之间。觉得无法确定。假设使用了核函数后,clip_image050[9]就变成了clip_image052[6],是否先要找到clip_image054[8],然后再预測?答案肯定不是了,找clip_image054[9]非常麻烦,回忆我们之前说过的

    clip_image055[4]

    仅仅需将clip_image057[4]替换成clip_image059[6],然后值的推断同上。

     

    总结:对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(*)

     。通过将数据映射到高维空间。来解决在原始空间中线性不可分的问题。因为核函数的优良品质,这种非线性扩展在计算量上并没有比原来复杂多少,这一点是很难得的。当然,这要归功于核方法——除了 SVM 之外。不论什么将计算表示为数据点的内积的方法,都能够使用核方法进行非线性扩展


    參考文档:( 基本的參考文档来自4个地方

    1、支持向量机: Kernel

    2、JerryLead关于核函数的解说

    3、 支持向量机通俗导论(理解SVM的三层境地

    4、斯坦福大学机器学习的公开课。


  • 相关阅读:
    [导入]mootools框架【二】Core篇: 主要方法测试实例
    公司招聘中不能说的秘密 【转载】
    国外10个ASP.Net C#下的开源CMS
    [导入][Flash开发笔记] List控件删除指定label或data的项
    [导入]用C#截取指定长度的中英文混合字符串 改进版
    今天小侄子出生,想了一天的名字
    一个正则表达式的解释
    今日小收获
    昨天的事
    两点东西
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6698536.html
Copyright © 2011-2022 走看看