• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            sunrise

            每天不斷學(xué)習(xí),才能不斷提升自己。

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              64 隨筆 :: 0 文章 :: 92 評論 :: 0 Trackbacks

            轉(zhuǎn)自:http://blog.csdn.net/yangliuy/article/details/7316496
            SVM入門(一)至(三)Refresh

            按:之前的文章重新匯編一下,修改了一些錯誤和不當(dāng)?shù)恼f法,一起復(fù)習(xí),然后繼續(xù)SVM之旅.

            (一)SVM的簡介

            支持向量機(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解決小樣本、非線性及高維模式識別中表現(xiàn)出許多特有的優(yōu)勢,并能夠推廣應(yīng)用到函數(shù)擬合等其他機器學(xué)習(xí)問題中[10]。 
            支持向量機方法是建立在統(tǒng)計學(xué)習(xí)理論的VC 維理論和結(jié)構(gòu)風(fēng)險最小原理基礎(chǔ)上的,根據(jù)有限的樣本信息在模型的復(fù)雜性(即對特定訓(xùn)練樣本的學(xué)習(xí)精度,Accuracy)和學(xué)習(xí)能力(即無錯誤地識別任意樣本的能力)之間尋求最佳折衷,以期獲得最好的推廣能力[14](或稱泛化能力)。

            以上是經(jīng)常被有關(guān)SVM 的學(xué)術(shù)文獻(xiàn)引用的介紹,我來逐一分解并解釋一下。

            Vapnik是統(tǒng)計機器學(xué)習(xí)的大牛,這想必都不用說,他出版的《Statistical Learning Theory》是一本完整闡述統(tǒng)計機器學(xué)習(xí)思想的名著。在該書中詳細(xì)的論證了統(tǒng)計機器學(xué)習(xí)之所以區(qū)別于傳統(tǒng)機器學(xué)習(xí)的本質(zhì),就在于統(tǒng)計機器學(xué)習(xí)能夠精確的給出學(xué)習(xí)效果,能夠解答需要的樣本數(shù)等等一系列問題。與統(tǒng)計機器學(xué)習(xí)的精密思維相比,傳統(tǒng)的機器學(xué)習(xí)基本上屬于摸著石頭過河,用傳統(tǒng)的機器學(xué)習(xí)方法構(gòu)造分類系統(tǒng)完全成了一種技巧,一個人做的結(jié)果可能很好,另一個人差不多的方法做出來卻很差,缺乏指導(dǎo)和原則。

            所謂VC維是對函數(shù)類的一種度量,可以簡單的理解為問題的復(fù)雜程度,VC維越高,一個問題就越復(fù)雜。正是因為SVM關(guān)注的是VC維,后面我們可以看到,SVM解決問題的時候,和樣本的維數(shù)是無關(guān)的(甚至樣本是上萬維的都可以,這使得SVM很適合用來解決文本分類的問題,當(dāng)然,有這樣的能力也因為引入了核函數(shù))。

            結(jié)構(gòu)風(fēng)險最小聽上去文縐縐,其實說的也無非是下面這回事。

            機器學(xué)習(xí)本質(zhì)上就是一種對問題真實模型的逼近(我們選擇一個我們認(rèn)為比較好的近似模型,這個近似模型就叫做一個假設(shè)),但毫無疑問,真實模型一定是不知道的(如果知道了,我們干嗎還要機器學(xué)習(xí)?直接用真實模型解決問題不就可以了?對吧,哈哈)既然真實模型不知道,那么我們選擇的假設(shè)與問題真實解之間究竟有多大差距,我們就沒法得知。比如說我們認(rèn)為宇宙誕生于150億年前的一場大爆炸,這個假設(shè)能夠描述很多我們觀察到的現(xiàn)象,但它與真實的宇宙模型之間還相差多少?誰也說不清,因為我們壓根就不知道真實的宇宙模型到底是什么。

            這個與問題真實解之間的誤差,就叫做風(fēng)險(更嚴(yán)格的說,誤差的累積叫做風(fēng)險)。我們選擇了一個假設(shè)之后(更直觀點說,我們得到了一個分類器以后),真實誤差無從得知,但我們可以用某些可以掌握的量來逼近它。最直觀的想法就是使用分類器在樣本數(shù)據(jù)上的分類的結(jié)果與真實結(jié)果(因為樣本是已經(jīng)標(biāo)注過的數(shù)據(jù),是準(zhǔn)確的數(shù)據(jù))之間的差值來表示。這個差值叫做經(jīng)驗風(fēng)險Remp(w)。以前的機器學(xué)習(xí)方法都把經(jīng)驗風(fēng)險最小化作為努力的目標(biāo),但后來發(fā)現(xiàn)很多分類函數(shù)能夠在樣本集上輕易達(dá)到100%的正確率,在真實分類時卻一塌糊涂(即所謂的推廣能力差,或泛化能力差)。此時的情況便是選擇了一個足夠復(fù)雜的分類函數(shù)(它的VC維很高),能夠精確的記住每一個樣本,但對樣本之外的數(shù)據(jù)一律分類錯誤。回頭看看經(jīng)驗風(fēng)險最小化原則我們就會發(fā)現(xiàn),此原則適用的大前提是經(jīng)驗風(fēng)險要確實能夠逼近真實風(fēng)險才行(行話叫一致),但實際上能逼近么?答案是不能,因為樣本數(shù)相對于現(xiàn)實世界要分類的文本數(shù)來說簡直九牛一毛,經(jīng)驗風(fēng)險最小化原則只在這占很小比例的樣本上做到?jīng)]有誤差,當(dāng)然不能保證在更大比例的真實文本上也沒有誤差。

            統(tǒng)計學(xué)習(xí)因此而引入了泛化誤差界的概念,就是指真實風(fēng)險應(yīng)該由兩部分內(nèi)容刻畫,一是經(jīng)驗風(fēng)險,代表了分類器在給定樣本上的誤差;二是置信風(fēng)險,代表了我們在多大程度上可以信任分類器在未知文本上分類的結(jié)果。很顯然,第二部分是沒有辦法精確計算的,因此只能給出一個估計的區(qū)間,也使得整個誤差只能計算上界,而無法計算準(zhǔn)確的值(所以叫做泛化誤差界,而不叫泛化誤差)。

            置信風(fēng)險與兩個量有關(guān),一是樣本數(shù)量,顯然給定的樣本數(shù)量越大,我們的學(xué)習(xí)結(jié)果越有可能正確,此時置信風(fēng)險越小;二是分類函數(shù)的VC維,顯然VC維越大,推廣能力越差,置信風(fēng)險會變大。

            泛化誤差界的公式為:

            R(w)≤Remp(w)+Ф(n/h)

            公式中R(w)就是真實風(fēng)險,Remp(w)就是經(jīng)驗風(fēng)險,Ф(n/h)就是置信風(fēng)險。統(tǒng)計學(xué)習(xí)的目標(biāo)從經(jīng)驗風(fēng)險最小化變?yōu)榱藢で蠼?jīng)驗風(fēng)險與置信風(fēng)險的和最小,即結(jié)構(gòu)風(fēng)險最小。

            SVM正是這樣一種努力最小化結(jié)構(gòu)風(fēng)險的算法。

            SVM其他的特點就比較容易理解了。

            小樣本,并不是說樣本的絕對數(shù)量少(實際上,對任何算法來說,更多的樣本幾乎總是能帶來更好的效果),而是說與問題的復(fù)雜度比起來,SVM算法要求的樣本數(shù)是相對比較少的。

            非線性,是指SVM擅長應(yīng)付樣本數(shù)據(jù)線性不可分的情況,主要通過松弛變量(也有人叫懲罰變量)和核函數(shù)技術(shù)來實現(xiàn),這一部分是SVM的精髓,以后會詳細(xì)討論。多說一句,關(guān)于文本分類這個問題究竟是不是線性可分的,尚沒有定論,因此不能簡單的認(rèn)為它是線性可分的而作簡化處理,在水落石出之前,只好先當(dāng)它是線性不可分的(反正線性可分也不過是線性不可分的一種特例而已,我們向來不怕方法過于通用)。

            高維模式識別是指樣本維數(shù)很高,例如文本的向量表示,如果沒有經(jīng)過另一系列文章(《文本分類入門》)中提到過的降維處理,出現(xiàn)幾萬維的情況很正常,其他算法基本就沒有能力應(yīng)付了,SVM卻可以,主要是因為SVM 產(chǎn)生的分類器很簡潔,用到的樣本信息很少(僅僅用到那些稱之為“支持向量”的樣本,此為后話),使得即使樣本維數(shù)很高,也不會給存儲和計算帶來大麻煩(相對照而言,kNN算法在分類時就要用到所有樣本,樣本數(shù)巨大,每個樣本維數(shù)再一高,這日子就沒法過了……)。

            下一節(jié)開始正式討論SVM。別嫌我說得太詳細(xì)哦。

            SVM入門(二)線性分類器Part 1

            線性分類器(一定意義上,也可以叫做感知機) 是最簡單也很有效的分類器形式.在一個線性分類器中,可以看到SVM形成的思路,并接觸很多SVM的核心概念.

            用一個二維空間里僅有兩類樣本的分類問題來舉個小例子。如圖所示

            C1和C2是要區(qū)分的兩個類別,在二維平面中它們的樣本如上圖所示。中間的直線就是一個分類函數(shù),它可以將兩類樣本完全分開。一般的,如果一個線性函數(shù)能夠?qū)颖就耆_的分開,就稱這些數(shù)據(jù)是線性可分的,否則稱為非線性可分的。

            什么叫線性函數(shù)呢?在一維空間里就是一個點,在二維空間里就是一條直線,三維空間里就是一個平面,可以如此想象下去,如果不關(guān)注空間的維數(shù),這種線性函數(shù)還有一個統(tǒng)一的名稱——超平面(Hyper Plane)!

            實際上,一個線性函數(shù)是一個實值函數(shù)(即函數(shù)的值是連續(xù)的實數(shù)),而我們的分類問題(例如這里的二元分類問題——回答一個樣本屬于還是不屬于一個類別的問題)需要離散的輸出值,例如用1表示某個樣本屬于類別C1,而用0表示不屬于(不屬于C1也就意味著屬于C2),這時候只需要簡單的在實值函數(shù)的基礎(chǔ)上附加一個閾值即可,通過分類函數(shù)執(zhí)行時得到的值大于還是小于這個閾值來確定類別歸屬。 例如我們有一個線性函數(shù)

            g(x)=wx+b

            【看到好多人都在問g(x)=0 和 g(x)的問題,我在這里幫樓主補充一下:g(x)實際是以w為法向量的一簇超平面,在二維空間表示為一簇直線(就是一簇平行線,他們的法向量都是w),而g(x)=0只是這么多平行線中的一條。】

            我們可以取閾值為0,這樣當(dāng)有一個樣本xi需要判別的時候,我們就看g(xi)的值。若g(xi)>0,就判別為類別C1,若g(xi)<0,則判別為類別C2(等于的時候我們就拒絕判斷,呵呵)。此時也等價于給函數(shù)g(x)附加一個符號函數(shù)sgn(),即f(x)=sgn [g(x)]是我們真正的判別函數(shù)。

            關(guān)于g(x)=wx+b這個表達(dá)式要注意三點:一,式中的x不是二維坐標(biāo)系中的橫軸,而是樣本的向量表示,例如一個樣本點的坐標(biāo)是(3,8),則xT=(3,8) ,而不是x=3(一般說向量都是說列向量,因此以行向量形式來表示時,就加上轉(zhuǎn)置)。二,這個形式并不局限于二維的情況,在n維空間中仍然可以使用這個表達(dá)式,只是式中的w成為了n維向量(在二維的這個例子中,w是二維向量,為了表示起來方便簡潔,以下均不區(qū)別列向量和它的轉(zhuǎn)置,聰明的讀者一看便知);三,g(x)不是中間那條直線的表達(dá)式,中間那條直線的表達(dá)式是g(x)=0,即wx+b=0,我們也把這個函數(shù)叫做分類面。

            實際上很容易看出來,中間那條分界線并不是唯一的,我們把它稍微旋轉(zhuǎn)一下,只要不把兩類數(shù)據(jù)分錯,仍然可以達(dá)到上面說的效果,稍微平移一下,也可以。此時就牽涉到一個問題,對同一個問題存在多個分類函數(shù)的時候,哪一個函數(shù)更好呢?顯然必須要先找一個指標(biāo)來量化“好”的程度,通常使用的都是叫做“分類間隔”的指標(biāo)。下一節(jié)我們就仔細(xì)說說分類間隔,也補一補相關(guān)的數(shù)學(xué)知識。

            SVM入門(三)線性分類器Part 2

            上回說到對于文本分類這樣的不適定問題(有一個以上解的問題稱為不適定問題),需要有一個指標(biāo)來衡量解決方案(即我們通過訓(xùn)練建立的分類模型)的好壞,而分類間隔是一個比較好的指標(biāo)。

            在進(jìn)行文本分類的時候,我們可以讓計算機這樣來看待我們提供給它的訓(xùn)練樣本,每一個樣本由一個向量(就是那些文本特征所組成的向量)和一個標(biāo)記(標(biāo)示出這個樣本屬于哪個類別)組成。如下:

            Di=(xi,yi)

            xi就是文本向量(維數(shù)很高),yi就是分類標(biāo)記。

            在二元的線性分類中,這個表示分類的標(biāo)記只有兩個值,1和-1(用來表示屬于還是不屬于這個類)。有了這種表示法,我們就可以定義一個樣本點到某個超平面的間隔:

            δi=yi(wxi+b)

            這個公式乍一看沒什么神秘的,也說不出什么道理,只是個定義而已,但我們做做變換,就能看出一些有意思的東西。

            首先注意到如果某個樣本屬于該類別的話,那么wxi+b>0(記得么?這是因為我們所選的g(x)=wx+b就通過大于0還是小于0來判斷分類),而yi也大于0;若不屬于該類別的話,那么wxi+b<0,而yi也小于0,這意味著yi(wxi+b)總是大于0的,而且它的值就等于|wxi+b|!(也就是|g(xi)|)

            現(xiàn)在把w和b進(jìn)行一下歸一化,即用w/||w||和b/||w||分別代替原來的w和b,那么間隔就可以寫成

            【點到直線的距離,做解析幾何中為:  
            D = (Ax + By + c) /sqrt(A^2+B^2)  
            sqrt(A^2+B^2)就相當(dāng)于||W||, 其中向量W=[A, B];  
            (Ax + By + c)就相當(dāng)于g(X), 其中向量X=[x,y]。】

            這個公式是不是看上去有點眼熟?沒錯,這不就是解析幾何中點xi到直線g(x)=0的距離公式嘛!(推廣一下,是到超平面g(x)=0的距離, g(x)=0就是上節(jié)中提到的分類超平面)

            小Tips:||w||是什么符號?||w||叫做向量w的范數(shù),范數(shù)是對向量長度的一種度量。我們常說的向量長度其實指的是它的2-范數(shù),范數(shù)最一般的表示形式為p-范數(shù),可以寫成如下表達(dá)式

                向量w=(w1, w2, w3,…… wn)

            它的p-范數(shù)為

            看看把p換成2的時候,不就是傳統(tǒng)的向量長度么?當(dāng)我們不指明p的時候,就像||w||這樣使用時,就意味著我們不關(guān)心p的值,用幾范數(shù)都可以;或者上文已經(jīng)提到了p的值,為了敘述方便不再重復(fù)指明。

            當(dāng)用歸一化的w和b代替原值之后的間隔有一個專門的名稱,叫做幾何間隔,幾何間隔所表示的正是點到超平面的歐氏距離,我們下面就簡稱幾何間隔為“距離”。以上是單個點到某個超平面的距離(就是間隔,后面不再區(qū)別這兩個詞)定義,同樣可以定義一個點的集合(就是一組樣本)到某個超平面的距離為此集合中離超平面最近的點的距離。下面這張圖更加直觀的展示出了幾何間隔的現(xiàn)實含義:

            H是分類面,而H1和H2是平行于H,且過離H最近的兩類樣本的直線,H1與H,H2與H之間的距離就是幾何間隔。

            之所以如此關(guān)心幾何間隔這個東西,是因為幾何間隔與樣本的誤分次數(shù)間存在關(guān)系:

            其中的δ是樣本集合到分類面的間隔,R=max ||xi||  i=1,...,n,即R是所有樣本中(xi是以向量表示的第i個樣本)向量長度最長的值(也就是說代表樣本的分布有多么廣)。先不必追究誤分次數(shù)的具體定義和推導(dǎo)過程,只要記得這個誤分次數(shù)一定程度上代表分類器的誤差。而從上式可以看出,誤分次數(shù)的上界由幾何間隔決定!(當(dāng)然,是樣本已知的時候)

            至此我們就明白為何要選擇幾何間隔來作為評價一個解優(yōu)劣的指標(biāo)了,原來幾何間隔越大的解,它的誤差上界越小。因此最大化幾何間隔成了我們訓(xùn)練階段的目標(biāo),而且,與二把刀作者所寫的不同,最大化分類間隔并不是SVM的專利,而是早在線性分類時期就已有的思想。

            SVM入門(四)線性分類器的求解——問題的描述Part1

            上節(jié)說到我們有了一個線性分類函數(shù),也有了判斷解優(yōu)劣的標(biāo)準(zhǔn)——即有了優(yōu)化的目標(biāo),這個目標(biāo)就是最大化幾何間隔,但是看過一些關(guān)于SVM的論文的人一定記得什么優(yōu)化的目標(biāo)是要最小化||w||這樣的說法,這是怎么回事呢?回頭再看看我們對間隔和幾何間隔的定義:

            間隔:δ=y(wx+b)=|g(x)|

            幾何間隔:

            可以看出δ=||w||δ幾何。注意到幾何間隔與||w||是成反比的,因此最大化幾何間隔與最小化||w||完全是一回事。而我們常用的方法并不是固定||w||的大小而尋求最大幾何間隔,而是固定間隔(例如固定為1),尋找最小的||w||。

            而凡是求一個函數(shù)的最小值(或最大值)的問題都可以稱為尋優(yōu)問題(也叫作一個規(guī)劃問題),又由于找最大值的問題總可以通過加一個負(fù)號變?yōu)檎易钚≈档膯栴},因此我們下面討論的時候都針對找最小值的過程來進(jìn)行。一個尋優(yōu)問題最重要的部分是目標(biāo)函數(shù),顧名思義,就是指尋優(yōu)的目標(biāo)。例如我們想尋找最小的||w||這件事,就可以用下面的式子表示:

            但實際上對于這個目標(biāo),我們常常使用另一個完全等價的目標(biāo)函數(shù)來代替,那就是:

            (式1)

            不難看出當(dāng)||w||2達(dá)到最小時,||w||也達(dá)到最小,反之亦然(前提當(dāng)然是||w||描述的是向量的長度,因而是非負(fù)的)。之所以采用這種形式,是因為后面的求解過程會對目標(biāo)函數(shù)作一系列變換,而式(1)的形式會使變換后的形式更為簡潔(正如聰明的讀者所料,添加的系數(shù)二分之一和平方,皆是為求導(dǎo)數(shù)所需)。

            接下來我們自然會問的就是,這個式子是否就描述了我們的問題呢?(回想一下,我們的問題是有一堆點,可以被分成兩類,我們要找出最好的分類面)

            如果直接來解這個求最小值問題,很容易看出當(dāng)||w||=0的時候就得到了目標(biāo)函數(shù)的最小值。但是你也會發(fā)現(xiàn),無論你給什么樣的數(shù)據(jù),都是這個解!反映在圖中,就是H1與H2兩條直線間的距離無限大,這個時候,所有的樣本點(無論正樣本還是負(fù)樣本)都跑到了H1和H2中間,而我們原本的意圖是,H1右側(cè)的被分為正類,H2 左側(cè)的被分為負(fù)類,位于兩類中間的樣本則拒絕分類(拒絕分類的另一種理解是分給哪一類都有道理,因而分給哪一類也都沒有道理)。這下可好,所有樣本點都進(jìn)入了無法分類的灰色地帶。

            造成這種結(jié)果的原因是在描述問題的時候只考慮了目標(biāo),而沒有加入約束條件,約束條件就是在求解過程中必須滿足的條件,體現(xiàn)在我們的問題中就是樣本點必須在H1或H2的某一側(cè)(或者至少在H1和H2上),而不能跑到兩者中間。我們前文提到過把間隔固定為1,這是指把所有樣本點中間隔最小的那一點的間隔定為1(這也是集合的間隔的定義,有點繞嘴),也就意味著集合中的其他點間隔都不會小于1,按照間隔的定義,滿足這些條件就相當(dāng)于讓下面的式子總是成立:

                yi[(w·xi)+b]≥1 (i=1,2,…,l) (l是總的樣本數(shù))

            但我們常常習(xí)慣讓式子的值和0比較,因而經(jīng)常用變換過的形式:

                yi[(w·xi)+b]-1≥0 (i=1,2,…,l) (l是總的樣本數(shù))

            因此我們的兩類分類問題也被我們轉(zhuǎn)化成了它的數(shù)學(xué)形式,一個帶約束的最小值的問題:

            下一節(jié)我們從最一般的意義上看看一個求最小值的問題有何特征,以及如何來解。

            SVM入門(五)線性分類器的求解——問題的描述Part2

            從最一般的定義上說,一個求最小值的問題就是一個優(yōu)化問題(也叫尋優(yōu)問題,更文縐縐的叫法是規(guī)劃——Programming),它同樣由兩部分組成,目標(biāo)函數(shù)和約束條件,可以用下面的式子表示:

            (式1)

            約束條件用函數(shù)c來表示,就是constrain的意思啦。你可以看出一共有p+q個約束條件,其中p個是不等式約束,q個等式約束。

            關(guān)于這個式子可以這樣來理解:式中的x是自變量,但不限定它的維數(shù)必須為1(視乎你解決的問題空間維數(shù),對我們的文本分類來說,那可是成千上萬啊)。要求f(x)在哪一點上取得最小值(反倒不太關(guān)心這個最小值到底是多少,關(guān)鍵是哪一點),但不是在整個空間里找,而是在約束條件所劃定的一個有限的空間里找,這個有限的空間就是優(yōu)化理論里所說的可行域。注意可行域中的每一個點都要求滿足所有p+q個條件,而不是滿足其中一條或幾條就可以(切記,要滿足每個約束),同時可行域邊界上的點有一個額外好的特性,它們可以使不等式約束取得等號!而邊界內(nèi)的點不行。

            關(guān)于可行域還有個概念不得不提,那就是凸集,凸集是指有這么一個點的集合,其中任取兩個點連一條直線,這條線上的點仍然在這個集合內(nèi)部,因此說“凸”是很形象的(一個反例是,二維平面上,一個月牙形的區(qū)域就不是凸集,你隨便就可以找到兩個點違反了剛才的規(guī)定)。

            回頭再來看我們線性分類器問題的描述,可以看出更多的東西。

            (式2)

            在這個問題中,自變量就是w,而目標(biāo)函數(shù)是w的二次函數(shù),所有的約束條件都是w的線性函數(shù)(哎,千萬不要把xi當(dāng)成變量,它代表樣本,是已知的),這種規(guī)劃問題有個很有名氣的稱呼——二次規(guī)劃(Quadratic Programming,QP),而且可以更進(jìn)一步的說,由于它的可行域是一個凸集,因此它是一個凸二次規(guī)劃。

            一下子提了這么多術(shù)語,實在不是為了讓大家以后能向別人炫耀學(xué)識的淵博,這其實是我們繼續(xù)下去的一個重要前提,因為在動手求一個問題的解之前(好吧,我承認(rèn),是動計算機求……),我們必須先問自己:這個問題是不是有解?如果有解,是否能找到?

            對于一般意義上的規(guī)劃問題,兩個問題的答案都是不一定,但凸二次規(guī)劃讓人喜歡的地方就在于,它有解(教科書里面為了嚴(yán)謹(jǐn),常常加限定成分,說它有全局最優(yōu)解,由于我們想找的本來就是全局最優(yōu)的解,所以不加也罷),而且可以找到!(當(dāng)然,依據(jù)你使用的算法不同,找到這個解的速度,行話叫收斂速度,會有所不同)

            對比(式2)和(式1)還可以發(fā)現(xiàn),我們的線性分類器問題只有不等式約束,因此形式上看似乎比一般意義上的規(guī)劃問題要簡單,但解起來卻并非如此。

            因為我們實際上并不知道該怎么解一個帶約束的優(yōu)化問題。如果你仔細(xì)回憶一下高等數(shù)學(xué)的知識,會記得我們可以輕松的解一個不帶任何約束的優(yōu)化問題(實際上就是當(dāng)年背得爛熟的函數(shù)求極值嘛,求導(dǎo)再找0點唄,誰不會啊?笑),我們甚至還會解一個只帶等式約束的優(yōu)化問題,也是背得爛熟的,求條件極值,記得么,通過添加拉格朗日乘子,構(gòu)造拉格朗日函數(shù),來把這個問題轉(zhuǎn)化為無約束的優(yōu)化問題云云(如果你一時沒想通,我提醒一下,構(gòu)造出的拉格朗日函數(shù)就是轉(zhuǎn)化之后的問題形式,它顯然沒有帶任何條件)。

            讀者問:如果只帶等式約束的問題可以轉(zhuǎn)化為無約束的問題而得以求解,那么可不可以把帶不等式約束的問題向只帶等式約束的問題轉(zhuǎn)化一下而得以求解呢?

            聰明,可以,實際上我們也正是這么做的。下一節(jié)就來說說如何做這個轉(zhuǎn)化,一旦轉(zhuǎn)化完成,求解對任何學(xué)過高等數(shù)學(xué)的人來說,都是小菜一碟啦。

            SVM入門(六)線性分類器的求解——問題的轉(zhuǎn)化,直觀角度

            讓我再一次比較完整的重復(fù)一下我們要解決的問題:我們有屬于兩個類別的樣本點(并不限定這些點在二維空間中)若干,如圖,

            圓形的樣本點定為正樣本(連帶著,我們可以把正樣本所屬的類叫做正類),方形的點定為負(fù)例。我們想求得這樣一個線性函數(shù)(在n維空間中的線性函數(shù)):

            g(x)=wx+b

            使得所有屬于正類的點+代入以后有g(shù)(x+)≥1,而所有屬于負(fù)類的點x-代入后有g(shù)(x-)≤-1(之所以總跟1比較,無論正一還是負(fù)一,都是因為我們固定了間隔為1,注意間隔和幾何間隔的區(qū)別)。代入g(x)后的值如果在1和-1之間,我們就拒絕判斷。

            求這樣的g(x)的過程就是求w(一個n維向量)和b(一個實數(shù))兩個參數(shù)的過程(但實際上只需要求w,求得以后找某些樣本點代入就可以求得b)。因此在求g(x)的時候,w才是變量。

            你肯定能看出來,一旦求出了w(也就求出了b),那么中間的直線H就知道了(因為它就是wx+b=0嘛,哈哈),那么H1和H2也就知道了(因為三者是平行的,而且相隔的距離還是||w||決定的)。那么w是誰決定的?顯然是你給的樣本決定的,一旦你在空間中給出了那些個樣本點,三條直線的位置實際上就唯一確定了(因為我們求的是最優(yōu)的那三條,當(dāng)然是唯一的),我們解優(yōu)化問題的過程也只不過是把這個確定了的東西算出來而已。

            樣本確定了w,用數(shù)學(xué)的語言描述,就是w可以表示為樣本的某種組合:

            w=α1x1+α2x2+…+αnxn

            式子中的αi是一個一個的數(shù)(在嚴(yán)格的證明過程中,這些α被稱為拉格朗日乘子),而xi是樣本點,因而是向量,n就是總樣本點的個數(shù)。為了方便描述,以下開始嚴(yán)格區(qū)別數(shù)字與向量的乘積和向量間的乘積,我會用α1x1表示數(shù)字和向量的乘積,而用<x1,x2>表示向量x1,x2的內(nèi)積(也叫點積,注意與向量叉積的區(qū)別)。因此g(x)的表達(dá)式嚴(yán)格的形式應(yīng)該是:

            g(x)=<w,x>+b

            但是上面的式子還不夠好,你回頭看看圖中正樣本和負(fù)樣本的位置,想像一下,我不動所有點的位置,而只是把其中一個正樣本點定為負(fù)樣本點(也就是把一個點的形狀從圓形變?yōu)榉叫危Y(jié)果怎么樣?三條直線都必須移動(因為對這三條直線的要求是必須把方形和圓形的點正確分開)!這說明w不僅跟樣本點的位置有關(guān),還跟樣本的類別有關(guān)(也就是和樣本的“標(biāo)簽”有關(guān))。因此用下面這個式子表示才算完整:

            w=α1y1x1+α2y2x2+…+αnynxn (式1)

            其中的yi就是第i個樣本的標(biāo)簽,它等于1或者-1。其實以上式子的那一堆拉格朗日乘子中,只有很少的一部分不等于0(不等于0才對w起決定作用),這部分不等于0的拉格朗日乘子后面所乘的樣本點,其實都落在H1和H2上,也正是這部分樣本(而不需要全部樣本)唯一的確定了分類函數(shù),當(dāng)然,更嚴(yán)格的說,這些樣本的一部分就可以確定,因為例如確定一條直線,只需要兩個點就可以,即便有三五個都落在上面,我們也不是全都需要。這部分我們真正需要的樣本點,就叫做支持(撐)向量!(名字還挺形象吧,他們“撐”起了分界線)

            式子也可以用求和符號簡寫一下:

            因此原來的g(x)表達(dá)式可以寫為:

            注意式子中x才是變量,也就是你要分類哪篇文檔,就把該文檔的向量表示代入到 x的位置,而所有的xi統(tǒng)統(tǒng)都是已知的樣本。還注意到式子中只有xi和x是向量,因此一部分可以從內(nèi)積符號中拿出來,得到g(x)的式子為:

            發(fā)現(xiàn)了什么?w不見啦!從求w變成了求α。

            但肯定有人會說,這并沒有把原問題簡化呀。嘿嘿,其實簡化了,只不過在你看不見的地方,以這樣的形式描述問題以后,我們的優(yōu)化問題少了很大一部分不等式約束(記得這是我們解不了極值問題的萬惡之源)。但是接下來先跳過線性分類器求解的部分,來看看 SVM在線性分類器上所做的重大改進(jìn)——核函數(shù)。

            SVM入門(七)為何需要核函數(shù)

            生存?還是毀滅?——哈姆雷特

            可分?還是不可分?——支持向量機

            之前一直在討論的線性分類器,器如其名(汗,這是什么說法啊),只能對線性可分的樣本做處理。如果提供的樣本線性不可分,結(jié)果很簡單,線性分類器的求解程序會無限循環(huán),永遠(yuǎn)也解不出來。這必然使得它的適用范圍大大縮小,而它的很多優(yōu)點我們實在不原意放棄,怎么辦呢?是否有某種方法,讓線性不可分的數(shù)據(jù)變得線性可分呢?

            有!其思想說來也簡單,來用一個二維平面中的分類問題作例子,你一看就會明白。事先聲明,下面這個例子是網(wǎng)絡(luò)早就有的,我一時找不到原作者的正確信息,在此借用,并加進(jìn)了我自己的解說而已。

            例子是下面這張圖:

            /

            我們把橫軸上端點a和b之間紅色部分里的所有點定為正類,兩邊的黑色部分里的點定為負(fù)類。試問能找到一個線性函數(shù)把兩類正確分開么?不能,因為二維空間里的線性函數(shù)就是指直線,顯然找不到符合條件的直線。

            但我們可以找到一條曲線,例如下面這一條:

            顯然通過點在這條曲線的上方還是下方就可以判斷點所屬的類別(你在橫軸上隨便找一點,算算這一點的函數(shù)值,會發(fā)現(xiàn)負(fù)類的點函數(shù)值一定比0大,而正類的一定比0小)。這條曲線就是我們熟知的二次曲線,它的函數(shù)表達(dá)式可以寫為:

            問題只是它不是一個線性函數(shù),但是,下面要注意看了,新建一個向量y和a:

            這樣g(x)就可以轉(zhuǎn)化為f(y)=<a,y>,你可以把y和a分別回帶一下,看看等不等于原來的g(x)。用內(nèi)積的形式寫你可能看不太清楚,實際上f(y)的形式就是:

            g(x)=f(y)=ay

            在任意維度的空間中,這種形式的函數(shù)都是一個線性函數(shù)(只不過其中的a和y都是多維向量罷了),因為自變量y的次數(shù)不大于1。

            看出妙在哪了么?原來在二維空間中一個線性不可分的問題,映射到四維空間后,變成了線性可分的!因此這也形成了我們最初想解決線性不可分問題的基本思路——向高維空間轉(zhuǎn)化,使其變得線性可分。

            而轉(zhuǎn)化最關(guān)鍵的部分就在于找到x到y(tǒng)的映射方法。遺憾的是,如何找到這個映射,沒有系統(tǒng)性的方法(也就是說,純靠猜和湊)。具體到我們的文本分類問題,文本被表示為上千維的向量,即使維數(shù)已經(jīng)如此之高,也常常是線性不可分的,還要向更高的空間轉(zhuǎn)化。其中的難度可想而知。

            小Tips:為什么說f(y)=ay是四維空間里的函數(shù)?

            大家可能一時沒看明白。回想一下我們二維空間里的函數(shù)定義 
              g(x)=ax+b 
            變量x是一維的,為什么說它是二維空間里的函數(shù)呢?因為還有一個變量我們沒寫出來,它的完整形式其實是 
              y=g(x)=ax+b 
            即 
              y=ax+b 
            看看,有幾個變量?兩個。那是幾維空間的函數(shù)?(作者五歲的弟弟答:五維的。作者:……) 
            再看看 
            f(y)=ay 
            里面的y是三維的變量,那f(y)是幾維空間里的函數(shù)?(作者五歲的弟弟答:還是五維的。作者:……)

            用一個具體文本分類的例子來看看這種向高維空間映射從而分類的方法如何運作,想象一下,我們文本分類問題的原始空間是1000維的(即每個要被分類的文檔被表示為一個1000維的向量),在這個維度上問題是線性不可分的。現(xiàn)在我們有一個2000維空間里的線性函數(shù)

            f(x’)=<w’,x’>+b

            注意向量的右上角有個 ’哦。它能夠?qū)⒃瓎栴}變得可分。式中的 w’和x’都是2000維的向量,只不過w’是定值,而x’是變量(好吧,嚴(yán)格說來這個函數(shù)是2001維的,哈哈),現(xiàn)在我們的輸入呢,是一個1000維的向量x,分類的過程是先把x變換為2000維的向量x’,然后求這個變換后的向量x’與向量w’的內(nèi)積,再把這個內(nèi)積的值和b相加,就得到了結(jié)果,看結(jié)果大于閾值還是小于閾值就得到了分類結(jié)果。

            你發(fā)現(xiàn)了什么?我們其實只關(guān)心那個高維空間里內(nèi)積的值,那個值算出來了,分類結(jié)果就算出來了。而從理論上說, x’是經(jīng)由x變換來的,因此廣義上可以把它叫做x的函數(shù)(有一個x,就確定了一個x’,對吧,確定不出第二個),而w’是常量,它是一個低維空間里的常量w經(jīng)過變換得到的,所以給了一個w 和x的值,就有一個確定的f(x’)值與其對應(yīng)。這讓我們幻想,是否能有這樣一種函數(shù)K(w,x),他接受低維空間的輸入值,卻能算出高維空間的內(nèi)積值<w’,x’>?

            如果有這樣的函數(shù),那么當(dāng)給了一個低維空間的輸入x以后,

            g(x)=K(w,x)+b

            f(x’)=<w’,x’>+b

            這兩個函數(shù)的計算結(jié)果就完全一樣,我們也就用不著費力找那個映射關(guān)系,直接拿低維的輸入往g(x)里面代就可以了(再次提醒,這回的g(x)就不是線性函數(shù)啦,因為你不能保證K(w,x)這個表達(dá)式里的x次數(shù)不高于1哦)。

            萬幸的是,這樣的K(w,x)確實存在(發(fā)現(xiàn)凡是我們?nèi)祟惸芙鉀Q的問題,大都是巧得不能再巧,特殊得不能再特殊的問題,總是恰好有些能投機取巧的地方才能解決,由此感到人類的渺小),它被稱作核函數(shù)(核,kernel),而且還不止一個,事實上,只要是滿足了Mercer條件的函數(shù),都可以作為核函數(shù)。核函數(shù)的基本作用就是接受兩個低維空間里的向量,能夠計算出經(jīng)過某個變換后在高維空間里的向量內(nèi)積值。幾個比較常用的核函數(shù),俄,教課書里都列過,我就不敲了(懶!)。

            回想我們上節(jié)說的求一個線性分類器,它的形式應(yīng)該是:

            現(xiàn)在這個就是高維空間里的線性函數(shù)(為了區(qū)別低維和高維空間里的函數(shù)和向量,我改了函數(shù)的名字,并且給w和x都加上了 ’),我們就可以用一個低維空間里的函數(shù)(再一次的,這個低維空間里的函數(shù)就不再是線性的啦)來代替,

            又發(fā)現(xiàn)什么了?f(x’) 和g(x)里的α,y,b全都是一樣一樣的!這就是說,盡管給的問題是線性不可分的,但是我們就硬當(dāng)它是線性問題來求解,只不過求解過程中,凡是要求內(nèi)積的時候就用你選定的核函數(shù)來算。這樣求出來的α再和你選定的核函數(shù)一組合,就得到分類器啦!

            明白了以上這些,會自然的問接下來兩個問題:

            1. 既然有很多的核函數(shù),針對具體問題該怎么選擇?

            2. 如果使用核函數(shù)向高維空間映射后,問題仍然是線性不可分的,那怎么辦?

            第一個問題現(xiàn)在就可以回答你:對核函數(shù)的選擇,現(xiàn)在還缺乏指導(dǎo)原則!各種實驗的觀察結(jié)果(不光是文本分類)的確表明,某些問題用某些核函數(shù)效果很好,用另一些就很差,但是一般來講,徑向基核函數(shù)是不會出太大偏差的一種,首選。(我做文本分類系統(tǒng)的時候,使用徑向基核函數(shù),沒有參數(shù)調(diào)優(yōu)的情況下,絕大部分類別的準(zhǔn)確和召回都在85%以上,可見。雖然libSVM的作者林智仁認(rèn)為文本分類用線性核函數(shù)效果更佳,待考證)

            對第二個問題的解決則引出了我們下一節(jié)的主題:松弛變量。

            SVM入門(八)松弛變量

            現(xiàn)在我們已經(jīng)把一個本來線性不可分的文本分類問題,通過映射到高維空間而變成了線性可分的。就像下圖這樣:

            圓形和方形的點各有成千上萬個(畢竟,這就是我們訓(xùn)練集中文檔的數(shù)量嘛,當(dāng)然很大了)。現(xiàn)在想象我們有另一個訓(xùn)練集,只比原先這個訓(xùn)練集多了一篇文章,映射到高維空間以后(當(dāng)然,也使用了相同的核函數(shù)),也就多了一個樣本點,但是這個樣本的位置是這樣的:

            就是圖中黃色那個點,它是方形的,因而它是負(fù)類的一個樣本,這單獨的一個樣本,使得原本線性可分的問題變成了線性不可分的。這樣類似的問題(僅有少數(shù)點線性不可分)叫做“近似線性可分”的問題。

            以我們?nèi)祟惖某WR來判斷,說有一萬個點都符合某種規(guī)律(因而線性可分),有一個點不符合,那這一個點是否就代表了分類規(guī)則中我們沒有考慮到的方面呢(因而規(guī)則應(yīng)該為它而做出修改)?

            其實我們會覺得,更有可能的是,這個樣本點壓根就是錯誤,是噪聲,是提供訓(xùn)練集的同學(xué)人工分類時一打瞌睡錯放進(jìn)去的。所以我們會簡單的忽略這個樣本點,仍然使用原來的分類器,其效果絲毫不受影響。

            但這種對噪聲的容錯性是人的思維帶來的,我們的程序可沒有。由于我們原本的優(yōu)化問題的表達(dá)式中,確實要考慮所有的樣本點(不能忽略某一個,因為程序它怎么知道該忽略哪一個呢?),在此基礎(chǔ)上尋找正負(fù)類之間的最大幾何間隔,而幾何間隔本身代表的是距離,是非負(fù)的,像上面這種有噪聲的情況會使得整個問題無解。這種解法其實也叫做“硬間隔”分類法,因為他硬性的要求所有樣本點都滿足和分類平面間的距離必須大于某個值。

            因此由上面的例子中也可以看出,硬間隔的分類法其結(jié)果容易受少數(shù)點的控制,這是很危險的(盡管有句話說真理總是掌握在少數(shù)人手中,但那不過是那一小撮人聊以自慰的詞句罷了,咱還是得民主)。

            但解決方法也很明顯,就是仿照人的思路,允許一些點到分類平面的距離不滿足原先的要求。由于不同的訓(xùn)練集各點的間距尺度不太一樣,因此用間隔(而不是幾何間隔)來衡量有利于我們表達(dá)形式的簡潔。我們原先對樣本點的要求是:

            意思是說離分類面最近的樣本點函數(shù)間隔也要比1大。如果要引入容錯性,就給1這個硬性的閾值加一個松弛變量,即允許

            因為松弛變量是非負(fù)的,因此最終的結(jié)果是要求間隔可以比1小。但是當(dāng)某些點出現(xiàn)這種間隔比1小的情況時(這些點也叫離群點),意味著我們放棄了對這些點的精確分類,而這對我們的分類器來說是種損失。但是放棄這些點也帶來了好處,那就是使分類面不必向這些點的方向移動,因而可以得到更大的幾何間隔(在低維空間看來,分類邊界也更平滑)。顯然我們必須權(quán)衡這種損失和好處。好處很明顯,我們得到的分類間隔越大,好處就越多。回顧我們原始的硬間隔分類對應(yīng)的優(yōu)化問題:

            ||w||2就是我們的目標(biāo)函數(shù)(當(dāng)然系數(shù)可有可無),希望它越小越好,因而損失就必然是一個能使之變大的量(能使它變小就不叫損失了,我們本來就希望目標(biāo)函數(shù)值越小越好)。那如何來衡量損失,有兩種常用的方式,有人喜歡用

            而有人喜歡用

            其中l(wèi)都是樣本的數(shù)目。兩種方法沒有大的區(qū)別。如果選擇了第一種,得到的方法的就叫做二階軟間隔分類器,第二種就叫做一階軟間隔分類器。把損失加入到目標(biāo)函數(shù)里的時候,就需要一個懲罰因子(cost,也就是libSVM的諸多參數(shù)中的C),原來的優(yōu)化問題就變成了下面這樣:

            這個式子有這么幾點要注意:

            一是并非所有的樣本點都有一個松弛變量與其對應(yīng)。實際上只有“離群點”才有,或者也可以這么看,所有沒離群的點松弛變量都等于0(對負(fù)類來說,離群點就是在前面圖中,跑到H2右側(cè)的那些負(fù)樣本點,對正類來說,就是跑到H1左側(cè)的那些正樣本點)。

            【在迭代求w的時候如何樣本點非離群點,即分類正確,那么就設(shè)它的松弛變量為0了。。。】

            二是松弛變量的值實際上標(biāo)示出了對應(yīng)的點到底離群有多遠(yuǎn),值越大,點就越遠(yuǎn)。

            三是懲罰因子C決定了你有多重視離群點帶來的損失,顯然當(dāng)所有離群點的松弛變量的和一定時,你定的C越大,對目標(biāo)函數(shù)的損失也越大,此時就暗示著你非常不愿意放棄這些離群點,最極端的情況是你把C定為無限大,這樣只要稍有一個點離群,目標(biāo)函數(shù)的值馬上變成無限大,馬上讓問題變成無解,這就退化成了硬間隔問題。

            四是懲罰因子C不是一個變量,整個優(yōu)化問題在解的時候,C是一個你必須事先指定的值,指定這個值以后,解一下,得到一個分類器,然后用測試數(shù)據(jù)看看結(jié)果怎么樣,如果不夠好,換一個C的值,再解一次優(yōu)化問題,得到另一個分類器,再看看效果,如此就是一個參數(shù)尋優(yōu)的過程,但這和優(yōu)化問題本身決不是一回事,優(yōu)化問題在解的過程中,C一直是定值,要記住。

            五是盡管加了松弛變量這么一說,但這個優(yōu)化問題仍然是一個優(yōu)化問題(汗,這不廢話么),解它的過程比起原始的硬間隔問題來說,沒有任何更加特殊的地方。

            從大的方面說優(yōu)化問題解的過程,就是先試著確定一下w,也就是確定了前面圖中的三條直線,這時看看間隔有多大,又有多少點離群,把目標(biāo)函數(shù)的值算一算,再換一組三條直線(你可以看到,分類的直線位置如果移動了,有些原來離群的點會變得不再離群,而有的本來不離群的點會變成離群點),再把目標(biāo)函數(shù)的值算一算,如此往復(fù)(迭代),直到最終找到目標(biāo)函數(shù)最小時的w。

            啰嗦了這么多,讀者一定可以馬上自己總結(jié)出來,松弛變量也就是個解決線性不可分問題的方法罷了,但是回想一下,核函數(shù)的引入不也是為了解決線性不可分的問題么?為什么要為了一個問題使用兩種方法呢?

            其實兩者還有微妙的不同。一般的過程應(yīng)該是這樣,還以文本分類為例。在原始的低維空間中,樣本相當(dāng)?shù)牟豢煞郑瑹o論你怎么找分類平面,總會有大量的離群點,此時用核函數(shù)向高維空間映射一下,雖然結(jié)果仍然是不可分的,但比原始空間里的要更加接近線性可分的狀態(tài)(就是達(dá)到了近似線性可分的狀態(tài)),此時再用松弛變量處理那些少數(shù)“冥頑不化”的離群點,就簡單有效得多啦。

            本節(jié)中的(式1)也確實是支持向量機最最常用的形式。至此一個比較完整的支持向量機框架就有了,簡單說來,支持向量機就是使用了核函數(shù)的軟間隔線性分類法。

            下一節(jié)會說說松弛變量剩下的一點點東西,順便搞個讀者調(diào)查,看看大家還想侃侃SVM的哪些方面。

            SVM入門(九)松弛變量(續(xù))

            接下來要說的東西其實不是松弛變量本身,但由于是為了使用松弛變量才引入的,因此放在這里也算合適,那就是懲罰因子C。回頭看一眼引入了松弛變量以后的優(yōu)化問題:

            注意其中C的位置,也可以回想一下C所起的作用(表征你有多么重視離群點,C越大越重視,越不想丟掉它們)。這個式子是以前做SVM的人寫的,大家也就這么用,但沒有任何規(guī)定說必須對所有的松弛變量都使用同一個懲罰因子,我們完全可以給每一個離群點都使用不同的C,這時就意味著你對每個樣本的重視程度都不一樣,有些樣本丟了也就丟了,錯了也就錯了,這些就給一個比較小的C;而有些樣本很重要,決不能分類錯誤(比如中央下達(dá)的文件啥的,笑),就給一個很大的C。

            當(dāng)然實際使用的時候并沒有這么極端,但一種很常用的變形可以用來解決分類問題中樣本的“偏斜”問題。

            先來說說樣本的偏斜問題,也叫數(shù)據(jù)集偏斜(unbalanced),它指的是參與分類的兩個類別(也可以指多個類別)樣本數(shù)量差異很大。比如說正類有10,000個樣本,而負(fù)類只給了100個,這會引起的問題顯而易見,可以看看下面的圖:

            方形的點是負(fù)類。H,H1,H2是根據(jù)給的樣本算出來的分類面,由于負(fù)類的樣本很少很少,所以有一些本來是負(fù)類的樣本點沒有提供,比如圖中兩個灰色的方形點,如果這兩個點有提供的話,那算出來的分類面應(yīng)該是H’,H2’和H1,他們顯然和之前的結(jié)果有出入,實際上負(fù)類給的樣本點越多,就越容易出現(xiàn)在灰色點附近的點,我們算出的結(jié)果也就越接近于真實的分類面。但現(xiàn)在由于偏斜的現(xiàn)象存在,使得數(shù)量多的正類可以把分類面向負(fù)類的方向“推”,因而影響了結(jié)果的準(zhǔn)確性。

            對付數(shù)據(jù)集偏斜問題的方法之一就是在懲罰因子上作文章,想必大家也猜到了,那就是給樣本數(shù)量少的負(fù)類更大的懲罰因子,表示我們重視這部分樣本(本來數(shù)量就少,再拋棄一些,那人家負(fù)類還活不活了),因此我們的目標(biāo)函數(shù)中因松弛變量而損失的部分就變成了:

            其中i=1…p都是正樣本,j=p+1…p+q都是負(fù)樣本。libSVM這個算法包在解決偏斜問題的時候用的就是這種方法。

            那C+和C-怎么確定呢?它們的大小是試出來的(參數(shù)調(diào)優(yōu)),但是他們的比例可以有些方法來確定。咱們先假定說C+是5這么大,那確定C-的一個很直觀的方法就是使用兩類樣本數(shù)的比來算,對應(yīng)到剛才舉的例子,C-就可以定為500這么大(因為10,000:100=100:1嘛)。

            但是這樣并不夠好,回看剛才的圖,你會發(fā)現(xiàn)正類之所以可以“欺負(fù)”負(fù)類,其實并不是因為負(fù)類樣本少,真實的原因是負(fù)類的樣本分布的不夠廣(沒擴充到負(fù)類本應(yīng)該有的區(qū)域)。說一個具體點的例子,現(xiàn)在想給政治類和體育類的文章做分類,政治類文章很多,而體育類只提供了幾篇關(guān)于籃球的文章,這時分類會明顯偏向于政治類,如果要給體育類文章增加樣本,但增加的樣本仍然全都是關(guān)于籃球的(也就是說,沒有足球,排球,賽車,游泳等等),那結(jié)果會怎樣呢?雖然體育類文章在數(shù)量上可以達(dá)到與政治類一樣多,但過于集中了,結(jié)果仍會偏向于政治類!所以給C+和C-確定比例更好的方法應(yīng)該是衡量他們分布的程度。比如可以算算他們在空間中占據(jù)了多大的體積,例如給負(fù)類找一個超球——就是高維空間里的球啦——它可以包含所有負(fù)類的樣本,再給正類找一個,比比兩個球的半徑,就可以大致確定分布的情況。顯然半徑大的分布就比較廣,就給小一點的懲罰因子。

            但是這樣還不夠好,因為有的類別樣本確實很集中,這不是提供的樣本數(shù)量多少的問題,這是類別本身的特征(就是某些話題涉及的面很窄,例如計算機類的文章就明顯不如文化類的文章那么“天馬行空”),這個時候即便超球的半徑差異很大,也不應(yīng)該賦予兩個類別不同的懲罰因子。

            看到這里讀者一定瘋了,因為說來說去,這豈不成了一個解決不了的問題?然而事實如此,完全的方法是沒有的,根據(jù)需要,選擇實現(xiàn)簡單又合用的就好(例如libSVM就直接使用樣本數(shù)量的比)。

            SVM入門(十)將SVM用于多類分類

            從 SVM的那幾張圖可以看出來,SVM是一種典型的兩類分類器,即它只回答屬于正類還是負(fù)類的問題。而現(xiàn)實中要解決的問題,往往是多類的問題(少部分例外,例如垃圾郵件過濾,就只需要確定“是”還是“不是”垃圾郵件),比如文本分類,比如數(shù)字識別。如何由兩類分類器得到多類分類器,就是一個值得研究的問題。

            還以文本分類為例,現(xiàn)成的方法有很多,其中一種一勞永逸的方法,就是真的一次性考慮所有樣本,并求解一個多目標(biāo)函數(shù)的優(yōu)化問題,一次性得到多個分類面,就像下圖這樣:

            多個超平面把空間劃分為多個區(qū)域,每個區(qū)域?qū)?yīng)一個類別,給一篇文章,看它落在哪個區(qū)域就知道了它的分類。

            看起來很美對不對?只可惜這種算法還基本停留在紙面上,因為一次性求解的方法計算量實在太大,大到無法實用的地步。

            稍稍退一步,我們就會想到所謂“一類對其余”的方法,就是每次仍然解一個兩類分類的問題。比如我們有5個類別,第一次就把類別1的樣本定為正樣本,其余2,3,4,5的樣本合起來定為負(fù)樣本,這樣得到一個兩類分類器,它能夠指出一篇文章是還是不是第1類的;第二次我們把類別2 的樣本定為正樣本,把1,3,4,5的樣本合起來定為負(fù)樣本,得到一個分類器,如此下去,我們可以得到5個這樣的兩類分類器(總是和類別的數(shù)目一致)。到了有文章需要分類的時候,我們就拿著這篇文章挨個分類器的問:是屬于你的么?是屬于你的么?哪個分類器點頭說是了,文章的類別就確定了。這種方法的好處是每個優(yōu)化問題的規(guī)模比較小,而且分類的時候速度很快(只需要調(diào)用5個分類器就知道了結(jié)果)。但有時也會出現(xiàn)兩種很尷尬的情況,例如拿一篇文章問了一圈,每一個分類器都說它是屬于它那一類的,或者每一個分類器都說它不是它那一類的,前者叫分類重疊現(xiàn)象,后者叫不可分類現(xiàn)象。分類重疊倒還好辦,隨便選一個結(jié)果都不至于太離譜,或者看看這篇文章到各個超平面的距離,哪個遠(yuǎn)就判給哪個。不可分類現(xiàn)象就著實難辦了,只能把它分給第6個類別了……更要命的是,本來各個類別的樣本數(shù)目是差不多的,但“其余”的那一類樣本數(shù)總是要數(shù)倍于正類(因為它是除正類以外其他類別的樣本之和嘛),這就人為的造成了上一節(jié)所說的“數(shù)據(jù)集偏斜”問題。

            因此我們還得再退一步,還是解兩類分類問題,還是每次選一個類的樣本作正類樣本,而負(fù)類樣本則變成只選一個類(稱為“一對一單挑”的方法,哦,不對,沒有單挑,就是“一對一”的方法,呵呵),這就避免了偏斜。因此過程就是算出這樣一些分類器,第一個只回答“是第1類還是第2類”,第二個只回答“是第1類還是第3類”,第三個只回答“是第1類還是第4類”,如此下去,你也可以馬上得出,這樣的分類器應(yīng)該有5 X 4/2=10個(通式是,如果有k個類別,則總的兩類分類器數(shù)目為k(k-1)/2)。雖然分類器的數(shù)目多了,但是在訓(xùn)練階段(也就是算出這些分類器的分類平面時)所用的總時間卻比“一類對其余”方法少很多,在真正用來分類的時候,把一篇文章扔給所有分類器,第一個分類器會投票說它是“1”或者“2”,第二個會說它是“1”或者“3”,讓每一個都投上自己的一票,最后統(tǒng)計票數(shù),如果類別“1”得票最多,就判這篇文章屬于第1類。這種方法顯然也會有分類重疊的現(xiàn)象,但不會有不可分類現(xiàn)象,因為總不可能所有類別的票數(shù)都是0。看起來夠好么?其實不然,想想分類一篇文章,我們調(diào)用了多少個分類器?10個,這還是類別數(shù)為5的時候,類別數(shù)如果是1000,要調(diào)用的分類器數(shù)目會上升至約500,000個(類別數(shù)的平方量級)。這如何是好?

            看來我們必須再退一步,在分類的時候下功夫,我們還是像一對一方法那樣來訓(xùn)練,只是在對一篇文章進(jìn)行分類之前,我們先按照下面圖的樣子來組織分類器(如你所見,這是一個有向無環(huán)圖,因此這種方法也叫做DAG SVM)

            這樣在分類時,我們就可以先問分類器“1對5”(意思是它能夠回答“是第1類還是第5類”),如果它回答5,我們就往左走,再問“2對5”這個分類器,如果它還說是“5”,我們就繼續(xù)往左走,這樣一直問下去,就可以得到分類結(jié)果。好處在哪?我們其實只調(diào)用了4個分類器(如果類別數(shù)是k,則只調(diào)用k-1個),分類速度飛快,且沒有分類重疊和不可分類現(xiàn)象!缺點在哪?假如最一開始的分類器回答錯誤(明明是類別1的文章,它說成了5),那么后面的分類器是無論如何也無法糾正它的錯誤的(因為后面的分類器壓根沒有出現(xiàn)“1”這個類別標(biāo)簽),其實對下面每一層的分類器都存在這種錯誤向下累積的現(xiàn)象。。

            不過不要被DAG方法的錯誤累積嚇倒,錯誤累積在一對其余和一對一方法中也都存在,DAG方法好于它們的地方就在于,累積的上限,不管是大是小,總是有定論的,有理論證明。而一對其余和一對一方法中,盡管每一個兩類分類器的泛化誤差限是知道的,但是合起來做多類分類的時候,誤差上界是多少,沒人知道,這意味著準(zhǔn)確率低到0也是有可能的,這多讓人郁悶。

            而且現(xiàn)在DAG方法根節(jié)點的選取(也就是如何選第一個參與分類的分類器),也有一些方法可以改善整體效果,我們總希望根節(jié)點少犯錯誤為好,因此參與第一次分類的兩個類別,最好是差別特別特別大,大到以至于不太可能把他們分錯;或者我們就總?cè)≡趦深惙诸愔姓_率最高的那個分類器作根節(jié)點,或者我們讓兩類分類器在分類的時候,不光輸出類別的標(biāo)簽,還輸出一個類似“置信度”的東東,當(dāng)它對自己的結(jié)果不太自信的時候,我們就不光按照它的輸出走,把它旁邊的那條路也走一走,等等。

            大Tips:SVM的計算復(fù)雜度

            使用SVM進(jìn)行分類的時候,實際上是訓(xùn)練和分類兩個完全不同的過程,因而討論復(fù)雜度就不能一概而論,我們這里所說的主要是訓(xùn)練階段的復(fù)雜度,即解那個二次規(guī)劃問題的復(fù)雜度。對這個問題的解,基本上要劃分為兩大塊,解析解和數(shù)值解。

            解析解就是理論上的解,它的形式是表達(dá)式,因此它是精確的,一個問題只要有解(無解的問題還跟著摻和什么呀,哈哈),那它的解析解是一定存在的。當(dāng)然存在是一回事,能夠解出來,或者可以在可以承受的時間范圍內(nèi)解出來,就是另一回事了。對SVM來說,求得解析解的時間復(fù)雜度最壞可以達(dá)到O(Nsv3),其中Nsv是支持向量的個數(shù),而雖然沒有固定的比例,但支持向量的個數(shù)多少也和訓(xùn)練集的大小有關(guān)。

            數(shù)值解就是可以使用的解,是一個一個的數(shù),往往都是近似解。求數(shù)值解的過程非常像窮舉法,從一個數(shù)開始,試一試它當(dāng)解效果怎樣,不滿足一定條件(叫做停機條件,就是滿足這個以后就認(rèn)為解足夠精確了,不需要繼續(xù)算下去了)就試下一個,當(dāng)然下一個數(shù)不是亂選的,也有一定章法可循。有的算法,每次只嘗試一個數(shù),有的就嘗試多個,而且找下一個數(shù)字(或下一組數(shù))的方法也各不相同,停機條件也各不相同,最終得到的解精度也各不相同,可見對求數(shù)值解的復(fù)雜度的討論不能脫開具體的算法。

            一個具體的算法,Bunch-Kaufman訓(xùn)練算法,典型的時間復(fù)雜度在O(Nsv3+LNsv2+dLNsv)和O(dL2)之間,其中Nsv是支持向量的個數(shù),L是訓(xùn)練集樣本的個數(shù),d是每個樣本的維數(shù)(原始的維數(shù),沒有經(jīng)過向高維空間映射之前的維數(shù))。復(fù)雜度會有變化,是因為它不光跟輸入問題的規(guī)模有關(guān)(不光和樣本的數(shù)量,維數(shù)有關(guān)),也和問題最終的解有關(guān)(即支持向量有關(guān)),如果支持向量比較少,過程會快很多,如果支持向量很多,接近于樣本的數(shù)量,就會產(chǎn)生O(dL2)這個十分糟糕的結(jié)果(給10,000個樣本,每個樣本1000維,基本就不用算了,算不出來,呵呵,而這種輸入規(guī)模對文本分類來說太正常了)。

            這樣再回頭看就會明白為什么一對一方法盡管要訓(xùn)練的兩類分類器數(shù)量多,但總時間實際上比一對其余方法要少了,因為一對其余方法每次訓(xùn)練都考慮了所有樣本(只是每次把不同的部分劃分為正類或者負(fù)類而已),自然慢上很多。

            posted on 2012-08-06 16:58 SunRise_at 閱讀(47019) 評論(39)  編輯 收藏 引用 所屬分類: 人工智能

            評論

            # re: SVM算法入門 2012-08-06 17:37 C小加
            支持一下  回復(fù)  更多評論
              

            # re: SVM算法入門 2012-08-06 22:44 小馬甲
            高科技  回復(fù)  更多評論
              

            # re: SVM算法入門 2012-08-07 11:10 SunRise_at
            其實我也不怎么懂啊@小馬甲
              回復(fù)  更多評論
              

            # re: SVM算法入門 2012-08-07 15:51 SunRise_at
            終于看完了,累@C小加
              回復(fù)  更多評論
              

            # re: SVM算法入門[未登錄] 2012-10-20 18:26 123
            大神,膜拜之  回復(fù)  更多評論
              

            # re: SVM算法入門[未登錄] 2012-10-29 14:36 點滴
            慢慢看!  回復(fù)  更多評論
              

            # re: SVM算法入門 2012-10-30 22:13 braid
            說的淺顯易懂,受教了  回復(fù)  更多評論
              

            # re: SVM算法入門 2013-04-01 21:07 junjieobba
            講得很詳細(xì),謝謝了。。  回復(fù)  更多評論
              

            # re: SVM算法入門 2013-04-20 16:43 kmala
            很詳細(xì),謝謝  回復(fù)  更多評論
              

            # re: SVM算法入門 2013-06-08 00:14 zzj
            謝謝你,,我這么笨的孩紙都看的進(jìn)去,而且看懂了,哇哈哈哈,好開心  回復(fù)  更多評論
              

            # re: SVM算法入門[未登錄] 2013-06-19 17:04 sarah
            怎么確定松弛變量呀?  回復(fù)  更多評論
              

            # re: SVM算法入門 2013-06-23 18:59 shuxu
            膜拜, 可否請你加我QQ 2384794827? 有問題請教:)  回復(fù)  更多評論
              

            # re: SVM算法入門 2013-07-10 09:50 crussor
            把復(fù)雜問題解釋的淺顯易懂。
            請問在實際應(yīng)用的時候都是用什么工具實現(xiàn)訓(xùn)練的,不會是完全自己從頭寫吧?如何分析問題,建立模型,準(zhǔn)備數(shù)據(jù),選擇工具,進(jìn)行訓(xùn)練,檢驗驗證?能舉一個例子說明就更棒了!

            另外再加上一些延伸的閱讀材料和參考文獻(xiàn),就是一個很不錯的文章了。
            比許多大學(xué)和研究所教授和研究員的文章更有意義。
            這樣的文章更有利于普及知識。  回復(fù)  更多評論
              

            # re: sVM算法入門 2013-11-20 16:05 pharaoh
            在我眼里,你太神了,我要要好好像你學(xué)習(xí),你是怎么做到的呀?
              回復(fù)  更多評論
              

            # re: SVM算法入門 2013-11-28 17:47 naice
            請問libsvm里怎么輸出每個樣本到超平面的距離呢?  回復(fù)  更多評論
              

            # re: SVM算法入門 2013-12-14 20:45 kehan
            雖然“SVM入門(六)線性分類器的求解——問題的轉(zhuǎn)化,直觀角度”,這里面的簡化過程不是很嚴(yán)格,但是能用這么淺顯的方式,將它的思想表露出來,我十分佩服。 一萬個贊。  回復(fù)  更多評論
              

            # re: SVM算法入門[未登錄] 2014-02-16 15:43 jeff
            厲害,厲害,希望多出這種文章  回復(fù)  更多評論
              

            # re: SVM算法入門 2014-03-06 17:10 yasin
            長知識了,謝謝博主分享。  回復(fù)  更多評論
              

            # re: SVM算法入門 2014-04-20 19:39 elitetao
            樓主講的真好,剛看完第一部分,忍不住注冊了個賬號先支持下,然后繼續(xù)看~謝謝哦~  回復(fù)  更多評論
              

            # re: SVM算法入門 2014-04-21 08:55 elitetao
            今天早上把沒看完的繼續(xù)看完了,樓主講的淺顯易懂,佩服佩服,適合我這種數(shù)學(xué)白癡,還是SVM入門級的學(xué)習(xí)~謝謝嘍~  回復(fù)  更多評論
              

            # re: SVM算法入門 2014-05-26 22:50 heavencv
            請問,怎么確定支撐向量呢?最優(yōu)分類面未知,如何確定哪些樣本是支撐向量呢  回復(fù)  更多評論
              

            # re: SVM算法入門 2014-06-02 12:13 Jenny
            非常好  回復(fù)  更多評論
              

            # re: SVM算法入門 2014-06-06 19:47 cxt
            大贊!  回復(fù)  更多評論
              

            # re: SVM算法入門[未登錄] 2014-07-02 09:23 goodJob
            博主寫的非常好,說真心話,看了這么多解說svm的文章里,只有博主的文章理解起來容易些,而且內(nèi)容卻不比他們少,解釋的也清楚  回復(fù)  更多評論
              

            # re: SVM算法入門[未登錄] 2014-07-19 10:44 maybe
            寫的真好,看了兩天別的都不如這個講的容易理解  回復(fù)  更多評論
              

            # re: SVM算法入門 2015-03-14 10:35 毛毛雨
            厲害  回復(fù)  更多評論
              

            # re: SVM算法入門[未登錄] 2015-03-17 20:37 louis
            總算看完了,sunrise!  回復(fù)  更多評論
              

            # re: SVM算法入門 2015-03-31 14:47 小李子
            在第6部分中,為什么w直接就表示成了樣本的特征和標(biāo)簽的線性組合啊?這顯然沒有說服力啊
            還有前面有一個地方為什么要把間隔定義成1呢?  回復(fù)  更多評論
              

            # re: SVM算法入門 2015-04-03 15:04 Caroline
            第二次看了,博主非常棒  回復(fù)  更多評論
              

            # re: SVM算法入門 2015-04-04 10:56 全球
            好  回復(fù)  更多評論
              

            # re: SVM算法入門 2015-04-07 09:42 hcw
            SVM入門(三)線性分類器Part 2 中提到的誤分次數(shù)與間隔之間的關(guān)系,是指經(jīng)驗還是實際誤分次數(shù)

              回復(fù)  更多評論
              

            # re: SVM算法入門 2015-04-07 15:55 Yeesun
            非常感謝樓主,完全看明白了,大牛  回復(fù)  更多評論
              

            # re: SVM算法入門 2015-04-10 22:49 yangxiaochun
            給贊!!!  回復(fù)  更多評論
              

            # re: SVM算法入門 2015-04-14 11:48 pengalg
            寫得非常好 ~
            弱問: “教課書里都列過,我就不敲了” 這個教科書具體是哪本呀? 拜謝!   回復(fù)  更多評論
              

            # re: SVM算法入門 2015-04-18 21:27 syfly2014
            真心寫的不錯,非常詳細(xì)。  回復(fù)  更多評論
              

            # re: SVM算法入門 2015-05-18 08:31 yangming
            還沒看完,但是覺得寫的很棒,謝謝分享!  回復(fù)  更多評論
              

            # re: SVM算法入門[未登錄] 2015-06-05 00:54 li
            第一次接觸SVM,花了不少時間看完文章(博主也是不容易呀!)。雖然部分細(xì)節(jié)沒搞懂,但是大體了解了SVM。感謝博主的分享,寫得很棒哈!!  回復(fù)  更多評論
              

            # re: SVM算法入門 2015-08-25 21:52 超級保鏢
            點個贊!通俗易懂!  回復(fù)  更多評論
              

            # re: SVM算法入門 2015-09-02 09:54 鄭郁正
            很好的文章,基本上理解了SVM。謝謝  回復(fù)  更多評論
              

            久久国产一片免费观看| 久久福利资源国产精品999| 亚洲精品乱码久久久久久中文字幕 | 99久久无色码中文字幕| 2021国内精品久久久久久影院| 99久久国产综合精品五月天喷水| 国内精品久久久久| 久久久精品2019免费观看| 天堂久久天堂AV色综合| 香蕉久久夜色精品升级完成| 无码久久精品国产亚洲Av影片 | 免费一级欧美大片久久网| 久久99精品久久久久久噜噜| 日本精品久久久久中文字幕| 99精品久久久久久久婷婷| 国内精品伊人久久久久影院对白| 久久久国产精华液| 怡红院日本一道日本久久| 久久性精品| 亚洲精品国精品久久99热一| 欧美大香线蕉线伊人久久| 国产亚洲精品美女久久久| 香港aa三级久久三级| 久久久黄片| 亚洲AV日韩精品久久久久久 | 99久久99这里只有免费费精品 | 色综合久久天天综合| 久久性精品| 久久久久久夜精品精品免费啦| 26uuu久久五月天| 亚洲国产成人久久精品99| AV无码久久久久不卡蜜桃| 97超级碰碰碰久久久久| 2020最新久久久视精品爱| 国产精品久久久香蕉| 国产一区二区三区久久| 天天影视色香欲综合久久| 久久精品a亚洲国产v高清不卡| 久久国产福利免费| 久久综合给久久狠狠97色| 国产综合免费精品久久久|