前言哺呜,一些必要的說明
如果你精通機器學習算法,或高數(shù)極好箕戳,熱愛數(shù)學推理和公式——那么這篇文章不適合你某残。寫這篇的初衷是:SVM是一個經(jīng)典的機器學習算法,在面試里也經(jīng)常被考到陵吸,所以我希望自己能夠了解到它最核心的一部分理論玻墅,并且可以使用在簡單的算例里。然而壮虫,我在搜索引擎上所見到的所有講SVM的文章里澳厢,都太過于重視推導了(其實還是因為自己數(shù)學太渣),密密麻麻的公式一層層邏輯嚴謹?shù)赝葡聛恚乙欢ǜ坏阶詈缶鸵呀?jīng)繞暈在符號的海洋里剩拢。所以线得,我決定把自己所學到的SVM用淺顯的語言表訴出來,在寫的過程中也加深一下自己的理解裸扶,何樂而不為呢框都?那么現(xiàn)在就開始吧。
若有內(nèi)容不清晰或錯誤請指出呵晨,鞠躬魏保。
SVM是什么?
"在問為什么之前摸屠,先要明白是什么谓罗。"
SVM的英語是 Support Vector Machine,字面意思直接翻譯過來就是支持向量機季二,其中machine是指算法檩咱,而support vector就是這個算法中非常重要的部分——待會兒會講。
這個支持向量機做的事情胯舷,就是二分類——黑的一類刻蚯,白的一類;叉號一類桑嘶,圓的一類炊汹,好的一類,壞的一類……等等逃顶。二分類問題是常見的機器學習問題讨便,而我們知道:在一個平面上有兩堆點的時候,而這兩堆點又分得很開的時候以政,一條直線就足夠把它們劃分開霸褒。這里面的代表性算法就是線性判別分析(LDA)模型。線性SVM在二位空間里做的也是一樣的事盈蛮。
那我們先從線性SVM講起废菱。
引入一個簡單的小公式——初中難度:
好吧比初中稍微難一點,多的部分就是矩陣運算抖誉。但是本質(zhì)上跟y = ax + b 是一樣的殊轴。在這個過程中我們需要找到a 和 b的值——在線性判別分析里,這個值是學到的寸五,而在SVM里梳凛,這個值是通過數(shù)學計算得到的耿币。計算的過程我們待會兒再講梳杏,先來說一下SVM基本思路:
我們想要找到一個合適的分類超平面(在平面是一條直線),把所有數(shù)據(jù)分成兩類:我們希望所有叉號圖案在一類里,所有圓形在另一類里十性。
看下面的這張圖叛溢,你覺得哪條線表現(xiàn)更好?
兩條線都成功分開了這兩堆數(shù)據(jù)(本來也分得很開……)但是顯然實線更出色劲适,因為它不僅正確分開了不同類的數(shù)據(jù)楷掉,還離兩邊都足夠遠。
現(xiàn)在我們來談?wù)劄槭裁矗?/em>
現(xiàn)在可以給SVM下一個定義了(兩步走):
- SVM是尋找到一個超平面把數(shù)據(jù)準確分成兩類霞势;
- 并且這個超平面要離兩類數(shù)據(jù)最近的數(shù)據(jù)點越遠越好烹植。
聰明的你大概已經(jīng)猜到所謂的“支持向量”是什么東西了——沒錯!它就是兩堆數(shù)據(jù)中距離最近的點(或點們)愕贡,那些最容易混淆的點草雕。
那么怎么判斷超平面離這些點的距離是遠還是很遠還是非常遠還是不夠遠呢?這里需要引入一個小概念——間距——就是衡量超平面到支持向量的距離固以。
那么墩虹,請牢牢記住現(xiàn)在我們的兩個小目標:
1. 二分類的過程中類別不能錯。
2. 找到間距最大的那個超平面憨琳。
好啦诫钓,如果你不需要任何算法方面的要求,只需要直接用工具包/吹牛/了解一下的話篙螟,你對SVM的了解已經(jīng)夠了菌湃。再見!
廢話太多闲擦,開始線性SVM
萬事開頭難慢味,我們先從簡單的開始。
剛才的式子還記得吧墅冷。x是我們輸入的數(shù)據(jù)纯路,y是數(shù)據(jù)標簽。我們當然希望:在我們超平面(好啦寞忿,這條普普通通的直線)一邊的所有x得到的y值驰唬,都大于零;在另一邊的y腔彰,都小于零叫编;在這條線上,都等于零霹抛。完美搓逾!
可是怎么才能得到這條線呢?
我們在這條線旁邊又平行地畫兩條線杯拐,這樣:
這兩條線是畫在支持向量上的搅幅,而我們最終要的超平面(線……)就在這兩條線的正中間,想想很好理解吧践美?這樣就能保證間距最大啊。
所以我們現(xiàn)在需要的就成了:在兩條線上的點污淋,一邊y等于1,另一邊等于-1(為什么是1不是0.5/0.2/0.0001余掖?因為比較方便……)其它離得更遠的點寸爆,那就可以往正負無窮隨意延申。
現(xiàn)在我們來加一點美妙的數(shù)學盐欺!千萬不要跳赁豆!保證能懂!
把上面的文字轉(zhuǎn)化成數(shù)學語言:
曾有一位偉大的哲學家說過冗美,少即是多歌憨,一個總比兩個好(編的)。兩個式子總得統(tǒng)一起來才好進行接下來的推導墩衙,不然還得分情況务嫡。于是我們用到了小學數(shù)學:負負得正!
耶漆改!解決了心铃,現(xiàn)在這個值無論如何都得是大于1的正數(shù)了。
還記不記得上面提到的兩個條件挫剑?現(xiàn)在條件一的求解公式有了去扣,還剩下條件二了。
我們的間距怎么求呢樊破?
一個簡單的小公式愉棱。
一道杠的又是小學知識,是y的絕對值哲戚,兩道杠就是模奔滑,(好像初中學的?)是向量的長度顺少。這么做的原因是當數(shù)據(jù)等比例擴大或縮小的時候朋其,我們的間距也會具有比較意義(不然你每個值同時乘以二距離變四倍了其實一點意義都沒有。)
對于支持向量而言脆炎,它們距離超平面的間距就是:
我們想要這個Z值最大梅猿,那||w||就得最小,OK了~
現(xiàn)在兩個小目標的求解條件都列出來了:
現(xiàn)在我們要再多加一點兒美妙的數(shù)學……相信自己几蜻,你可以的
恭喜你剛剛跟我一起走完了第一步:列出求解公式喇潘!
這個公式是一個帶約束的優(yōu)化問題爽撒。這個公式的求解可以用美妙的拉格朗日乘子法來解決~(回想起被高數(shù)的陰影籠罩的日子……)
好啦沒事,你大概跟我一樣也不記得這到底是個什么東西响蓉,簡單地說,就是:
把等式約束h_i(x)用一個系數(shù)與f(x)寫為一個式子哨毁,稱為拉格朗日函數(shù)枫甲,而系數(shù)稱為拉格朗日乘子。通過拉格朗日函數(shù)對各個變量求導扼褪,令其為零想幻,可以求得候選值集合,然后驗證求得最優(yōu)值话浇。
說人話脏毯,就是引入一個系數(shù)把上面式子的兩部分統(tǒng)一起來,然后對每個變量求偏導幔崖,然后從幾個可能結(jié)果里找到最優(yōu)值食店。再簡單點,就是求偏導啦赏寇。
再最后看一眼上面的式子:
這里面我們想要優(yōu)化的變量有哪些呢吉嫩?
變量x和y是沒辦法優(yōu)化了,你還能改數(shù)據(jù)咋的嗅定?可以優(yōu)化的部分就是我們要的系數(shù)wt自娩,w0(原諒我,打公式好累)
再加上一個拉格朗日系數(shù)渠退,套公式忙迁,好了:
這里的λi都是正數(shù),我們現(xiàn)在的目標是要求L的最小值碎乃。
接下來就是一些簡單的偏導計算啦:我們先對w求偏導姊扔,令結(jié)果為0;然后對w0求偏導梅誓,令結(jié)果為0 旱眯。(偏導的過程也不是很難……就……高數(shù)上冊了解一下?)
這樣我們就得到了λ和x,y的兩個約束關(guān)系式证九。然后我們還有兩個條件:在上面的拉格朗日約束式里删豺,第一項一定是非負的,第二項我們需要它越小越好這樣才能得到總體結(jié)果的最小值愧怜。以及λ需要非負(不然就沒有意義了)呀页。
所以,我們把四個求解條件匯總一下:
恭喜你終于走到了這里拥坛!你看現(xiàn)在問題是不是已經(jīng)很簡單了?只需要求這三個線性的等式再加上滿足第四個條件蓬蝶,我們就可以得出λ尘分,w和w0的值了!
美妙的數(shù)學丸氛!
對上述可能結(jié)果的進一步說明
假如說我們算出來所有的λi都等于零培愁,說明什么?
說明這個問題沒辦法用支持向量機解決因為不存在支持向量缓窜。
我們再來看一下第三個約束條件:
說明什么定续?
說明求解w只與支持向量有關(guān)啊禾锤!
Talk is CHEAP, show me the example!
我們來學以致用私股,用一道簡單的例題來幫助我們更好地理解線性SVM模型,光學公式是永遠不會用滴恩掷!
Example is here :)
現(xiàn)在我在平面上有八個點倡鲸,分別落在class1 和class2里:
在二維坐標里作圖是這樣的:
我們?nèi)庋垡豢矗?strong>線性可分吶黄娘!SVM可以用了峭状!
那我們就來設(shè)計一個簡單的線性分類器吧。
首先逼争,找出處在邊界上的點宁炫,啊不對,支持向量:
這三個向量的λ(按照順序數(shù)下來是向量1氮凝,2羔巢,5)我們是需要求解的,其他的向量我們就不管了罩阵。
我們定義黑色點的標簽值為1竿秆,紅色為-1.
然后愉快地帶公式到上面四個約束條件里~
開始。
得到:
但是現(xiàn)在還沒有什么用稿壁,我們只是知道了要想求w就得先求出三個λ值幽钢。那么怎么求呢?我們來看一下約束條件傅是。
因為:
可得三個聯(lián)立公式(做一下矩陣運算把x匪燕,y帶進去,注意y正負號喧笔,我這里把步驟都省略了)帽驯,化簡得:
再帶入
得到:
然后就是愉快地求解四元一次方程啦~
得到三個λi值以后,再帶入第一個式子得到w值书闸,完成尼变。
嗯……嗯?浆劲?嫌术?哀澈?x = 2!6绕割按!你在逗我?這個我一秒鐘肉眼就看出來了磷籍!解那么多方程干嘛适荣!
好啦不好意思,例題只是說明一種方法……逃
————————————————————————————————————————————
拖了一周多了择示,來填坑~
線性不太可分的軟邊界SVM
以上我們得出了超平面,很好那來了一個新數(shù)據(jù)只要帶進去算一下晒旅,看看是不是等于1或者-1就好了呢栅盲。
這里有兩種分類法:硬分類和軟分類。
硬分類就是只要大于0我就把它丟掉一類废恋,小于零就丟進另一類谈秫;軟分類就是把-1-1之間這個區(qū)間做一下平滑處理,具體的分類還要根據(jù)函數(shù)值決定鱼鼓。
下一個問題是拟烫,哪有數(shù)據(jù)每次都正好全都可以分開呢?萬一迄本,兩組數(shù)據(jù)正好有幾個點出現(xiàn)在離邊界點比較近的地方怎么辦硕淑?
答案就是:條件稍微放寬一點啦。
比如上面這張圖片里的嘉赎,出現(xiàn)了幾個壞家伙置媳,雖然大部分數(shù)據(jù)都是特征鮮明地出現(xiàn)在兩類里,也不太能夠找到合適的分界面公条。
這些數(shù)據(jù)我們可以分成三類:
- 老老實實呆在離支持向量很遠的拇囊。
- 不是很老實,已經(jīng)超越了支持向量的邊界靶橱,但總的來說還處在正確的分類中寥袭。
- 越過了超平面,去到了它并不屬于的另一類里关霸。
值都沒有超過1,只不過程度不同队寇,所以我們可以用一個式子來把這三種情況統(tǒng)一起來(一個總比兩個好)尝江。
咦,這里出現(xiàn)了一個長尾巴英上,不要慌炭序,它叫做松弛變量啤覆。松弛呢,就是指要是不滿足條件的話惭聂,我把要求稍微給你降一下窗声,不要求你一定得大于1了。對于以上三種情況辜纲,松弛變量的結(jié)果也不一樣笨觅。對于情況1就是0,對于情況3就要大于1了耕腾。
但是雖然要求降了见剩,也不能沒有底線啊。
我們的底線肯定是扫俺,錯一個兩個可以忍苍苞,錯多了就不行。用數(shù)學來表達狼纬,就是
這些松弛變量的和必須最小羹呵。
以上這個SVM的思想,就叫做軟邊界SVM疗琉。
接下來需要加一點兒美妙……的數(shù)學
所以現(xiàn)在我們的超平面求解公式就要加上松弛變量的影響了冈欢。
其實不要被這個式子嚇到了,返回去看看線性可分SVM盈简,就是多了一些限制條件而已凑耻。這個式子里沒有出現(xiàn)過的內(nèi)容就是C了,但它也不是一個高大上的東西柠贤,只是代表一個常數(shù)拳话,用來控制松弛變量部分的影響。簡單來說就是种吸,這個C值越大弃衍,說明松弛變量看得越重,那錯誤分類的容忍度就越小坚俗。
老規(guī)矩镜盯,還是要用拉格朗日乘子來求解。
μ是對ξ的系數(shù)猖败,剩下的就跟之前的簡單式子差不多~(說得很輕松的樣子速缆,其實是因為我快陣亡了)
但是不要慌,雖然變量這么多恩闻,我們來看看求偏導艺糜。
對w求偏導,很好,跟松弛變量沒關(guān)系破停,所以結(jié)果還是一樣翅楼。對w0求偏導也是。
再對ξ求偏導真慢,會得到一個簡單的式子毅臊。
μ不需要求導了,只要代入就好黑界,所以結(jié)果變成了:
非線性SVM
那么你要問了,上面的例子都是可以直接線性可分朗鸠,或者大部分都可分的蚯撩,但是萬一有那種完全不能用一個超平面直接分開的呢?
待續(xù)……