码迷,mamicode.com
首页 > 其他好文 > 详细

支持向量机学习笔记--原理篇(二)

时间:2016-11-01 11:43:54      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:好处   1.2   elf   联想   this   sig   add   unicode   修改   

支持向量机学习笔记(二)

前言

在上一篇中,讲述了感知机是什么。接下来将叙述感知机的对偶形式,这在解决支持向量机问题中非常有用,因为直接求解存在困难时,我们往往会把它变换到其等价形式进行求解。这篇将继续上篇内容,把遗留的两个问题解释清楚。

感知机

感知机学习算法的对偶形式

现在考虑感知机学习算法的对偶形式。感知机学习算法的原始形式和对偶形式在支持向量机学习算法的原始形式和对偶形式相对应。

对偶形式的基本想法是,将wb表示为实例xi和标记yi的线性组合的形式,通过求解其系数而求得wb,不失一般性,在上篇所提出的算法中可假设初始值w0,b0均为0。对误分类点(xi,yi)通过

ww+ηyixi
bb+ηyi

逐步修改w,b设修改n次,则w,b关于(xi,yi)的增量分别是αiyixiαiyi,这里αi=niη.这样,从学习过程中不难看出,最后学习到的w,b可以分别表示为

w=i=1Nαiyixi
b=i=1Nαiyi

这里,αi0,i=1,2,...N,η=1时,表示第i个实例点由于误分而进行更新的次数。实例点更新次数越多,意味着它距离分离超平面越近,也就越难正确分类。换句话说,这样的实例对学习结果影响很大。

算法(感知学习算法的对偶形式)

输入:线性可分的数据集T={(x1,y1),(x2,y2),...,(xN,yN)},其中xiRn,yi{?1,+1};学习率η(0<η<1);
输出:α,b;感知机模型f(x)=sign(Nj=1αjyjxj?x+b).其中α=(α1,α2,...,αN)T.
(1) α0,b0
(2) 在训练集中选取数据(x_i,y_i)
(3) 如果yi(Nj=1αjyjxj?xi+b)0

αiαi+η
bb+ηyi

(4) 转至(2)直到没有误分类数据。

对偶形式中训练实例仅以内积的形式出现。为了方便,可以预先将训练集中实例间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵

G=[xi?xj]N×N

算法分析

总觉得,了解到这缺了点什么。我们无法直观的看出任何含义,改变αi,具体改变哪几个αi呢?至少,我在看了上述对偶形式的解法后,虽然知道对偶形式的推导过程,却始终无法直观的理解对偶形式的好处是什么?为何需要对偶形式来求解问题,毕竟是一个学习的过程,慢慢分析,慢慢领悟吧。我先把它用数学的方式表达出来,让这种算法更加直观,或许对后续理解支持向量机有所帮助。

参看算法步骤3.

yi(j=1Nαjyjxj?xi+b)0

假设xi为N维的特征向量,因此这里的xi表述的还不是很正确,实际的xi=(xi1,xi2,...,xiN),i表示为第i个数据。假设有M个数据,则i=1,2,...,M,因此,输入矩阵X可以表示为:
X=???????x11x21?xM1x12x22?xM2????x1Nx2N?xMN???????

为了方便表示xi?xTi的内积,我们记作X1=(x11,x12,...,x1N),由此根据步骤3.式得:
G′′=αjyjxj?xi+b=?????????? α1?y1?X1?XT1α2?y2?X2?XT1?αM?yM?XM?XT1bα1?y1?X1?XT2α2?y2?X2?XT2?αM?yM?XM?XT2b?????α1?y1?X1?XTMα2?y2?X2?XTM?αM?yM?XM?XTMb??????????

为了满足式3.
yi(j=1Nαjyjxj?xi+b)0

从矩阵G′′来看,便要找到对应的α1,α2,...αM使得G′′矩阵中的每一列相加所得的和sum?yi0,i表示G中第i列。(唉,分析到这还是没有找到有意思的结论,有时间研读下矩阵分析,现在继续往下走走吧。)

但不管如何,我们能看出步骤3.式是为了寻找各α系数,让G′′符合条件即可,而各系数在矩阵中能够直观的表示出来。遗留一个算法问题,按什么样的顺序更新α能够使得G′′中的每一列符合判别式。

Code Time

本训练集采用与前文相同的数据集。

训练集:training.data

第一列和第二列分别是特征向量x的第一维,第二维,对应的输出空间y为第三列。

3.542485  1.977398  -1
3.018896  2.556416  -1
7.551510  -1.580030 1
2.114999  -0.004466 -1
8.127113  1.274372  1
7.108772  -0.986906 1
8.610639  2.046708  1
2.326297  0.265213  -1
3.634009  1.730537  -1
0.341367  -0.894998 -1

对偶形式的初始化代码与基本感知机算法相一致。只是比之多了createGram()方法:

if __name__ == "__main__":
    if len(sys.argv) !=4:
        print "Usage: python duality.py eta trainFile modelFile"
        exit(0)
    eta =float(sys.argv[1])
    trainFile = file(sys.argv[2])
    modelFile = file(sys.argv[3],‘w‘)
    lens =0
    for line in trainFile:
        chunk =line.strip().split(‘ ‘)
        lens = len(chunk) -1
        temp_all =[]
        tmp =[]
        for i in range(1,lens+1):
            tmp.append(float(chunk[i]))
        temp_all.append(tmp)
        temp_all.append(int(chunk[0]))
        training_set.append(temp_all) #初始化training_set
    trainFile.close()
    #生成Gram矩阵,和我们自己定义的G‘‘矩阵半斤八两
    createGram()

    for i in range(len(training_set)):
        a.append(0)#初始化alpha
    for i in range(lens):
        w.append(0)#初始化w
    for i in range(1000):
        check()#这里的作用便是检查我们的G‘‘矩阵的每一列是否符合条件
    print "The training_set is not linear separable. "

计算某两个向量内积:

def calInnerProduct(i,j):
    global lens
    res =0
    for p in range(lens):
        res += training_set[i][0][p] * training_set[j][0][p]
        #p是每个向量的纬度,从1到N变换,当然代码里从0开始到N-1
        #i和j分别表示在M个输入集中,第i个向量和第j个向量
    return res

向量相加与系数相乘:

def AddVector(vec1,vec2):
    for i in range(len(vec1)):
        vec1[i] =vec1[i]+vec2[i]
    return vec1

def NumProduct(num,vec):
    for i in range(len(vec)):
        vec[i] *=num
    return vec

生成Gram矩阵:

def createGram():
    #思路非常清晰,len求出训练集的M大小
    #外层遍历行,内层遍历列,求出的结果append到Gram中去
    global lens
    for i in range(len(training_set)):
        tmp = []
        for j in range(0,len(training_set)):
            tmp.append(calInnerProduct(i,j))
        Gram.append(tmp)

更新w,b

def update(k):
    #注意此处的更新,更新的是alpha和b,在G‘‘矩阵中更新的是第k行的alpha
    global a,b,eta
    a[k] +=eta
    b = b+eta*training_set[k][1]

步骤3式yiNj=1αjyjxj?xi+b计算:

def cal(k):
    #结合G‘‘矩阵,这段代码就非常容易阅读,但此处的K与上述更新的k并不表示一个含义,在G‘‘中,表示对第k列做相关操作
    global a,b
    res =0
    for i in range(len(training_set)):
        #针对第k列,对该列进行累加
        res += a[i]*int(training_set[i][1])*Gram[i][k]
    res +=b
    res *=training_set[k][1]
    return res

判别式

yi(j=1Nαjyjxj?xi+b)0
判断:

def check():
    global w,a
    flag = False
    for i in range(len(training_set)):
        #对G‘‘矩阵中的每一列做判断,这里值得注意的是,某一列不符合条件,就更新对应该行的alpha和b,即i=j所在的alpha和b
        if cal(i) <= 0:
            flag = True
            update(i)
    #直到所有列满足判别式后,flag为False不做更新,只要在符合迭代次数求出结果即可。
    if not flag:
        for i in range(len(training_set)):
            w = AddVector(w,NumProduct(a[i]*int(training_set[i][1]),training_set[i][0]))
        print "RESULT: w:",w,"b:",b
        tmp =‘‘
        for keys in w:
            tmp+=str(keys)+‘ ‘
        tmp = tmp.strip()
        modelFile.write(tmp+‘\n‘)
        modelFile.write(str(b)+‘\n‘)
        modelFile.write(str(lens)+‘\n‘)
        modelFile.write(str(eta)+‘\n‘)
        modelFile.close()
        os._exit(0)
    flag = False

根据实际的算法,我们再来看看我们定义的G′′

G′′=?????????? α1?y1?X1?XT1α2?y2?X2?XT1?αM?yM?XM?XT1bα1?y1?X1?XT2α2?y2?X2?XT2?αM?yM?XM?XT2b?????α1?y1?X1?XTNα2?y2?X2?XTN?αM?yM?XM?XTNb??????????

初始化时,G′′中的每一个元素均为0,但注意Gram矩阵的元素是各向量的内积,由于α,b=0,所以导致G′′中的元素均为0。因此做第一次check时,每一列都不符合判别式,忽略b的更新,check扫描一遍后,更新的是G′′对角线上的αi。进行第二次check时,假设第一列符合判别式,其基础条件便是针对向量XT1,我已经正确分类了,那么就无需更新α1的值,其他的系数也就不会在check扫描第一列时更新。其中当check扫描到第k列时,并不符合判别式,那么针对向量XTk自然需要更新αk,从而让该向量符合判别式。对check进行n次迭代后,如果是线性可分的,我们总能找到这样的w,b使得对数据集进行二元划分。

上述内容是我所学感知机的全部内容,目前所能理解的也就是这个层次。有任何疑问或者对我的推导有质疑的,欢迎留言,一起探讨。

感知机只是针对监督学习,二元分类的小怪,真正的大怪要登场了,它是什么样子的呢?我们立马走进来看看。

支持向量机

支持向量机概念

书本《统计学习方法》定义为:支持向量机(support vector machine,SVM)是一种二类分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机(第一个特征来了!间隔最大化);支持向量机还包括核技巧,这使它成为实质上的非线性分类器。(第二个特征,解决线性不可分问题)。支持向量机的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。支持向量机的学习算法是求解凸二次规划的最优算法。

思考

1.间隔最大化,是什么东西?好抽象,看图秒懂。
2.核技巧?解决线性不可分问题?公式推导来,咱们立马给你推。
3.凸二次规划的问题,合页的损失函数最小问题。。。推荐《算法导论》中关于线性规划的章节,还不够,那就请看Convex Optimization Overview.

凸二次规划,可以这样理解,一个函数可以存在极值,但存在极值的函数在某一个局部的极值不一定是函数的极值,为什么要叫定义一个凸函数呢,因为凸函数的极值是唯一的,从局部求解出的极值问题就能代表该凸函数的极值。

支持向量机学习方法包含构建由简至繁的模型:线性可分支持向量机(linear support vector machine in linearly separable case)、线性支持向量机(linear support vector machine)及非线性支持向量机(non-linear support vector machine)。简单模型是复杂模型的基础,也是复杂模型的特殊情况。当训练数据线性可分时,通过硬间隔最大化(hard margin maximization),学习一个线性的分类器,即线性可分支持向量机,又称为硬间隔支持向量机;当训练数据近似线性可分时,通过软间隔最大化(soft margin maximization),也学习一个线性的分类器,即线性支持向量机,又称为软间隔支持向量机;当训练数据线性不可分时,通过使用核技巧 (kernel trick)及软间隔最大化,学习非线性支持向量机。

本文呈现思路历程如下:叙述线性可分支持向量机,理解间隔最大化几何含义。线性支持向量机,区分硬间隔与软间隔。非线性支持向量,理解核函数推导由来。支持向量机对偶问题,理解对偶形式的求解。序列最小最优化SMO算法,带你进入凸二次规划算法中。

线性可分支持向量机与硬间隔最大化

硬间隔最大化

直接上图,感知机解决线性可分时,我们用的图为:
技术分享
支持向量机解决线性可分问题时,我们用的图为:
技术分享
两幅图对比中能够直观的看出支持向量机与感知机最大的区别,感知机只需要找到一条直线把两类数据进行分割即可,但支持向量机光找到这条直线还不够,它还需要在众多直线中找寻一条符合间隔最大化的直线,作为分割线。

看图易理解,但如果没有形式化的东西,往往很难针对支持向量机设计出有效的算法来对问题进行求解,我们必须借助数学工具来对这样的问题进行建模,回归书本,咱们来看看支持向量机对该直线是如何定义的。

假设给定一个特征空间上的训练数据集

T={(x1,y1),(x2,y2),...,(xN,yN)}

其中,xiX=Rn,yiY={+1,?1},i=1,2,...,N,xi为第i个特征向量,也称为实例,yixi的类标记,当yi=+1时,称xi为正例;当yi=?1时,称xi为负例,(xi,yi)称为样本点。在假设训练集是线性可分的。

一般地,当训练数据集线性可分时,存在无穷个分离超平面可将两类数据正确分开。感知机利用误分类最小的策略,求得分离超平面,不过这时的解有无穷多个。线性可分支持向量机利用间隔最大化求最优分离超平面,这时,解释唯一的。

数学定义:给定线性可分训练数据集,通过间隔最大化或等价地求解相应的凸二次规划问题学习得到的分离超平面为

w??x+b?=0

以及相应的分类决策函数
f(x)=sign(w??x+b?)

这里与感知机唯一不同的地方便是w,b为唯一解,用w?,b?表示。但针对函数间隔,我们显然没有把它表征出来,不急,继续往下走。

函数间隔和几何间隔

继续看图:
技术分享
如图所示的二维特征空间中的分类问题。图中小圆圈表示正例,小叉叉表示负例。训练数据集线性可分,这时有许多直线能将两类数据正确划分。线性可分支持向量对应着将两类数据正确划分并且间隔最大的直线。

在上图中,有A、B、 C三个点,表示3个实例,均在分离超平面的正类一侧,预测它们的类。点A距分离超平面较远,若预测该点为正类,就比较确信预测是正确的;点C距分离超平面较近,若预测该点为正类就不那么确信;点B介于点A与C之间,预测其为正类的确信度也在A与C之间。

一般来说,一个点距离分离超平面的远近可以表示分类预测的确信程度。在超平面w??x+b?=0确定的情况下,|w??x+b?|能够相对地表示点x距离超平面的远近。而w??x+b? 的符号与类标记y的符号是否一致能够表示分类是否正确。所以可用量yi(w??xi+b?)来表示分类的正确性及确信度,这就是函数间隔(functional margin)的概念。

函数间隔并非实际的某个误分类点到直线的距离,但却能同等的表示点距离直线的确信度。

定义函数间隔:对于给定的训练数据集T和超平面(w,b),定义超平面(w,b)关于样本点(xi,yi)的函数间隔为

γ^i=yi(w?xi+b)

每个点距离直线都有一个值,那么我们便能找到某个点使得距离直线的距离为最小,即
γ^=mini=1,...,Nγ^i

函数间隔可以表示分类预测的正确性及确信度。但选择分离超平面时,只有函数间隔还不够。因为只要成比例地改变wb,例如将它们改为2w2b,超平面并没有改变,但函数的间隔却成为原来的2倍。这一事实启示我们,可以对分离超平面的法向量w加某些约束,如规范化,w=1,使得函数间隔是确定的。这时函数间隔成为几何间隔。

我一直觉得函数间隔是件神奇的事情,尝试着去理解它的存在,但把它放入坐标轴后,却始终理解不了。举个例子:当w2w,b2b时,对于2wx+2b=0函数在坐标轴上的位置始终不变,但所有的点到直线2wx+2b的距离却增加了原来的两倍。继续带入坐标轴,到直线的距离变化反映到了x坐标的变化上。因此,约束w实则影响的是特征向量在欧式空间上的变化。这样我们便能理解说,不管w受到什么样的限制,都投射到点x上,且各点x为同比例变化,不影响分类结果。

继续看图:
技术分享
上图给出了超平面(w,b)及其法向量w.点x表示某一实例xi,其类标记yi=?1,点x与超平面(w,b)的距离由线段γ给出:

γi=?(ww?xi+bw)

其中,wwL2范数。这是点x在超平面负的一侧的情形。如果点x在超平面正的一侧,即yi=+1,那么点与超平面的距离为
γi=ww?xi+bw

上述两个式子,便是初中学习过的点到直线的距离公式,但稍微有点区别,因为γ增加了yi,因此能够表达除了距离超平面的距离之外,还能表达处在超平面的上方还是下方。更一般地,点xi与超平面(w,b)的距离是
γi=yi(ww?xi+bw)

同样的该式便是几何间隔。参照函数间隔最小值,同样我们定义γ为几何间隔最小值,即
γ=mini=1,...,Nγi

这里在理解书本上w=1是个坑,定义几何间隔中w并不一定是1,而它的含义在于w=ww=1.

数学中,我们在形式上表征了点到超平面的间隔,且能根据符号判断是否是误分类点了,这归功于神奇的yi的取值{?1,+1},看到这里,我们便能理解为什么yi在分类问题上取1和-1而不是1和0,或者其他。

间隔最大化

从前面的分析中我们能够明显的发现函数间隔与几何间隔相差一个w的缩放因子。

支持向量机学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。对线性可分的训练数据集而言,线性可分分离超平面有无穷多个(等价于感知机),但是几何间隔最大的分离超平面是唯一的。这里的间隔最大化又称为硬间隔最大化(与将要讨论的训练数据集近似线性可分时的软间隔最大化相对应)。

间隔最大化的直观解释是:对训练数据集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据进行分类。也就是说,不仅将正负实例点分开,而且对最难分的实例点(离超平面最近的点)也有足够大的确信度将它们分开。这样的超平面应该对未知的新实例有很好的分类预测能力。

1.最大间隔分离超平面
下面考虑如何求得一个几何间隔最大的分离超平面(为什么不能用函数间隔来求得函数间隔最大的分离超平面?),即最大间隔分离超平面。具体地,这个问题可以表示为下面的约束最优化问题:

maxw,bγ

s.t. yi(ww?xi+bw)γ,i=1,2,...N

这个式子很有趣,γ已经代表了所有点的最小值了,还要找到一个超平面,使得γ最大,什么鬼,其实可以这样理解,我们先找到一个超平面(w0,b0),再找靠近超平面(w0,b0)最近的若干个点,求出这些点距离该超平面的γ(w0,b0).明显地,γ随着w,b的取值而改变,因此每次更新w,b,找到其中几何间隔最大即可。约束条件是为了寻找距超平面最近的若干点来求γ而已。

考虑几何间隔和函数间隔的关系式γ=γ^w,可将这个问题改写为:

maxw,bγ^w

s.t. yi(w?xi+b)γ^,i=1,2,...N

好不容易定了几何间隔,却又从几何间隔转变成了函数间隔。而针对最优化问题,也是利用函数间隔来做下一步推导,为何需要多此一举呢!

个人觉得,单纯的几何间隔可以表示为γ=yi1w(w?xi+b),如果不对其进行展开,我们就被w,b的原始值给限制住了。这里几何间隔可以由两部分决定,函数间隔和w,所以对函数间隔做约束,在保证几何间隔不变的情况下,必然会影响w的值。但在几何空间,超平面的位置不会发生变化,输入空间亦不会发生变化。

这样我们就可以取γ^=1代入上面的最优化问题,最大化1w可以等价为最小化12w2,于是就得到下面的线性可分支持向量机学习的最优化问题

minw,b12w2

s.t. yi(w?xi+b)1,i=1,2,...N

上述分析完成了对支持向量机的建模,实际就是把它形式化为一个凸二次规划问题。凸优化问题是指约束最优化问题

minwf(w)

s.t. gi(w)0,i=1,2,...khi(w)=0,i=1,2,...,l

其中,目标函数f(w)和约束函数gi(w)都是Rn上的连续可微的凸函数,约束函数hi(w)Rn的仿射函数。

综上所述,就有下面的线性可分支持向量机的学习算法——最大间隔法
算法(线性可分支持向量机学习算法——最大间隔法)

输入:线性可分训练数据集

T={(x1,y1),(x2,y2),...,(xN,yN)}
其中,xiX=Rn,yiY={?1,+1},i=1,2,...N
输出:最大间隔分离超平面和分类决策函数
(1) 构造并求解约束最优化问题:
minw,b12w2

s.t. yi(w?xi+b)1,i=1,2,...N

求得最优解w?,b?.
(2) 由此得到分离超平面:
w??x+b?=0

分类决策函数
f(x)=sign(w??x+b?)

2.支持向量和间隔边界
在线性可分情况下,训练数据集的样本点中与分离超平面距离最近的样本点的实例称为支持向量。支持向量是约束条件式等号成立的点,即

yi(w?xi+b)?1=0

yi=+1的正例点,支持向量在超平面上
H1:w?x+b=1

yi=?1的负例点,支持向量在超平面上
H2:w?x+b=?1

看图说话:
技术分享
在决定分离超平面时只有支持向量起作用,而其他实例点并不起作用。如果移动支持向量将改变所求的解;但是如果在间隔边界以外移动其他实例点,甚至去掉这些点,则解是不会改变的。由于支持向量在确定分离超平面中起着决定性作用,所以将这种分类模型称为支持向量机。支持向量的个数一般很少,所以支持向量机由很少的“重要的”训练样本确定。

学习的对偶算法

为了求解线性可分支持向量机的最优化问题,将它作为原始最优化问题,应用拉格朗日对偶性,通过求解对偶问题(dual problem)得到原始问题(primal problem)的最优解,这就是线性可分支持向量机的对偶算法(dual algorithm)。这样做的优点,一是对偶问题往往更容易求解;二是自然引入核函数,进而推广到非线性分类问题。

首先构建拉格朗日函数,为此,对每一个不等式约束引进拉格朗日乘子αi0,i=1,2,...N,定义拉格朗日函数:

L(w,b,α)=12w2?i=1Nαiyi(w?xi+b)+i=1Nαi

其中,α=(α1,α2,...,αN)T为拉格朗日乘子向量。
根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题:
maxαminw,bL(w,b,α)

上述式子可以转化为:
minw,bmaxαL(w,b,α)

简单说一下为何求解上式的极小极大值便是我们这里关于间隔最大化的最优问题。拉格朗日式子实际表达式应该为:
L(w,b,α)=12w2?i=1Nαi[yi(w?xi+b)?1]

我们令:
θ(w)=maxαi0L(w,b,α)

当数据集中的点,并没有满足约束条件时,即yi(w?xi+b)?1<0.因此,当αi=,显然有θ(w)=,这里我们要所有的点满足约束条件,所以maxαi0L(w,b,α)的结果便使得所有的αi=0,即θ(w)=12w2.因此,间隔最大化最优问题,可以完全等价于求解minw,bmaxαL(w,b,α)极值问题。

(1)求minw,bL(w,b,α)

?wL(w,b,α)=w?i=1Nαiyixi=0

?bL(w,b,α)=i=1Nαiyi=0

将上述式子代入拉格朗日函数,即得:
L(w,b,α)=?12i=1Nj=1Nαiαjyiyj(xi?xj)+i=1Nαi

(2)求maxαL(w,b,α),即是对偶问题
maxα(?12i=1Nj=1Nαiαjyiyj(xi?xj)+i=1Nαi)

s.t. i=1Nαiyi=0

αi0,i=1,2,...N

关于支持向量机对偶问题的相关证明可以参看博文《支持向量机通俗导论-理解SVM三重境界》之第二重。

这里假设我们求出了所有的αi系数,我们直接给出结论:

w?=i=1Nα?iyixi

b?=yj?i=1Nα?iyi(xi?xj)

疑问:为何能够直接推出b?的计算公式,书P105有证。

综上所述,对于给定的线性可分训练数据集,可以首先求对偶问题的解α?;再利用上式求得原始问题的解w?,b?;从而得到分离超平面及分类决策函数。这种算法称为线性可分支持向量机的对偶学习算法,是线性可分支持向量机学习的基本算法。

算法(线性可分支持向量机学习算法)

输入:线性可分训练数据集

T={(x1,y1),(x2,y2),...,(xN,yN)}
其中,xiX=Rn,yiY={?1,+1},i=1,2,...N
输出:分离超平面和分类决策函数
(1) 构造并求解约束最优化问题:
minαi(12i=1Nj=1Nαiαjyiyj(xi?xj)?i=1Nαi)

s.t. i=1Nαiyi=0

αi0,i=1,2,...N

求得最优解α?=(α?1,α?2,...,α?N)T
(2) 计算:
w?=i=1Nα?iyixi

并选择α?的一个正分量α?j>0,计算
b?=yj?i=1Nα?iyi(xi?xj)

(3) 求得分离超平面
w??x+b?=0

分类决策函数
f(x)=sign(w??x+b?)

拉格朗日函数的引入,使得求解原始最优化问题,变成求解其对偶形式,对偶形式的具体求解可以采用SMO算法,这将在后续章节中进一步阐述。

线性支持向量机与软间隔最大化

线性支持向量机

线性可分支持向量机必须满足线性可分,但当且仅当个别数据不满足线性不可分条件时,线性可分支持向量机变得不能够适用显然条件有点苛刻。因此,我们引入了软间隔最大化,让它扩展到线性不可分的问题。

假设给定一个特征空间上的训练数据集

T={(x1,y1),(x2,y2),...,(xN,yN)}

其中,xiX=Rn,yiY={?1,+1},i=1,2,...,N,xi为第i个特征向量,yixi的类标记。再假设训练数据集不是线性可分的。通常情况是,训练数据中有一些特异点,将这些特异点除去后,剩下大部分的样本点组成的集合是线性可分的。
技术分享
上图中在间隔中间有几个点,便是我们所指的特异点,具体该如何对它做算法描述,咱们进一步来分析。

线性不可分意味着某些样本点(xi,yi)不能满足函数间隔大于1的约束条件。为了解决这个问题,可以对每个样本点(xi,yi)引进一个松弛变量ζi0,使函数间隔加上松弛变量大于等于1。这样,约束条件变为

yi(w?xi+b)1?ζi

同时,对每个松弛变量ζi,支付一个代价ζi。目标函数由原来的12w2变成
12w2+Ci=1Nζi

疑问:约束条件变得更加严格了,即针对每一个点,距离超平面的间隔变窄,但从上图可以看出,计算过程还是按照1w来找到支持向量,并求得超平面,只是在求得的超平面中增加了几个特异点。约束条件的限制如何影响算法的求解过程呢?

这里C>0称为惩罚系数,最小化目标函数如今包含了两层含义:使12w2尽量小即间隔尽量大,同时使误分类点的个数尽量小,C是调和二者的系数。

有了上面的思路,可以和训练数据集线性可分时一样来考虑训练数据集线性不可分时的线性支持向量机学习问题。相应于硬间隔最大化,它称为软间隔最大化。

线性不分分的线性支持向量机的学习问题变成如下凸二次规划问题:

minw,b,ζ12w2+Ci=1Nζi

s.t. yi(w?xi+b)1?ζi,i=1,2,...N

ζi0,i=1,2,...,N

同理有线性支持向量机的定义。
定义(线性支持向量机)对于给定的线性不可分的训练数据集,通过求解凸二次规划问题,即软间隔最大化问题,得到的分离超平面为

w??x+b?=0

以及相应的分类决策函数
f(x)=sign(w??x+b?)

称为线性支持向量机。

学习的对偶算法

同理,根据目标函数和约束条件我们构造的拉格朗日函数为:

L(w,b,ζ,α,μ)=12w2+Ci=1Nζi?i=1Nαi[yi(w?xi+b)?1+ζi]?i=1Nμiζi

约束条件被有机的融合进拉格朗日函数中,当满足所有的约束条件时,对拉格朗日函数求参数μi,αi关于该函数的极大值,便可以进一步对拉格朗日函数求参数w,b关于该函数的极小值,即等价于我们线性支持向量机求解凸二次规划问题。用式子表述为:
minw,b,ζmaxαi,μiL(w,b,ζ,α,μ)

分析方法和前面一样,转换为另一个问题之后,我们先让针对w,bζ最小化:
?wL(w,b,ζ,α,μ)=w?i=1Nαiyixi=0

?bL(w,b,ζ,α,μ)=i=1Nαiyi=0

?ζiL(w,b,ζ,α,μ)=C?αi?μi=0

将上述三式代入拉格朗日函数得

minw,b,ζL(w,b,ζ,α,μ)=?12i=1Nj=1Nαiαjyiyj(xi?xj)+i=1Nαi

再对minw,b,ζL(w,b,ζ,α,μ)α的极大,即得对偶问题:
maxα(?12i=1Nj=1Nαiαjyiyj(xi?xj)+i=1Nαi)

s.t. i=1Nαiyi=0

C?αi?μi=0

αi0

μi0,i=1,2,...N

将对偶最优化问题进行变换:利用等式约束消去μi,从而只留下变量αi,并将约束写成
0αiC

再将对目标函数求极大转换为极小,于是得到对偶问题。可以通过求解对偶问题而得到原始问题的解,进而确定分离超平面和决策函数。为此,就可以定理的形式叙述原始问题的最优解和对偶问题的最优解的关系。

综合前面的结果,有下面的算法。
算法(线性支持向量机学习算法)

输入:线性可分训练数据集

T={(x1,y1),(x2,y2),...,(xN,yN)}
其中,xiX=Rn,yiY={?1,+1},i=1,2,...N
输出:分离超平面和分类决策函数
(1) 构造并求解约束最优化问题:
minαi(12i=1Nj=1Nαiαjyiyj(xi?xj)?i=1Nαi)

s.t. i=1Nαiyi=0

0αiC,i=1,2,...N

求得最优解α?=(α?1,α?2,...,α?N)T
(2) 计算:
w?=i=1Nα?iyixi

并选择α?的一个正分量α?j>0,计算
b?=yj?i=1Nα?iyi(xi?xj)

(3) 求得分离超平面
w??x+b?=0

分类决策函数
f(x)=sign(w??x+b?)

线性支持向量机学习算法与线性可分支持向量机学习算法的区别仅在于对αi做了上限的约束。(但这上限的约束却能够支持特异点的存在,这种数学形式上的表达,如何反映在几何当中呢?)

支持向量

在线性不可分的情况下,将对偶问题的解α?=(α?1,α?2,...,α?N)T中对应于α?i>0的样本点(xi,yi)的实例xi称为支持向量(软间隔的支持向量)。如下图所示,这时的支持向量要比线性可分时的情况复杂一些。图中,分离超平面由实线表示,间隔边界由虚线表示,正例点由小圆圈表示,负例点由小叉叉表示。
技术分享
软间隔的支持向量xi或者在间隔边界上,或者在间隔边界与分离超平面之间,或者在分离超平面误分一侧。若α?i<C,则ζi=0,支持向量xi恰好落在间隔边界上;若α?i=C,0<ζi<1,则分类正确,xi在间隔边界与分离超平面之间;α?i=C,ζi=1,则xi在分离超平面上;若α?i=C,ζi>1,则xi位于分离超平面误分一侧。

针对上述疑问:有了些自己的理解,简单叙述下。为什么同样的最小化目标函数,只是简单的规定了αi的上限,就能够让支持向量机容忍一些特异点。书中针对定理7.3做的证明中,有一条式子为:

α?i(yi(w??xi+b?)?1+ζ?i)=0

假设我们把函数间距改为1?ζ?i,每个点都有自己的容忍误差,我们取其中的最小值,记作ζ=min{1?ζ?i},其中,假设ζ>0(对不可分情况暂时不去形象化讨论),因此,当C=0的情况下,目标函数即为:
minw,b12w2

这与解决线性可分支持向量机的解法相一致,只是对函数间隔做了约束,并非原来的1,至于为什么可以改变函数间隔的大小而不影响求解结果,在上文中有所阐述,这里不再重复。

目标函数确定完毕后,以相同的算法,我们必然能够求出符合线性可分的一些超平面解w?,b?,而且该超平面的支持向量满足如下关系式:H1:w??xi+b?=ζ,H2:w??xi+b?=?ζ,w?=Ni=1α?iyixi。注意w?α?i存在着正相关的关系。而在实际求解目标函数时,我们加入了惩罚因子C,因此目标函数为:

minw,b,ζ12w2+Ci=1Nζi

这里当化简为拉格朗日函数的对偶形式时,αi增加了上限C。因此,我们大胆的假设针对前一个目标函数求出来的α?=(α?1,α?2,...,α?N)T中,?i,使得αi>C,当加上惩罚因子后,原α?=(α?1,α?2,...,α?N)T,大于C的值全被替换成更小的C,记作α?因此得到α?>α?,从而使得w?变小,导致几何间隔增大。这也就解释了为什么α加了上限,同样的目标函数,能够让支持向量机容忍一些特异点。

非线性支持向量机与核函数

对解线性分类问题,线性分类支持向量机是一种非常有效的方法。但是,有时分类问题是非线性的,这时可以使用非线性支持向量机。本节叙述非线性支持向量机,其主要特点是利用核技巧。为此,先要介绍核技巧。核技巧不仅应用于支持向量机,而且应用于其他统计学习问题。

核技巧

1.非线性分类问题
先来抛开繁琐的定义,直接上图,非线性分类问题的本质在于,把低维不可分数据映射到高维可分,从而能够使用线性支持向量机来求解问题。而这一映射函数,便是我们所谓的核技巧。
技术分享
如上图所示,针对在二维平面无法用超平面去分离两类数据,但通过某种映射表达式,我们便有了三维的数据点,而此时此刻,便可以应用线性支持向量机来求解这分离超平面了。如何从二维变成三维呢?往往我们有两种解决方案:对数据增加新的特征,尝试着是否能够根据新加入的特征,在n+1维上对数据进行分离;当寻找特征相对困难时,我们可以利用核技巧,寻找一枚映射函数,即利用原有的特征生成新的特征。从而构造出n+m,m0来实现分离超平面。

回归数学,针对上图二维问题,设原空间为

X?R2,x=(x(1),x(2))TX,

新空间为
Z?R2,z=(z(1),z(2))TZ,

定义从原空间到新空间的变化(映射):
z=?(x)=((x(1))2,(x(2))2)T

经过变换z=?(x),原空间X?R2变化为新空间Z?R2,原空间中的点响应地变换为新空间中的点,原空间中的椭圆
w1(x(1))2+w2(x(2))2+b=0

变换成为新空间中的直线
w1z(1)+w2z(2)+b=0

在变换后的新空间里,直线w1z(1)+w2z(2)+b=0可以将变换后的正负实例点正确分开。这样,原空间的非线性可分问题就变成了新空间的线性可分问题。

核技巧应用到支持向量机,其基本想法就是通过一个非线性变换将输入空间(欧式空间R^nRn或离散集合)对应于一个特征空间(希尔伯特空间\mathcal HH),使得在输入空间Rn中的超曲面模型对应于特征空间H中的超平面模型(支持向量机),这样,分类问题的学习任务通过在特征空间中求解线性支持向量机就可以完成。

2.核函数的定义
定义:设X是输入空间(欧式空间Rn或离散集合),又设H为特征空间(希尔伯特空间),如果存在一个从XH的映射

?(x)=XH

使得对所有x,zX,函数K(x,z)满足条件
K(x,z)=?(x)??(z)

则称K(x,z)为核函数,?(x)为映射函数,式中?(x)??(z)?(x)?(z)的内积。

个人第一次看这定义时,并没有搞明白来龙去脉,感觉书本上的定义放得太早,让人无法理解做这定义的目的是什么。暂且不分析,继续往下走走。

3.核技巧在支持向量机中的应用
我们沿用在核函数定义中的映射?,如果用原始的方法,那么在用线性学习器学习一个非线性关系,需要选择一个非线性特征集,并且将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器,因此,考虑的假设集是这种类型的函数:

f(x)=w??(x)+b

由于这里对所有的输入空间的数据集做了映射,因此,对偶问题的目标函数成为:
W(α)=12i=1Nj=1Nαiαjyiyj??(xi)??(xj)??i=1Nαi

其中?x?y?表示向量x和向量y的内积。
同样,分类决策函数中的内积也可以用核函数替代,而分类决策函数式成为
f(x)=sign(i=1Nsα?iyi?(xi)??(x)+b?)

上述写法有一缺点,映射函数好找,但想要从低维变换至高维需要对每个数据集中的点进行一次计算,且不说计算的效率如何,假设特征变换到无穷维这种极端情况时,直接由x映射到特征空间H成为了不可能,因此我们需要能够找到这样的函数,能够表达对两个点进行直接的函数K(xi,xj)=?(xi)??(xj)

在博文《支持向量机通俗导论-理解SVM三重境界》二重境界的2.2.2中,讲述了关于寻找核函数的全过程,非常简明清晰,具体的内容可以参考如下。本人秉持着学习的态度,重新按照自己的思路梳理一遍。

技术分享
在对这些数据分类时,我们已知了每个点的向量x=(x1,x2),单纯的利用线性关系是无法求解的,即w1x1+w2x2+b=0,无法利用直线将这些数据分离开来。中学我们学过,椭圆曲线,我们是如何做的呢,其实很简单,我们只要找到椭圆最一般的表达式,就能从理论上把数据集进行分类。即a1(x1?x01)2+a2(x2?x02)2+b=0,整理后可以得到如下表达式:

w1x1+w2x2+w3x21+w4x22+w5x1x2+b=0

从这个式子中就可以看出,输入空间二维向量变成了特征空间中的五维向量。按部就班,我们有了线性支持向量机的算法求解,我们只需要依次令z1=x1,z2=x2,z3=x21,z4=x22,z5=x1x2,把所有输入数据集,变换成如上形式,就能代入求解了。即映射?(x)=(x1,x2,x21,x22,x1x2)

这里我们实际并没有用到核函数,因为我们还是单独的把它们进行变换后,再求向量积。那该如何找到这样的核函数呢?

寻找核函数有公的,怎么可以没有母的呢,构造核函数,需要再来一向量,为了便于区分该向量为a=(a1,a2),经过映射?后,变为:

w1a1+w2a2+w3a21+w4a22+w5a1a2+b=0

即映射?(a)=(a1,a2,a21,a22,a1a2)
有了上述两个新的特征向量?(x),?(a)后,对其进行内积得:
?(x)??(a)=a1x1+a2x2+a21x21+a22x22+a1a2x1x2

容易联想到当K(x,a)=(?x?a?+1)2,可以求得:
K(x,a)=2a1x1+2a2x2+a21x21+a22x22+2a1a2x1x2+1

二者有很多相似的地方,实际上,我们只要把某几个维度线性缩放一下,然后再加上一个常数维度,具体来说,上面这个式子的计算结果实际上和映射:
?(x)=(2x1,2x2,x21,x22,2x1x2,1)

之后的内积?(x)??(a)相同。

回忆刚才提到的映射的维度爆炸,在前一种方法已经无法计算的情况下,后一种方法却依旧能从容处理,甚至是无穷维度的情况也没有问题。

我们把这里的计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数 (Kernel Function) ,例如,在刚才的例子中,我们的核函数为:

K(x,a)=(?x?a?+1)2

也就是说,在核函数K(x,a)给定的条件下,可以利用解线性分类问题的方法求解非线性分类问题的支持向量机。学习是隐式地在特征空间进行的,不需要显式地定义特征空间和映射函数。这样的技巧称为核技巧,它是巧妙地利用线性分类学习方法与核函数解决非线性问题的技术。在实际应用中,往往依赖领域知识直接选择核函数,核函数选择的有效性需要通过实验验证。

书中有关正定核的内容待续(泛函分析)

常用核函数

  • 多项式核函数
    K(x,z)=(x?z+1)p
  • 高斯核函数
    K(x,z)=exp(?x?z22σ2)

非线性支持向量分类机

如上所述,利用核技巧,可以将线性分类的学习方法应用到非线性分类问题中去。将线性支持向量机扩展到非线性支持向量机,只需要将线性支持向量机对偶形式中的内积换为核函数。

下面叙述非线性支持向量机学习算法。
算法(非线性支持向量机学习算法)

输入:线性可分训练数据集

T={(x1,y1),(x2,y2),...,(xN,yN)}
其中,xiX=Rn,yiY={?1,+1},i=1,2,...N
输出:分离超平面和分类决策函数
(1) 选取适当的核函数K(x,z)和适当的参数C,构造并求解最优化问题:
minαi(12i=1Nj=1NαiαjyiyjK(xi,xj)?i=1Nαi)

s.t. i=1Nαiyi=0

0αiC,i=1,2,...N

求得最优解α?=(α?1,α?2,...,α?N)T
(2) 计算:
w?=i=1Nα?iyixi

并选择α?的一个正分量α?j>0,计算
b?=yj?i=1Nα?iyi(xi?xj)

(3) 求得分离超平面
w??x+b?=0

分类决策函数
f(x)=sign(w??x+b?)

K(x,z)是正定核函数时,问题是凸二次规划问题,解是存在的。

至此,关于支持向量机的原理部分已经全部阐述完毕,整体内容分为三大部分,线性可分支持向量机,能够允许容错的线性支持向量机,利用核函数实现非线性支持向量机。后续咱们将实战一把,分析libSvm源码,并用python实现最简单的序列最小最优化算法。

参考文献及推荐阅读

支持向量机学习笔记--原理篇(二)

标签:好处   1.2   elf   联想   this   sig   add   unicode   修改   

原文地址:http://blog.csdn.net/u014688145/article/details/52943923

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!