• 沒有找到結果。

6 . 5 在复杂数据上应用核函数

在文檔中 关 于 封 面 (頁 109-115)

还可以继续检查其他数据分类结果的正确性

>>> d a t M a t [21* m a t (ws)+b m a t r i x ( [[ 2 . 3 0 4 3 6 3 3 6 ] ] )

>>> l a b e l A r r [2]

1.0

>>> d a t M a t [1]* m a t (ws)+b m a t r i x ( [[- 1 . 3 6 7 0 6 6 7 4 ] ] )

>>> l a b e l A r r [1]

-1 . 0

读者可将该结果与图

6-5

进行比较以确认其有效性。

我们现在可以成功训练出分类器了,我想指出的就是,这里两个类中的数据点分布在一条直 线的两边。看一下图

6-1

,大概就可以得到两类的分隔线形状。但 是 ,倘若两类数据点分别分布 在一个圆的内部和外部,那么会得到什么样的分类面呢?下一节将会介绍一种方法对分类器进行 修 改 ,以说明类别区域形状不同情况下的数据集分隔问题。

6 . 5 在复杂数据上应用核函数

考虑图

6-6

给 出 的数据 ,这有点像图

6

1

的方框

0

中的数据。前面我们用这类数据来描述非线 性可分的情况。显 而 易 见 ,在该数据中存在某种可以识别的模式。其中一个问题就是,我们能否 像线性情况一样,利用强大的工具来捕捉数据中的这种模式?显 然 ,答案是肯定的。接 下 来 ,我 们 就 要 使 用 一 种 称 为 核 函 数 (

k e m d )

的工具将数据转换成易于分类器理解的形式。本节首先解 释核函数的概念,并介绍它们在支持向量机中的使用方法。然 后 ,介绍一种称为径向基函数

( ™ — biasfunction)

的最流行的核函数。最 后 ,将该核函数应用于我们前面得到的分类器。

核方法中的非线性可分数据

1.5

,---^-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5

6 - 6

这个数据在二维平面中很难用一条直线分隔,不过很明显,这里存在分隔方形 点和圆形点的模式

106

6

章 支 持 向 量 机

6 . 5 . 1 利用核函数将数据映射到高维空间

在图

6-6

中 ,数据点处于一个圆中,人类的大脑能够意识到这一点。然 而 ,对于分类器而言,

它只能识别分类器的结果是大于

0

还是小于

0

。如果只在

1

和^轴构成的坐标系中插人直线进行分类 的 话 ,我们并不会得到理想的结果。我们或许可以对圆中的数据进行某种形式的转换,从而得到 某些新的变量来表示数据。在这种表示情况下,我们就更容易得到大于

0

或者小于

0

的测试结果。

在这个例子中,我们将数据从一个特征空间转换到另一个特征空间。在新空间下,我们可以很容 易利用巳有的工具对数据进行处理。数学家们喜欢将这个过程称之为从一个特征空间到另一个特 择空间的映射。在通常情况下,这种映射会将低维特征空间映射到高维空间。

这种从某个特征空间到另一个特征空间的映射是通过核函数来实现的。读者可以把核函数想 象 成 一 个 包 装 器 (

w m p p e r )

或 者 是 接 口 (

interface

) , 它能把数据从某个很难处理的形式转换成 为另一个较容易处理的形式。如果上述特征空间映射的说法听起来很让人迷糊的话,那么可以将 它想象成为另外一种距离计算的方法。前面我们提到过距离计算的方法。距离计算的方法有很多 种 ,不久我们也将看到,核函数一样具有多种类型。经过空间转换之后,我们可以在高维空间中 解决线性 问题 ,这也就等价于在低维空间中解决非线性问题。

呂胃优化中一个特别好巧地方就是,所有的运 算都可以 写成 内积 (丨

0 ^

0

如 叱 也 称 点 积 ) 的形式。向量的内积指的是

^

个 向量 相乘 ,之后得到单个标量或者数值。我们可以把内积运算替 换 成核 函数 ,而不必做简化处理。将内积替换成核函数的方式被称为核技巧(

kemeltrick

)或 者 核

变电

kemelsubstation

)。

.

核函数并不仅仅应用于支持向量机,很多其他的机器学习算法也都用到核函数。接 下 来 ,我 们将要来介绍一个流行的核函数,那就是径向基核函数。

6 . 5 . 2 径向基核函数

径向基函数是

S V M

中常用的一个核函数。径向基函数是一个采用向量作为自变量的函数,能 够基于向量距离运算输岀一个标量。这个距离可以是从

<0

0>

向量或者其他向量开始计算的距离。

接 下 来 ,我们将会使用到径向基函数的高斯版本,其具体公式为:

H

、 〔

- H 2]

A:(A:,^) = exp " 2 2a

其 中 ,

O"

是 用 户 定 义 的 用于 确定到达率(

reach)

或者说函数值跌落到

0

的速度参数。

上述高斯核函数将数据从其特征空间映射到更高维的空间,具体来说这里是映射到一个无穷 维的空间。关于无穷维空间,读者目前不需要太担心。高斯核函数只是一个常用的核函数,使用 者并不需要确切地理解数据到底是如何表现的,而且使用高斯核函数还会得到一个理想的结果。

在上面的例子中,数据点基本上都在一个圆内。对于这个例子,我们可以直接检查原始数据,并 意识到只要度量数据点到圆心的距离即可。然 而 ,如果碰到了一个不是这种形式的新数据集,那 么我们就会陷人困境。在该数据集上,使用高斯核函数可以得到很好的结果。当然,该函数也可 以用于许多其他的数据集,并且也能得到低错误率的结果。

6 . 5

在 复杂 数据 上 应用核 函数

107

1 0 8

6

章 支 持 向 量 机

最 后 ,如果遇到一个无法识别的元组,程序就会抛出异常,因为在这种情况下不希望程序再 继 续 运 行 ,这一点相当重要。

为了使用核函数,先期的两个函数

11!1^^(>

^ 1

巧 川 的 代 码 需 要 做 些 修 改 。修改的结果 参见程序清单

6-7

。本来我并不想这样列出代码,但是重新列出函数的所有代码需要超过

90

行 , 我想任何人都不希望这样。读者可以直接从下载的源码中复制代码段,而不必对修改片段进行手 工 输 人 。下面列出的就是修改的代码片段。

;程序清单6 - 7 使用核函数时需要对化的仏()&calcEk ( ) 函数进行的修改

i n n e r L ( ) :

e t a = 2.0 * o S . K [ i , j ] - oS.K [ i , i ] - oS.K [ j , j ]

bl = o S . b - Ei- o S .l a b e l M a t [i]* ( o S . a l p h a s [i]- a l p h a I o l d ) * o S .K [ i ,i] -\

o S .l a b e l M a t [j]* ( o S . a l p h a s [j]- a l p h a J o l d ) * o S .K [ i , j ] b 2 = o S . b - Ej- o S .l a b e l M a t [i]* ( o S . a l p h a s [i]- a l p h a I o l d ) * o S .K [ i , j ] -\

o S .l a b e l M a t [j]* ( o S .a l p h a s [ j ] - a l p h a J o l d ) * o S .K [ j, j ]

def c a l c E k ( o S , k ) :

f X k = f l o a t ( m u l t i p l y ( o S . a l p h a s , o S . l a b e l M a t ) . T * o S . K [ :,k] + oS.b) Ek = fXk - f l o a t (oS.l a b e l M a t [k])

r e t u r n Ek

你巳经了解了如何在训练过程中使用核函数,接下来我们就去了解如何在测试过程中使用核 函数。

6 . 5 . 3 在测试中使用核函数

接下来我们将构建一个对图

6-6

中的数据点进行有效分类的分类器,该分类器使用了径向基 核 函数。前面提到的径向基函数有一个用户定义的输人

<7

。首 先 ,我们需要确定它的大小,然后 利用该核函数构建出一个分类器。整个测试函数将如程序清单

6-8

所 示 。读者也可以打开一个文 本 编 辑 器 ,并且加入函数七

03

七处£()。

丨程序清单

6 - 8

利用核函数进行分类的径向基测试函数

d e f t e s t R b f ( k l = l .3) :

d a t a A r r , l a b e l A r r = l o a d D a t a S e t ( ' t e s t S e t R B F .t x t 1)

b , a l p h a s = s m o P ( d a t a A r r , l a b e l A r r , 200, 0.0001, 10000, ( 1r b f ', k l ) ) d a t M a t = m a t ( d a t a A r r ) ; l a b e l M a t = m a t ( l a b e l A r r ) . t r a n s p o s e { )

s v I n d = n o n z e r o ( a l p h a s . A > 0 ) [0]

sV^s=datMat [svInd] < — i

l a b e l S V = l a b e l M a t [svInd] ; ©构 建 支 持 向 量 矩 阵

p r i n t " t h e r e a r e % d S u p p o r t V e c t o r s " % s h a p e ( s V s ) [0]

110

6

章 支 持 向 量 机

.1 0 L---L.__________ I___________ I___________ I--- 1

---1.5 -1.0 -0.5 0.0 0.5 1.0 L 5

在文檔中 关 于 封 面 (頁 109-115)