機(jī)器學(xué)習(xí)(四):支持向量機(jī)

一排截、基本原理

給定訓(xùn)練樣本集D=\left\{\left(\boldsymbol{x}_{1}, y_{1}\right),\left(\boldsymbol{x}_{2}, y_{2}\right), \ldots,\left(\boldsymbol{x}_{m}, y_{m}\right)\right\}, y_{i} \in\{-1,+1\}嫌蚤,學(xué)習(xí)的目標(biāo)即是找到一個(gè)劃分超平面,這個(gè)超平面可以通過線性方程 \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b=0 來描述断傲。
對(duì)于樣本點(diǎn)\left(\boldsymbol{x}_{i}, y_{i}\right) \in D脱吱,若y_{i}=+1,則\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b>0认罩;若y_{i}=-1箱蝠,則\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b<0,令\left\{\begin{array}{ll}{\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b \geqslant+1,} & {y_{i}=+1} \\ {\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b \leqslant-1,} & {y_{i}=-1}\end{array}\right.y_{i}\left(\boldsymbol{w}^{\mathbf{T}} \boldsymbol{x}_{i}+b\right) \geqslant 1
樣本空間中垦垂,任一點(diǎn)x到超平面的距離為r=\frac{\left|\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b\right|}{\|\boldsymbol{w}\|}宦搬,距離超平面最近的幾個(gè)樣本點(diǎn)被稱為支持向量(support vector),使上述不等式成立劫拗,因此兩類支持向量的間隔(margin)\gamma=\frac{2}{\|\boldsymbol{w}\|}间校。

劃分超平面、支持向量與間隔

支持向量機(jī)的目的是找到能夠正確劃分訓(xùn)練數(shù)據(jù)集的最大間隔的劃分超平面页慷,即

\begin{array}{l}{\max _{\boldsymbol{w}, b} \frac{2}{\|\boldsymbol{w}\|}} \\ {\text { s.t. } y_{i}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b\right) \geqslant 1, \quad i=1,2, \ldots, m}\end{array}

可重寫做
\begin{array}{l}{\min _{\boldsymbol{w}, b} \frac{1}{2}\|\boldsymbol{w}\|^{2}} \\ {\text { s.t. } y_{i}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b\right) \geqslant 1, \quad i=1,2, \ldots, m}\end{array}

這是一個(gè)凸二次規(guī)劃問題(convex quadratic programming)憔足,最大間隔劃分超平面存在唯一性胁附。
為了更好求解上述最優(yōu)化問題,考慮其對(duì)偶問題滓彰,首先構(gòu)造拉格朗日函數(shù):

L(\boldsymbol{w}, b, \boldsymbol{\alpha})=\frac{1}{2}\|\boldsymbol{w}\|^{2}+\sum_{i=1}^{m} \alpha_{i}\left(1-y_{i}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b\right)\right)

其中\boldsymbol{\alpha}=\left(\alpha_{1} ; \alpha_{2} ; \ldots ; \alpha_{m}\right)控妻,\alpha_{i} \geqslant 0

\begin{aligned} \nabla_{\boldsymbol{w}} L(\boldsymbol{w}, b, \alpha) &=\boldsymbol{w}-\sum_{i=1}^{m} \alpha_{i} y_{i} x_{i}=0 \\ \nabla_找蜜 L(\boldsymbol{w}, b, \alpha) &=\sum_{i=1}^{m} \alpha_{i} y_{i}=0 \end{aligned}

帶入原方程饼暑,則得到對(duì)偶問題 \min _{\alpha} - \sum_{i=1}^{m} \alpha_{i}+\frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{m} \alpha_{i} \alpha_{j} y_{i} y_{j} \boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}_{j} \begin{array}{cl}{\text { s.t. }} & {\sum_{i=1}^{m} \alpha_{i} y_{i}=0} \\ {} & {\alpha_{i} \geqslant 0, \quad i=1,2, \ldots, m}\end{array}
求出\alpha后稳析,即可求得模型為\begin{aligned} f(\boldsymbol{x}) &=\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b = \sum_{i=1}^{m} \alpha_{i} y_{i} \boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}+b \end{aligned}
上述過程需要滿足KKT條件洗做,即\left\{\begin{array}{l}{\alpha_{i} \geqslant 0} \\ {y_{i} f\left(x_{i}\right)-1 \geqslant 0} \\ {\alpha_{i}\left(y_{i} f\left(x_{i}\right)-1\right)=0}\end{array}\right.由上式可知,總有\alpha_{i}=0y_{i} f\left(x_{i}\right)=1彰居。這說明訓(xùn)練完成后诚纸,最終模型僅與支持向量有關(guān)。

二陈惰、算法實(shí)現(xiàn)

為簡(jiǎn)明起見畦徘,本文采用sklearn的svm包實(shí)現(xiàn)二分類問題。首先是二維線性可分問題抬闯,如下所示:

import numpy as np
import scipy.io as spio
import matplotlib.pyplot as plt
from sklearn import svm
datafile = 'data1.mat'

def svmLinear():
    data = spio.loadmat(datafile)
    X = data['X']
    y = data['y'].ravel()
    
    svm_linear = svm.SVC(C=1.0,kernel='linear').fit(X,y)
    plot_linearBoundary(X,y,svm_linear)
    
def plot_linearBoundary(X,y,model):
    class1 = np.where(y==1)
    class0 = np.where(y==0)
    plt.plot(X[class1,0].ravel(),X[class1,1].ravel(),'ro')
    plt.plot(X[class0,0].ravel(),X[class0,1].ravel(),'g*')
    plt.xlabel('x1')
    plt.ylabel('x2')
    plt.legend(['y=1','y=-1'])
    
    w = model.coef_
    b = model.intercept_
    xp = np.linspace(min(X[:,0]),max(X[:,0]),100)
    yp = -(w[0,0]*xp+b)/w[0,1]
    plt.plot(xp,yp,'b')
    sv = model.support_vectors_
    plt.scatter(sv[:,0],sv[:,1],s=150,c='none',alpha=0.7,edgecolor='black')
    plt.show()
if __name__ == '__main__':    
    svmLinear()

下圖顯示了原始數(shù)據(jù)井辆、支持向量和劃分超平面,說明了SVM的分類效果溶握。


二維線性可分情形

以下為二維線性不可分的情形杯缺,采用徑向基核函數(shù),實(shí)現(xiàn)過程如下:

def svmKernel():
    data = spio.loadmat('data2.mat')
    X = data['X']
    y = data['y'].ravel()
    
    svm_notlinear = svm.SVC(C=10,gamma=200,kernel='rbf').fit(X,y)
    plot_notlinearBoundary(X,y,svm_notlinear)
    
def plot_notlinearBoundary(X,y,model):
    class1 = np.where(y==1)
    class0 = np.where(y==0)
    plt.plot(X[class1,0].ravel(),X[class1,1].ravel(),'ro')
    plt.plot(X[class0,0].ravel(),X[class0,1].ravel(),'g*')
    plt.xlabel('x1')
    plt.ylabel('x2')
    plt.legend(['y=1','y=-1'])
    
    x1 = np.linspace(min(X[:,0]),max(X[:,0]),100).reshape(1,-1).transpose()
    x2 = np.linspace(min(X[:,1]),max(X[:,1]),100).reshape(1,-1).transpose()
    X1,X2 = np.meshgrid(x1,x2)
    
    vals = np.zeros(X1.shape)
    for i in range(X1.shape[1]):
        X = np.hstack((X1[:,i].reshape(-1,1),X2[:,i].reshape(-1,1)))
        vals[:,i] = model.predict(X)
    plt.contour(X1,X2,vals,[0,1],color='b')
    sv = model.support_vectors_
    plt.scatter(sv[:,0],sv[:,1],s=150,c='none',alpha=0.7,edgecolor='black')
    plt.show()

if __name__ == '__main__':    
    svmKernel()

下圖顯示了原始數(shù)據(jù)睡榆、支持向量和劃分超平面萍肆,說明了SVM的分類效果,之所以有些支持向量分布在外圍胀屿,是因?yàn)樵诟呔S空間中其與劃分超平面距離較近塘揣。


二維線性不可分情形

三、問題探討

3.1宿崭、序列最小優(yōu)化

可以看到最終得到的優(yōu)化問題是一個(gè)二次規(guī)劃問題亲铡,可以使用二次規(guī)劃算法求解,對(duì)于此問題更高效的做法是序列最小優(yōu)化(sequential minimial optimization, SMO)葡兑。
其基本思路是:先固定\alpha_{i}之外的參數(shù)奖蔓,求\alpha_{i}的極值。由于存在約束\sum_{i=1}^{m} \alpha_{i} y_{i}=0铁孵,若固定單個(gè)\alpha_{i}之外的參數(shù)锭硼,\alpha_{i}可由其他變量導(dǎo)出,因此每次選擇兩個(gè)變量\alpha_{i}\alpha_{j}蜕劝,固定其他參數(shù)檀头,重復(fù)執(zhí)行以下步驟:1. 選取一對(duì)新的變量\alpha_{i}\alpha_{j}轰异; 2. 固定\alpha_{i}\alpha_{j}以外的參數(shù),通過優(yōu)化方程計(jì)算得到更新后的\alpha_{i}\alpha_{j}暑始。
由約束條件可以得出\alpha_{i}取值的意義:\begin{aligned} \alpha_{i}=0 & \Leftrightarrow y_{i} f\left(x_{i}\right) \geq 1 \\ 0<\alpha_{i}<C & \Leftrightarrow y_{i} f\left(x_{i}\right)=1 \end{aligned} 對(duì)于第1種情況搭独,表明\alpha_{i}是正常分類,在邊界內(nèi)部廊镜;
對(duì)于第2種情況牙肝,表明\alpha_{i}是支持向量,在邊界上
固定其他變量嗤朴,考慮\alpha_{i}\alpha_{j}時(shí):\alpha_{i} y_{i}+\alpha_{j} y_{j}=c, \quad \alpha_{i} \geqslant 0, \quad \alpha_{j} \geqslant 0 其中c是常數(shù)配椭。

SMO二變量?jī)?yōu)化問題

將上式帶入到原優(yōu)化函數(shù)中,由于只有兩個(gè)變量\alpha_{i}\alpha_{j}雹姊,因此要求的目標(biāo)即變成優(yōu)化函數(shù)在如圖對(duì)角線上的最優(yōu)值股缸,實(shí)質(zhì)上使得兩變量的最優(yōu)化問題變?yōu)閱巫兞康淖顑?yōu)化問題。

3.2吱雏、核方法

對(duì)于一個(gè)線性可分的問題敦姻,可以用一條直線或者一個(gè)平面將其劃分,而對(duì)于非線性問題(例如異或問題)歧杏,就無法這樣劃分镰惦。一個(gè)解決的思路就是通過非線性變換,將非線性問題轉(zhuǎn)化為線性問題犬绒,核方法就是這樣的一個(gè)方法旺入。其基本想法是:使用一個(gè)變換將低維空間的數(shù)據(jù)映射到高維空間,在新空間中學(xué)習(xí)到超平面將數(shù)據(jù)線性可分懂更。
核函數(shù)就是一個(gè)從原空間到新空間的映射眨业,常見的核函數(shù)有:
線性核:\kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}_{j}
多項(xiàng)式核:\kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\left(\boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}_{j}\right)^co2z7cq
高斯核:\kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\exp \left(-\frac{\left\|\boldsymbol{x}_{i}- \boldsymbol{x}_{j}\right\|^{2}}{2 \sigma^{2}}\right)
拉普拉斯核:\kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\exp \left(-\frac{\left\|\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right\|}{\sigma}\right)
sigmiod核:\kappa\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\tanh \left(\beta \boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}_{j}+\theta\right)

高斯核分類示意圖

參考資料

[1] https://github.com/lawlite19/MachineLearning_Python
[2] 周志華 著. 機(jī)器學(xué)習(xí). 北京:清華大學(xué)出版社,2016
[3] 李航 著. 統(tǒng)計(jì)學(xué)習(xí)方法. 北京:清華大學(xué)出版社,2012
[4] 史春奇等 著. 機(jī)器學(xué)習(xí)算法背后的理論與優(yōu)化. 北京:清華大學(xué)出版社,2019
[5] Peter Harrington 著. 李銳等 譯. 機(jī)器學(xué)習(xí)實(shí)戰(zhàn). 北京:人民郵電出版社,2013

不見可欲,使心不亂沮协。 ——《老子》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末龄捡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慷暂,更是在濱河造成了極大的恐慌聘殖,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件行瑞,死亡現(xiàn)場(chǎng)離奇詭異奸腺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)血久,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門突照,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氧吐,你說我怎么就攤上這事讹蘑∧┛” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵座慰,是天一觀的道長(zhǎng)陨舱。 經(jīng)常有香客問我,道長(zhǎng)版仔,這世上最難降的妖魔是什么游盲? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蛮粮,結(jié)果婚禮上益缎,老公的妹妹穿的比我還像新娘。我一直安慰自己蝉揍,他們只是感情好链峭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布畦娄。 她就那樣靜靜地躺著又沾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熙卡。 梳的紋絲不亂的頭發(fā)上杖刷,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音驳癌,去河邊找鬼滑燃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颓鲜,可吹牛的內(nèi)容都是我干的表窘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼甜滨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼乐严!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衣摩,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤昂验,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后艾扮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體既琴,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年泡嘴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甫恩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酌予,死狀恐怖磺箕,靈堂內(nèi)的尸體忽然破棺而出纹腌,到底是詐尸還是另有隱情,我是刑警寧澤滞磺,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布升薯,位于F島的核電站,受9級(jí)特大地震影響击困,放射性物質(zhì)發(fā)生泄漏涎劈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一阅茶、第九天 我趴在偏房一處隱蔽的房頂上張望蛛枚。 院中可真熱鬧,春花似錦脸哀、人聲如沸蹦浦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盲镶。三九已至,卻和暖如春蝌诡,著一層夾襖步出監(jiān)牢的瞬間溉贿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工浦旱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宇色,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓颁湖,卻偏偏與公主長(zhǎng)得像宣蠕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甥捺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容