1. 程式人生 > >機器學習---支持向量機(SVM)

機器學習---支持向量機(SVM)

行處理 off 距離 又是 分類器 libs 自己的 cos 一個

非常久之前就學了SVM,總認為不就是找到中間那條線嘛,但有些地方模棱兩可,真正編程的時候又是一團漿糊。參數任意試驗,毫無章法。既然又又一次學到了這一章節,那就要把之前沒有搞懂的地方都整明確,嗯~


下面使用到的圖片來自上海交大楊旸老師的課件。網址例如以下:http://bcmi.sjtu.edu.cn/~yangyang/ml/


支持向量機就是一種分類方法。僅僅是起的這個名字,看起來非常復雜而已。

中間一條線:分類用的,須要求出系數W , b

支持向量:線性超平面上的點,能夠理解為兩邊的線上的點

要求:中間那條線到兩邊的線的距離相等。

支持向量(能夠想象成那兩條線上每條線上的點)的個數<= m +1,m為特征 x 的維數。

目的:找的中間那條線的參數 w 和 b 。


線性SVM

技術分享

這個圖我看了非常久。一直沒有搞懂 y 在哪裏,依據公式明明就直接求出全部的 x 了啊。難道 y = a ?y = a - b ?

事實上 y 在這裏不是坐標軸啦。是分類0,1,2,...,1,-1之類的,坐標軸上全都是 x1,x2,x3,....這種啦

搞清楚這個概念,接下來就非常好理解了:

兩條線之間的距離就直接拿 wx1 + b = a 和 wx2 + b = -a 相減就好啦(x1是上邊直線上的點。x2是下邊直線上的點),至於為神馬這樣 2r 就剛好是垂直距離,非常easy,兩個點坐標相減就是兩點之間的向量,膜就是距離。找兩個連線與分類直線垂直的點就OK拉。真正用公式推導是這種:

w(x1-x2)=2a

||w|| ||x1-x2|| cos<w, x1-x2> = 2a

||x1-x2|| cos<w, x1-x2> = 2a/||w||

公式左邊就是距離啦。

證明的第一問也好理解了,這裏的在線上指的是 x1 和 x2 都在 wx + b =0 這條線上,相減剛好就是<w, x1- x2> = 0

技術分享

解釋一下:

理想情況下,全部正樣本(y=1)都在 wx + b = a 這條線的上邊。全部負樣本(y=-1)都在 wx + b = -a 這條線的下邊,可是兩個公式太麻煩啦。那就把 y 當作正負號乘到前邊好啦。剛好把上下兩條直線公式改編合成這樣: (wx + b)y = a ,這種點是在線上的,可是我們要求正負樣本在兩側就好啦,所以改 = 為 >=

max 那句就是說只滿足下邊的公式還不夠,我們須要的是兩條線中間的距離最大

總之:就是對於隨意的點 j 求使得兩條線的距離最大的 w 和 b

技術分享

總是帶著 a 不太方便。所以我們把等式兩邊都除以 a ,就有了新的 w 和 b,無所謂啦,反正都是符號。所以就沒改啦。

因為a都變成1了。所以最大化 2a / || w || 倒過來就成了 || w || / 2,也就能夠簡化為求 w . w = || w || 的最小值了~


非線性SVM

一切看起來進展非常順利,然而!真實的數據非常有可能出現一些不太友好的點哦。

技術分享

於是,我們就須要容忍這些錯誤~

技術分享


c:tradeoff parameter 事實上就是一個系數

#mistake:錯誤數。對於每個錯誤的點都為1,正確點都取0,最後加到一起(公式為了讓總錯誤最小)

c和#mistake都是變量,能夠合在一起成為一個的。但不便於理解

#mistake是算出來的,系數C是依據交叉驗證得到的——(交叉驗證。。不大懂,之後再說咯)

上邊這個公式有個缺點:對於不在分類線外側的全都定義為錯的(也就是非黑即白,0/1 loss)。沒有考慮偏離大小的問題

技術分享

公式把#mistake改成這樣,就相當於對於每個錯誤的樣本都算出其相應的偏離量。這樣放在公式裏就是全部偏離量加起來最小。

偏離量是算出來的,系數C是依據交叉驗證得到的——(交叉驗證。。不大懂,之後再說咯)


規範化損失變量

技術分享

直接套公式吧。

hinge loss 我想多解釋一下。由於這個樣本在它應在的範圍(如 >=1 )。那麽它事實上是沒有損失的,也就是全為0就好,所以也許這個損失函數蠻符合SVM的特點~


多分類問題

技術分享

方法一:

如上圖所看到的——每次把一個類別拿出來,其它類別合成一個大類。當作二分類問題來做。

反復n次就OK

缺點:分類的那條線會偏向訓練數據量比較小的那一類

技術分享

方法二:同一時候求

解釋一下公式:

左邊是分類在 j 的一個點 xj 乘以它自己的系數,須要滿足 w(yj) . xj + b(yj) > = 1

參考方法一,假設這個點用在其它的分類公式中的時候,須要滿足 w(y‘) . xj + b(y’) < = 1

所以兩個公式放在一起就是: w(yj) . xj + b(yj) > = 1 > = w(y‘) . xj + b(y‘)

至於非要加上的那個1~~我也不知道為神馬,莫非是為了和之前的公式看起來差點兒相同?0.0


加上松弛變量和損失變量就變成了這樣:

技術分享


約束優化(Constrained Optimized)

劇透下:下面主要介紹了一種用於解上邊那個有關SVM的優化問題方法~(沒學過最優化傷不起。得補啊)

首先舉個有關求最小值的樣例

技術分享

上圖樣例說明,b 取不同的值的時候我們得到的最小值是不一樣的

第一個圖沒有約束,第二個圖約束沒有起到作用,第三個圖約束起作用啦

技術分享

上圖說的是拉格朗日對偶:

首先給定初始問題,求滿足<= 和 = 那兩個條件(這是概括講的,全部的約束條件都能夠轉換為這兩種形式)。而且 f(w) 取最小值的時候 w 的值

當中 Alpha 和 Beta 是拉格朗日乘數(就是起了個名)

Lemma(引理):

這時候把這些式子加起來。最大也就是 f(w) 了。由於 g h要麽小於等於0,要麽等於0,而且要求 Alpha(i) > 0。 所以他們總的和 L 不會比 f(w) 再大了~

o/w是otherwise的意思,此時 max L 取值為無窮的解釋例如以下:

假設有一個樣本不符合限制條件g-i(w) = 0,即存在一個g-i(w) > 0,那麽max L(w, alpha, beta) —>無窮。

由於Alpha-i為隨意參數。Alpha-i > 0, g-i(w) > 0,當Alpha-i 趨向於無窮的時候。max Alpha-i g-i(w)也趨向於無窮,所以此時的 max L 趨向於無窮~


事實上大括號後邊第一行,我們另一個條件也能夠合進來。這個條件就是滿足 min(w) f(w)。也就是讓 L 的最大值 f(w) 最小然後求 w 嘛,就在前邊加個min,就是最後一個式子啦

技術分享


這就是又寫了一遍引理,第二個是它的對偶問題,弱對偶和強對偶能夠看下圖理解下:

技術分享

就是先求最大再求最小。和先求最小再求最大能不能對上,有沒有交點的問題。沒有就是弱對偶,有就是強對偶

依據上圖我們就能夠看出來,事實上找到最優值就是找鞍點(最大or最小,看起來像馬鞍的形狀,所以那個點就叫鞍點)的過程。

技術分享

求鞍點。就是求各種一階導為0,第三個式子是由於之前說了 g 代表 <= 0 那一堆公式,那麽取得鞍點的時候,它必須取極值點 = 0,最後兩個公式是之前就規定好的~

這五個式子就是KKT條件,假設 w , Alpha , Beta 滿足KKT條件,那麽它們就是那個引理和它對偶問題的一個解


講了這麽一堆。最終把解法講好了。然後就要用到我們的SVM上了

技術分享


技術分享

技術分享

經過上邊一堆推導,我們最終把 w 和 b 去掉(用x y Alpha 表示)了。僅僅剩下 Alpha 是未知的了~。

於是這就轉變為了二次規劃問題(這樣就非常好解麽?木有學過最優化啊。不知道這是神馬啊)

到眼下,你僅僅須要知道 w 被那個求和 替代了,SVM有個核是 x‘x 就好

技術分享

依據KKT條件,有一部分 Alpha 不為0,看圖,支持向量就是 Alpha 不為 0 的點

技術分享

依據我們已知的能夠算出來的 w 。依據分類的那條線 wx + b = 0,就能夠求出 b, 然後我們就能夠測試新數據 z 啦


最優的 w 能夠看作是一部分點的一個線性組合,這個稀疏表達能夠看作是KNN分類器結構中的數據壓縮(沒懂,重要麽?)

為了計算 Alpha ,我們僅僅須要知道核(kernel,即x‘x)就好啦

測試的時候使用下邊的式子(sign表示取符號,可能這個式子在模擬二分類問題,所以僅僅要符號即可了):

技術分享


下邊解釋一下核(kernel)的作用

技術分享

就是把 x 多加一個維度(or 沒有添加維度 or 降維),使得原本非線性的問題成為線性的。

技術分享

在之前的問題中。我們提到過。我們僅僅須要提供x‘x就能夠了,所以這裏把 x‘x 替換一下。就是帶進公式之前先行處理一下,也就是加了那個核運算,那麽我們可能會得到更好的結果哦

下邊這是幾個核的樣例:

技術分享

關於選神馬核比較好,編程的時候大膽試吧。。。

我本以為公式已經全了呢額。直到我看到了下邊的修改,又對Alpha 加了個最大值C的約束,其它沒變~

技術分享

技術分享


SMO算法

首先我們來了解一下神馬是坐標上升(Coordinate Ascent)

一個無約束優化問題例如以下:

技術分享

能夠使用坐標上升算法來解

這個和梯度下降非常像, 梯度下降是選下降最快的方向。可是坐標上升每次僅僅改變一個維度(變量),而其它維度(變量)不變,例如以下圖:

技術分享

可是當我們遇到了SVM這樣的有約束的問題,它的不同之處在於有一個等式(即第三個等式:求和 Alpha . y =0)。因此我們須要定義兩個變量。Alpha(i)和Alpha(j)同一時候變,可是Alpha(i)能夠用Alpha(j)表示出來,事實上還是能夠理解為一個變量哦~~

這時候坐標上升就轉換為了SMO算法啦!

下邊是解SVM那個式子的SMO算法的核心思想:

技術分享

後邊的課件是證明SMO收斂,數學問題就就不講了哈。主要就是滿足KKT條件吧~~

編程的話,libsvm不錯,好像前邊的博文有講到使用方法哦~



假設博文中有不論什麽問題,歡迎隨時與我聯系修正~在此感謝李凡師兄。邵誌文同學,朱能軍同學對本文存疑的解答^.^

機器學習---支持向量機(SVM)