前言,一些必要的說明
如果你精通機器學(xué)習(xí)算法,或高數(shù)極好,熱愛數(shù)學(xué)推理和公式——那么這篇文章不適合你。寫這篇的初衷是:SVM是一個經(jīng)典的機器學(xué)習(xí)算法,在面試?yán)镆步?jīng)常被考到,所以我希望自己能夠了解到它最核心的一部分理論,并且可以使用在簡單的算例里。然而,我在搜索引擎上所見到的所有講SVM的文章里,都太過于重視推導(dǎo)了(其實還是因為自己數(shù)學(xué)太渣),密密麻麻的公式一層層邏輯嚴(yán)謹(jǐn)?shù)赝葡聛?,我一定跟不到最后就已?jīng)繞暈在符號的海洋里。所以,我決定把自己所學(xué)到的SVM用淺顯的語言表訴出來,在寫的過程中也加深一下自己的理解,何樂而不為呢?那么現(xiàn)在就開始吧。
若有內(nèi)容不清晰或錯誤請指出,鞠躬。
SVM是什么?
"在問為什么之前,先要明白是什么。"
SVM的英語是 Support Vector Machine,字面意思直接翻譯過來就是支持向量機,其中machine是指算法,而support vector就是這個算法中非常重要的部分——待會兒會講。
這個支持向量機做的事情,就是二分類——黑的一類,白的一類;叉號一類,圓的一類,好的一類,壞的一類……等等。二分類問題是常見的機器學(xué)習(xí)問題,而我們知道:在一個平面上有兩堆點的時候,而這兩堆點又分得很開的時候,一條直線就足夠把它們劃分開。這里面的代表性算法就是線性判別分析(LDA)模型。線性SVM在二位空間里做的也是一樣的事。
那我們先從線性SVM講起。
引入一個簡單的小公式——初中難度:
好吧比初中稍微難一點,多的部分就是矩陣運算。但是本質(zhì)上跟y = ax + b 是一樣的。在這個過程中我們需要找到a 和 b的值——在線性判別分析里,這個值是學(xué)到的,而在SVM里,這個值是通過數(shù)學(xué)計算得到的。計算的過程我們待會兒再講,先來說一下SVM基本思路:
我們想要找到一個合適的分類超平面(在平面是一條直線),把所有數(shù)據(jù)分成兩類:我們希望所有叉號圖案在一類里,所有圓形在另一類里。
看下面的這張圖,你覺得哪條線表現(xiàn)更好?
兩條線都成功分開了這兩堆數(shù)據(jù)(本來也分得很開……)但是顯然實線更出色,因為它不僅正確分開了不同類的數(shù)據(jù),還離兩邊都足夠遠(yuǎn)。
現(xiàn)在我們來談?wù)劄槭裁矗?/em>
現(xiàn)在可以給SVM下一個定義了(兩步走):
- SVM是尋找到一個超平面把數(shù)據(jù)準(zhǔn)確分成兩類;
- 并且這個超平面要離兩類數(shù)據(jù)最近的數(shù)據(jù)點越遠(yuǎn)越好。
聰明的你大概已經(jīng)猜到所謂的“支持向量”是什么東西了——沒錯!它就是兩堆數(shù)據(jù)中距離最近的點(或點們),那些最容易混淆的點。
那么怎么判斷超平面離這些點的距離是遠(yuǎn)還是很遠(yuǎn)還是非常遠(yuǎn)還是不夠遠(yuǎn)呢?這里需要引入一個小概念——間距——就是衡量超平面到支持向量的距離。
那么,請牢牢記住現(xiàn)在我們的兩個小目標(biāo):
1. 二分類的過程中類別不能錯。
2. 找到間距最大的那個超平面。
好啦,如果你不需要任何算法方面的要求,只需要直接用工具包/吹牛/了解一下的話,你對SVM的了解已經(jīng)夠了。再見!
廢話太多,開始線性SVM
萬事開頭難,我們先從簡單的開始。
剛才的式子還記得吧。x是我們輸入的數(shù)據(jù),y是數(shù)據(jù)標(biāo)簽。我們當(dāng)然希望:在我們超平面(好啦,這條普普通通的直線)一邊的所有x得到的y值,都大于零;在另一邊的y,都小于零;在這條線上,都等于零。完美!
可是怎么才能得到這條線呢?
我們在這條線旁邊又平行地畫兩條線,這樣:
這兩條線是畫在支持向量上的,而我們最終要的超平面(線……)就在這兩條線的正中間,想想很好理解吧?這樣就能保證間距最大啊。
所以我們現(xiàn)在需要的就成了:在兩條線上的點,一邊y等于1,另一邊等于-1(為什么是1不是0.5/0.2/0.0001?因為比較方便……)其它離得更遠(yuǎn)的點,那就可以往正負(fù)無窮隨意延申。
現(xiàn)在我們來加一點美妙的數(shù)學(xué)!千萬不要跳!保證能懂!
把上面的文字轉(zhuǎn)化成數(shù)學(xué)語言:
曾有一位偉大的哲學(xué)家說過,少即是多,一個總比兩個好(編的)。兩個式子總得統(tǒng)一起來才好進(jìn)行接下來的推導(dǎo),不然還得分情況。于是我們用到了小學(xué)數(shù)學(xué):負(fù)負(fù)得正!
耶!解決了,現(xiàn)在這個值無論如何都得是大于1的正數(shù)了。
還記不記得上面提到的兩個條件?現(xiàn)在條件一的求解公式有了,還剩下條件二了。
我們的間距怎么求呢?
一個簡單的小公式。
一道杠的又是小學(xué)知識,是y的絕對值,兩道杠就是模,(好像初中學(xué)的?)是向量的長度。這么做的原因是當(dāng)數(shù)據(jù)等比例擴(kuò)大或縮小的時候,我們的間距也會具有比較意義(不然你每個值同時乘以二距離變四倍了其實一點意義都沒有。)
對于支持向量而言,它們距離超平面的間距就是:
我們想要這個Z值最大,那||w||就得最小,OK了~
現(xiàn)在兩個小目標(biāo)的求解條件都列出來了:
現(xiàn)在我們要再多加一點兒美妙的數(shù)學(xué)……相信自己,你可以的
恭喜你剛剛跟我一起走完了第一步:列出求解公式!
這個公式是一個帶約束的優(yōu)化問題。這個公式的求解可以用美妙的拉格朗日乘子法來解決~(回想起被高數(shù)的陰影籠罩的日子……)
好啦沒事,你大概跟我一樣也不記得這到底是個什么東西,簡單地說,就是:
把等式約束h_i(x)用一個系數(shù)與f(x)寫為一個式子,稱為拉格朗日函數(shù),而系數(shù)稱為拉格朗日乘子。通過拉格朗日函數(shù)對各個變量求導(dǎo),令其為零,可以求得候選值集合,然后驗證求得最優(yōu)值。
說人話,就是引入一個系數(shù)把上面式子的兩部分統(tǒng)一起來,然后對每個變量求偏導(dǎo),然后從幾個可能結(jié)果里找到最優(yōu)值。再簡單點,就是求偏導(dǎo)啦。
再最后看一眼上面的式子:
這里面我們想要優(yōu)化的變量有哪些呢?
變量x和y是沒辦法優(yōu)化了,你還能改數(shù)據(jù)咋的?可以優(yōu)化的部分就是我們要的系數(shù)wt,w0(原諒我,打公式好累)
再加上一個拉格朗日系數(shù),套公式,好了:
這里的λi都是正數(shù),我們現(xiàn)在的目標(biāo)是要求L的最小值。
接下來就是一些簡單的偏導(dǎo)計算啦:我們先對w求偏導(dǎo),令結(jié)果為0;然后對w0求偏導(dǎo),令結(jié)果為0 。(偏導(dǎo)的過程也不是很難……就……高數(shù)上冊了解一下?)
這樣我們就得到了λ和x,y的兩個約束關(guān)系式。然后我們還有兩個條件:在上面的拉格朗日約束式里,第一項一定是非負(fù)的,第二項我們需要它越小越好這樣才能得到總體結(jié)果的最小值。以及λ需要非負(fù)(不然就沒有意義了)。
所以,我們把四個求解條件匯總一下:
恭喜你終于走到了這里!你看現(xiàn)在問題是不是已經(jīng)很簡單了?只需要求這三個線性的等式再加上滿足第四個條件,我們就可以得出λ,w和w0的值了!
美妙的數(shù)學(xué)!
對上述可能結(jié)果的進(jìn)一步說明
假如說我們算出來所有的λi都等于零,說明什么?
說明這個問題沒辦法用支持向量機解決因為不存在支持向量。
我們再來看一下第三個約束條件:
說明什么?
說明求解w只與支持向量有關(guān)啊!
Talk is CHEAP, show me the example!
我們來學(xué)以致用,用一道簡單的例題來幫助我們更好地理解線性SVM模型,光學(xué)公式是永遠(yuǎn)不會用滴!
Example is here :)
現(xiàn)在我在平面上有八個點,分別落在class1 和class2里:
在二維坐標(biāo)里作圖是這樣的:
我們?nèi)庋垡豢矗?strong>線性可分吶!SVM可以用了!
那我們就來設(shè)計一個簡單的線性分類器吧。
首先,找出處在邊界上的點,啊不對,支持向量:
這三個向量的λ(按照順序數(shù)下來是向量1,2,5)我們是需要求解的,其他的向量我們就不管了。
我們定義黑色點的標(biāo)簽值為1,紅色為-1.
然后愉快地帶公式到上面四個約束條件里~
開始。
得到:
但是現(xiàn)在還沒有什么用,我們只是知道了要想求w就得先求出三個λ值。那么怎么求呢?我們來看一下約束條件。
因為:
可得三個聯(lián)立公式(做一下矩陣運算把x,y帶進(jìn)去,注意y正負(fù)號,我這里把步驟都省略了),化簡得:
再帶入
得到:
然后就是愉快地求解四元一次方程啦~
得到三個λi值以后,再帶入第一個式子得到w值,完成。
嗯……嗯????x = 2!!!你在逗我?這個我一秒鐘肉眼就看出來了!解那么多方程干嘛!
好啦不好意思,例題只是說明一種方法……逃
————————————————————————————————————————————
拖了一周多了,來填坑~
線性不太可分的軟邊界SVM
以上我們得出了超平面,很好那來了一個新數(shù)據(jù)只要帶進(jìn)去算一下,看看是不是等于1或者-1就好了呢。
這里有兩種分類法:硬分類和軟分類。
硬分類就是只要大于0我就把它丟掉一類,小于零就丟進(jìn)另一類;軟分類就是把-1-1之間這個區(qū)間做一下平滑處理,具體的分類還要根據(jù)函數(shù)值決定。
下一個問題是,哪有數(shù)據(jù)每次都正好全都可以分開呢?萬一,兩組數(shù)據(jù)正好有幾個點出現(xiàn)在離邊界點比較近的地方怎么辦?
答案就是:條件稍微放寬一點啦。
比如上面這張圖片里的,出現(xiàn)了幾個壞家伙,雖然大部分?jǐn)?shù)據(jù)都是特征鮮明地出現(xiàn)在兩類里,也不太能夠找到合適的分界面。
這些數(shù)據(jù)我們可以分成三類:
- 老老實實呆在離支持向量很遠(yuǎn)的。
- 不是很老實,已經(jīng)超越了支持向量的邊界,但總的來說還處在正確的分類中。
- 越過了超平面,去到了它并不屬于的另一類里。
值都沒有超過1,只不過程度不同,所以我們可以用一個式子來把這三種情況統(tǒng)一起來(一個總比兩個好)。
咦,這里出現(xiàn)了一個長尾巴,不要慌,它叫做松弛變量。松弛呢,就是指要是不滿足條件的話,我把要求稍微給你降一下,不要求你一定得大于1了。對于以上三種情況,松弛變量的結(jié)果也不一樣。對于情況1就是0,對于情況3就要大于1了。
但是雖然要求降了,也不能沒有底線啊。
我們的底線肯定是,錯一個兩個可以忍,錯多了就不行。用數(shù)學(xué)來表達(dá),就是
這些松弛變量的和必須最小。
以上這個SVM的思想,就叫做軟邊界SVM。
接下來需要加一點兒美妙……的數(shù)學(xué)
所以現(xiàn)在我們的超平面求解公式就要加上松弛變量的影響了。
其實不要被這個式子嚇到了,返回去看看線性可分SVM,就是多了一些限制條件而已。這個式子里沒有出現(xiàn)過的內(nèi)容就是C了,但它也不是一個高大上的東西,只是代表一個常數(shù),用來控制松弛變量部分的影響。簡單來說就是,這個C值越大,說明松弛變量看得越重,那錯誤分類的容忍度就越小。
老規(guī)矩,還是要用拉格朗日乘子來求解。
μ是對ξ的系數(shù),剩下的就跟之前的簡單式子差不多~(說得很輕松的樣子,其實是因為我快陣亡了)
但是不要慌,雖然變量這么多,我們來看看求偏導(dǎo)。
對w求偏導(dǎo),很好,跟松弛變量沒關(guān)系,所以結(jié)果還是一樣。對w0求偏導(dǎo)也是。
再對ξ求偏導(dǎo),會得到一個簡單的式子。
μ不需要求導(dǎo)了,只要代入就好,所以結(jié)果變成了:
非線性SVM
那么你要問了,上面的例子都是可以直接線性可分,或者大部分都可分的,但是萬一有那種完全不能用一個超平面直接分開的呢?
待續(xù)……