Python機器學習筆記:SVM(3)——證實SVM

  說實話,凡是涉及到要證實的東西(理論),通常都很差惹。絕大多數時候,看懂一個東西不難,但證實一個東西則須要點數學功底,進一步,證實一個東西也不是特別難,難的是從零開始發明這個東西的時候,則顯得艱難(由於任什麼時候代,大部分人的研究所得都不過是基於前人的研究成果,前人所作的是開創性的工做,而這每每是最艱難最有價值的,他們被稱爲真正的先驅。牛頓也曾說過,他不過是站在巨人的肩上,你,我更是如此)。html

  正如陳希孺院士在他的著做《數理統計學簡史》的第四章,最小二乘法中所講:在科研上諸多觀念的革新和突破是有着不少的不易的,或者某個定理在某個時期由有我的點破了,如今的咱們看來一切都是理所固然,但在一切沒有發現以前,可能許許多多的頂級學者畢其功於一役,耗盡一輩子,努力了幾十年最終也是無功而返。web

  上一節我學習了SVM的核函數內容,下面繼續對SVM進行證實,具體的參考連接都在第一篇文章中,SVM四篇筆記連接爲:算法

Python機器學習筆記:SVM(1)——SVM概述

Python機器學習筆記:SVM(2)——SVM核函數

Python機器學習筆記:SVM(3)——證實SVM

Python機器學習筆記:SVM(4)——sklearn實現

  話休絮煩,要證實一個東西先要弄清楚它的根基在哪裏,即構成它的基礎是哪些理論。OK,如下內容基本上都是上文沒有學習到的一些定理的證實,包括其背後的邏輯,來源背景等東西。機器學習

  本文包括內容:函數

  • 1,線性學習器中,主要闡述感知機算法
  • 2,非線性學習器中,主要闡述 Mercer定理
  • 3,損失函數
  • 4,最小二乘法
  • 5,SMO算法的推導

  一樣,在學習這些以前,咱們再複習一下SVM,這裏使用(http://staff.ustc.edu.cn/~ketang/PPT/PRLec5.pdf)的PPT來學習。post

熱身:SVM的整理

  這裏直接借用別人的PPT粘貼在這裏,讓本身再梳理一遍SVM。性能

熱身1,Hard Margin SVM

熱身2,Soft Margin SVM

熱身3,LS-SVM

1,線性學習器

1.1 感知機算法

  這個感知器算法是在1956年提出的,年代久遠,依然影響着當今,固然,能夠確定的是,此算法亦非最優,後續會有更詳盡闡述。不過,有一點,你必須清楚,這個算法是爲了幹什麼的:不斷的訓練試錯以期尋找一個合適的超平面。學習

   下面,舉個例子。以下圖所示,憑咱們的直覺能夠看出,圖中紅線是最優超平面,藍線則是根據感知機算法在不斷的訓練中,最終,若藍線能經過不斷的訓練移動到紅線位置上,則表明訓練成功。優化

   既然須要經過不斷的訓練以讓藍線最終成爲最優分類超平面,那麼到底須要訓練多少次呢?ui

  Novikoff 定理告訴咱們當間隔是正的時候感知機算法會在有限次數的迭代中收斂,也就是說 Novikoff 定理證實了感知機算法的收斂性,即能獲得一個界,不至於無窮循環下去。

  Novikoff 定理:若是分類超平面存在,僅須要在序列 S 上迭代幾回,在界爲 (2R / γ)2 的錯誤次數下就能夠找到分類超平面,算法中止。

  這裏的 R = max1<=i<=l||Xi|| ,γ 爲擴充間隔。根據誤分次數公式可知,迭代次數與對應於擴充(包括偏置)權重的訓練集的間隔有關。

  順便再解釋下這個所謂的擴充間隔 γ , γ 即爲樣本到分類間隔的距離,即從 γ 引出的最大分類間隔。以前咱們推導過的內容,以下:

   在給出幾何間隔的定義以前,我們首先來看下,如上圖所示,對於一個點 x,令其垂直投影到超平面上的對應的爲 x0,因爲 w 是垂直於超平面的一個向量, γ 爲樣本 x 到分類間隔的距離,咱們有:

   同時有一點值得注意:感知機算法雖然能夠經過簡單迭代對線性可分數據生成正確分類的超平面,但不是最優效果,那怎麼才能獲得最優效果呢,就是前面博文說的尋找最大分類間隔超平面。此外,Novikoff定理的證實請參考:http://www.cs.columbia.edu/~mcollins/courses/6998-2012/notes/perc.converge.pdf

2,非線性學習器

2.1 Mercer定理

   Mercer定理:若是函數 K 是 Rn *Rn - R 上的映射(也就是從兩個 n 維向量映射到實數域)。那麼若是K是一個有效核函數(也稱爲 Mercer 核函數),那麼當且僅當對於訓練樣例 { x(1), x(2), ...  x(m)},其相應的核函數矩陣是對稱半正定的。

  Mercer定理代表爲了證實K是有效的核函數,那麼咱們不用去尋找 Φ ,而只須要在訓練集上求出各個 Kij,而後判斷矩陣K是不是半正定(使用左上角主子式大於等於零等方法)便可。

  要理解這個 Mercer定理,先要了解什麼是半正定矩陣,要了解什麼是半正定矩陣,先得知道什麼是正定矩陣(矩陣理論博大精深,關於矩陣推薦一本書《矩陣分析與應用》),而後關於Mercer定理的證實參考:http://ftp136343.host106.web522.com/a/biancheng/matlab/2013/0120/648.html

  其實,核函數在SVM的分類效果中起到了重要的做用,下面連接有個 tutorial能夠看看:https://people.eecs.berkeley.edu/~bartlett/courses/281b-sp08/7.pdf

2.2 正定矩陣

  在百度百科,正定矩陣的定義以下:在線性代數裏,正定矩陣(positive definite materix)有時會簡稱爲正定陣。在線性代數中,正定矩陣的性質相似於複數中的正實數。與正定矩陣相對應的線性算子是對稱的正定雙線性形式。

  廣義的定義:設 M 爲 n 階方陣,若是對任何非零向量 z,都有 zTMz > 0,其中 zT 表示 z 的轉置,就稱 M  爲正定矩陣。

  狹義的定義:一個 n 階的實對稱矩陣 M 是正定的條件是當且僅當對全部的非零實係數向量 z,都有 zTMz > 0,其中 zT 表示 z 的轉置。

  正定矩陣的性質:

  • 1,正定矩陣的行列式恆爲正
  • 2,實對稱矩陣 A 正定當且僅當 A 與單位矩陣合同
  • 3,若 A 是正定矩陣,則 A 的逆矩陣也是正定矩陣
  • 4,兩個正定矩陣的和是正定矩陣
  • 5,正實數域正定矩陣的乘積是正定矩陣

3,損失函數

  以前提到過「支持向量機(SVM)是 90 年代中期發展起來的基於統計學習理論的一種機器學習方法,經過尋找結構化風險最小來提升學習機泛化能力,實現經驗風險和置信範圍的最小化,從而達到在統計樣本量較少的狀況下,亦能得到良好統計規律的目的。」但初次看到的人可能不瞭解什麼是結構化風險,什麼又是經驗風險。要了解這兩個所謂的「風險」,還得從監督學習提及。

  監督學習實際上就是一個經驗風險或者結構風險函數的最優化問題。風險函數度量平均意義下模型預測的好壞,模型每一次預測的好壞用損失函數來度量。它從假設空間 F 中選擇模型 f 做爲決策函數,對於給定的輸入 X,由 f(x) 給出相應的輸出 Y,這個輸出的預測值 f(X)與真實值 Y 可能一致也可能不一致,用一個損失函數來度量預測錯誤的程度。損失函數記爲 L(Y, f(X))。

  經常使用損失函數有如下幾種(摘抄於《統計學習方法》):

  (1) 0-1 損失函數

  (2)平方損失函數

   (3)絕對損失函數

   (4)對數損失函數

   給定一個訓練數據集

   模型 f(X) 關於訓練數據集的平均損失稱爲經驗風險,以下:

   關於如何選擇模型,監督學習有兩種策略:經驗風險最小化和結構風險最小化。

  經驗風險最小化的策略認爲,經驗風險最小的模型就是最優的模型,則按照經驗風險最小化求最優模型就是求解以下的最優化問題:

  當樣本容量很小時,經驗風險最小化的策略容易產生過擬合的現象。結構風險最小化能夠防止過擬合。結構風險是在經驗風險的基礎上加上表示模型複雜度的正則化項或懲罰項,結構風險定義以下:

   其中 J(f) 爲模型的複雜度,模型 f 越複雜,J(f) 值就越大,模型越簡單,J(f) 值就越小,也就是說J(f)是對複雜模型的乘法。λ>=0 是係數,用以衡量經驗風險和模型複雜度。結構風險最小化的策略認爲結構風險最小的模型是最優的模型,因此求最優的模型就是求解下面的最優化問題:

   這樣,簡單學習問題就變成了經驗風險或結構化風險函數的最優化問題。如上式最優化問題的轉換。

   這樣一來,SVM就有第二種理解,即最優化+損失最小。如網友所言:「能夠從損失函數和優化算法角度看SVM,Boosting,LR等算法,可能會有不一樣收穫」。

  關於損失函數:能夠看看張潼的這篇《Statistical behavior and consistency of classification methods based on convex risk minimization》。各類算法中經常使用的損失函數基本都具備fisher一致性,優化這些損失函數獲得的分類器能夠看做是後驗機率的「代理」。此外,張潼還有另一篇論文《Statistical analysis of some multi-category large margin classification methods》,在多分類狀況下margin loss的分析,這兩篇對Boosting和SVM使用的損失函數分析的很透徹。

  關於統計學習方法的問題,能夠參考:https://people.eecs.berkeley.edu/~bartlett/courses/281b-sp08/7.pdf

4,最小二乘法

4.1  什麼是最小二乘法?

  下面引用《正態分佈的前世此生》裏的內容稍微簡單闡述一下。

  咱們口頭常常常常說:通常來講,平均來講。如平均來講,不吸菸的健康優於吸菸者,之全部要加「平均」 二字,是由於凡是皆有例外,總存在某個特別的人他吸菸但因爲常常鍛鍊因此他的健康情況可能會優於他身邊不吸菸的盆友。而最小二乘的一個最簡單例子即是算術平均。

  最小二乘法(又稱最小平方法)是一種數學優化技術。它經過最小化偏差的平方和尋找數據的最佳函數匹配。利用最小二乘法能夠簡便的求得未知的數據,並使得這些求得的數據與實際數據之間偏差的平方和爲最小。用函數表示爲:

   使偏差(所謂偏差,固然是觀察值與實際真實值的差量)平方和達到最小以尋求估計值的方法,就叫作最小二乘法,用最小二乘法獲得的估計,叫作最小二乘估計。固然,取平方和做爲目標函數只是衆多可取的方法之一。

  最小二乘法的通常形式可表示爲:

   有效的最小二乘法是勒讓得在1805年發表的,基本思想就是認爲測量中有偏差,因此全部方程的累積偏差爲:

   咱們求解出致使累積偏差最小的參數便可:

   勒讓得在論文中對最小二乘法的優良性作了幾點說明:

  • 最小二乘的偏差平方和最小,並在各個方程的偏差之間創建了一種平衡,從而防止某個極端偏差取得支配地位。
  • 計算中只須要求偏導後求解線性方程組,計算過程明確便捷
  • 最小二乘能夠導出算術平均值做爲估計

  對於最後一點,從統計學的角度來看是很重要的一個性質。推理以下:假設真值爲 Θ ,x1,.....xn 爲 n 次測量值,每次測量的偏差爲 ei = xi - Θ,按最小二乘法,偏差累積爲:

  求解 Θ 使 L(Θ) 達到最小,正好是算術平均 xhat,其公式以下:

   因爲算術平均是一個歷經考驗的方法,而以上的推理說明,算術平均是最小二乘的一個特例,因此從另一個角度說明了最小二乘方法的優良性,使咱們對最小二乘法更加有信息。

  最小二乘法發佈以後很快獲得了你們的承認接受,並迅速的在數據分析實踐中被普遍使用。不過歷史上又有人把最小二乘法的發明歸功於高斯,這又是怎麼一回事呢?高斯在 1809 年也發表了最小二乘法,而且聲稱本身已經使用了這個方法多年。高斯發明了小行星定位的數學方法,並在數據分析中使用最小二乘方法進行計算,準確的預測了穀神星的位置。

  說了這麼多,貌似與SVM沒啥關係,可是彆着急,請繼續聽,本質上說,最小二乘法便是一種參數估計方法,說到參數估計,我們從一元線性模型提及。

4.2 最小二乘法的解法

   什麼是一元線性模型呢?咱們引用(https://blog.csdn.net/qll125596718/article/details/8248249)的內容,先來梳理一下幾個基本的概念:

  • 監督學習中,若是預測的變量是離散的,咱們稱其爲分類(如決策樹,支持向量機等),若是預測的變量是連續的,咱們稱其爲迴歸。
  • 迴歸分析中,若是隻包括一個自變量和一個因變量,且兩者的關係可用一條直線近似表示,這種迴歸分析稱爲一元線性迴歸分析。
  • 若是迴歸分析中包括兩個或兩個以上的自變量,且因變量和自變量之間是線性關係,則稱爲多元線性迴歸分析。
  • 對於二維空間線性是一條直線;對於三維空間線性是一個平面,對於多維空間線性是一個超平面。

  對於一元線性迴歸模型,假設從整體中獲取了 n 組觀察值(X1, Y1),(X2, Y2),...(Xn, Yn)。對於平面中的這 n 個點,可使用無數條曲線來擬合。要求樣本回歸函數儘量好的擬合這組值。綜合起來看,這條直線處於樣本數據的中心位置最合理。

  選擇最佳擬合曲線的標準能夠肯定爲:使總的擬合偏差(即總殘差)達到最小,有如下三個標準能夠選擇:

  • 1,用「殘差和最小」肯定直線位置是一個途徑。可是很快發現計算「殘差和」 存在相互抵消的問題。
  • 2,用「殘差絕對值和最小」肯定直線位置也是一個途徑。但絕對值的計算比較麻煩。
  • 3,最小二乘法的原則是以「殘差平方和最小」 肯定直線位置。用最小二乘法除了計算比較方便外,獲得的估計量還具備優良特性。這種方法對異常值很是敏感。

  最經常使用的是普通最小二乘法(Ordinary Least Square, OLS ):所選擇的迴歸模型應該使全部觀察值的殘差平方和達到最小,即採用平方損失函數。

   咱們定義樣本回歸模型爲:

   獲得偏差 ei (ei爲樣本)爲:

   接着,定義平方損失函數 Q:

   則經過Q最小肯定這條直線,即肯定 β0hat,  β1hat, β0hat,  β1hat爲變量,把它們看作是 Q 的函數,就變成了一個求極值的問題,能夠經過求導數獲得。

  求 Q 對兩個待估參數的偏導數:

   根據數學知識咱們知道,函數的極值點爲偏導爲 0 的點,解得:

   這就是最小二乘法的解法,就是求得平方損失函數的極值點。自此,咱們能夠看到求解最小二乘法和求解SVM是何等類似,尤爲是定義損失函數,然後經過偏導求極值。

5,SMO算法

  不管Hard Margin 或 Soft Margin SVM,咱們均給出了SVM的對偶問題,但並無說明對偶問題怎麼求解。因爲矩陣Q的規模和樣本數相等,當訓練樣本數很大的時候,這個矩陣的規模很大,求解二次規劃問題的經典算法會遇到性能問題,也就是說同時求解 n 個拉格朗日乘子涉及不少次迭代,計算開銷太大,因此通常採用 Sequential Minimal Optimization(SMO)算法。

  SMO算法的基本思想每次只更新兩個乘子,迭代得到最終解

  上文中,咱們提到了求解對偶問題的序列最小最優化 SMO 算法,但並未提到其具體解法。首先看下最後懸而未決的問題:

   等價於求解:

   1998年,Microsoft Research 的John C. Platt 在論文《Sequential  Minimal Optimization:A Fast Alogrithm for Training Support Vector Machines》中提出針對上述問題的解法:SMO算法,它很快便成爲最快的二次規劃優化算法,特別是針對線性SVM和數據稀疏時性能更優。這個算法的思路是每次在優化變量中挑出兩個份量進行優化,而讓其餘份量固定,這樣才能保證知足等式約束條件,這是一種分治法的思想。

  接下來,咱們便參考 John C.Platt 的文章(找不到了。。。)來看看 SMO的解法。

5.1 SMO算法的推導

  首先咱們來定義特徵到結果的輸出函數:

   注:這個 u 與咱們以前定義的 f(x) 實質上是同樣的。

   接着,從新定義下咱們原始的優化問題,權當從新回顧,以下:

   求導獲得:

   代入 u 的公式中,可得:

   經過引入拉格朗日乘子轉換爲對偶問題後,得:

   注:這裏獲得的 min 函數與咱們以前的 max 函數實質上也是同樣,由於把符號變下,即由 min 轉換爲 max 的問題,且 yi也與以前的 y(i) 等價,yj 亦如此。

  通過加入鬆弛變量後,模型修改成:

   從而最終咱們的問題變爲:

  下面要解決的問題是:在 αi = { α1, α2, α3,......, αn} 上求上述目標函數的最小值。爲了求解這些乘子,每次從中任意抽取兩個乘子 α1 和 α2,而後固定 α1 和 α2 之外的乘子 {α3, α4,....αn},使得目標函數只是關於 α1 和 α2 的函數。這樣,不斷的從一堆乘子中任意抽取兩個求解,不斷地迭代求解子問題,最終達到求解原問題的目的。

  (注意:下面均使用兩個相同的表達式,是參考了兩個方法,而且這兩個方法均易於理解,能夠說我先看第一個公式的文章,而後偶爾有次看到第二個公式的文章,發現也很好理解,因此粘貼在這裏,特意說明

  咱們首先給出對於這兩個常量的優化問題(稱爲子問題)的求解方法。假設選取的兩個份量爲 αi, αj,其餘份量都固定(即當作常數)。因爲:

  因此對偶問題的子問題的目標函數能夠表達爲:

  (更普及一點,能夠寫成下面這樣)

   其中C是一個常數,前面的二次項很容易計算出來,一次項要複雜一些,而且:

  這裏的變量 α* 爲變量 a 在上一輪迭代後的值。上面的目標函數是一個兩變量的二次函數,咱們能夠直接給出最小值的解析解(公式解)。

   爲了解決這個子問題,首要問題即是每次如何選取 α1 和 α2。實際上,其中一個乘子是違反 KKT條件最嚴重的,另一個乘子則由另外一個約束條件選取。

  根據KKT條件能夠獲得目標函數中 αi 取值的意義:

   這裏的 αi 仍是拉格朗日乘子:

  • 1,對於第一種狀況,代表 αi 是正常分類,在間隔邊界內部(咱們知道正確分類的點 yi * f(xi) >= 0)
  • 2,對於第二種狀況,代表了 αi 是支持向量,在間隔邊界上
  • 3,對於第三種狀況,代表了 αi 是在兩條間隔邊界之間

  而最優解須要知足KKT 條件,即上述三個條件都得知足,如下幾種狀況出現將會出現不知足:

  • 1,yiui <=1,可是 αi < C 則不是不知足的,而本來 αi = C
  • 2,yiui >=1,可是 αi > C 則不是不知足的,而本來 αi = C
  • 3,yiui =1,可是 αi = 0 或者  αi = C 則不是不知足的,而本來 0  < αi < C

  也就是說,若是存在不知足 KKT 條件的 αi ,那麼須要更新這些 αi ,這是第一個約束條件。此外,更新的同時還要受到第二個約束條件的限制,即:

   所以,若是假設選擇的兩個乘子  α1 和 α2 ,他們在更新以前分別是  α1old 和 α2old,更新以後分別是  α1new 和 α2new,那麼更新先後的值須要知足如下等式才能保證和爲 0  的約束:

   其中,ξ 是常數,(上面兩個式子都同樣,只不過第二個更容易理解)。

  兩個因子很差同時求解,因此可選求第二個乘子 α2 的解(α2new),獲得 α2 的解(α2new)以後,再利用 α2 的解(α2new)表示 α1 的解(α1new).

  爲了求解 α2 的解(α2new),得先肯定 α2new 的取值範圍。假設它的上下邊界分別爲 H 和 L,那麼有:

   接下來,綜合下面兩個約束條件,求解 α2new 的取值範圍:

   因爲 yi,  yj(也能夠說爲 y1  y2)的取值只能爲 +1 或者 -1,那麼當他們異號,也就是當 y1 != y2 時,根據:

   可得:  α1old - α2old  = ξ   (  αi - αj  = ξ),它肯定的可行域是一條斜率爲1的直線段,由於αi αj 要知足約束條件

  他們的可行域以下圖所示:

  上面兩條直線分別對應於 y1爲 +1 和 -1 的狀況。若是是上面那條直線,則 αj 的取值範圍爲 [-ξ, C]。若是是下面的那條直線,則爲 [0,C-ξ]。

  對於這兩種狀況 αj 的下界和上界能夠統一寫成以下形式:

  由於   αi - αj  = ξ ,因此又能夠寫爲:  L =  max (0, -ξ),  H = min(C, C-ξ)

  下邊界是直線和 x 軸交點的 x 座標以及 0 的較大值;上邊界是直線和的交點的 x 座標和 C 的較小值。

   再來看第二種狀況,若是 yi  yj 同號,即當 y1 = y2 時,一樣根據:

   可得:  α1old + α2old  = ξ (  αi  +  αj  = ξ ),因此有:

 

   根據   αi  +  αj  = ξ  , 上式也可寫爲:L =  max (0, ξ - C),  H = min(C, ξ)

  這種狀況以下圖所示:

   如此,根據這兩個變量的等式約束條件( y1 和 y2 異號或者同號),能夠消掉α2old ,可得出 α2new 的上下界分別爲:

   回顧下第二個約束條件:

  下面咱們來計算不考慮截斷時的函數極值。爲了不分 -1 和 +1 兩種狀況,咱們將上面的等式約束兩邊同時乘以 y1(第二種表達是乘以yi),可得:

   其中 α1 能夠用 α2 表示,α1 = w - s*α2,從而咱們把子問題的目標函數轉換爲只含 α2 的問題:

   對 α2 求導(即對自變量求導),並令導數爲零,可得:

   因爲:

   化簡下:

   而後將:

   代入上式,可得:

   下面令(其中 Ei 表示預測值與真實值之差):

   而後上式兩邊同時除以 η ,獲得一個關於單變量 α2 的解:

  在求得  αj 以後,根據等式約束條件咱們就能夠求得另一個變量的值:


  目標函數的二階導數爲 η,前面假設二階導數 η  > 0,從而保證目標函數是凸函數即開口向上的拋物線,有極小值。若是 η  < 0 或者 η  = 0,該怎麼處理?對於線性核或正定核函數,能夠證實矩陣K的任意一個上述子問題對應的二階子矩陣半正定,所以一定有 η  >= 0。不管本次迭代時的初始值是多少,經過上面的子問題求解算法獲得是在可行域裏的最小值,所以每次求解更新這兩個變量的值以後,都能保證目標函數值小於或者等於初始值,即函數值降低。

   這個解沒有考慮其約束條件 0 <=  α2 <= C,便是未經剪輯時的解。

  而後考慮約束 0 <=  α2 <= C 可獲得通過剪輯後的 α2new 的解析解爲:

  (若是用αi,αj表示,則咱們求的這個二次函數的最終極值點爲:)

   求出了 α2new後,即可以求出α1new ,得:

  這三種狀況下的二次函數極小值以下圖所示:

  上圖中第一種狀況是拋物線的最小值點在 [L, H]中;第二種狀況是拋物線的最小值點大於 H,被截斷爲H;第三種狀況是小於L,被截斷爲L。

   那麼如何選擇乘子   α1 和 α2呢?

  1. 對於 α1 ,即第一個乘子,能夠經過剛剛說的那3種不知足 KKT的條件來找
  2. 而對於第二個乘子 α2 能夠尋找知足條件: max |Ei - Ej| 的乘子

  而 b 知足下述條件:

   下面更新 b:

   且每次更新完兩個乘子的優化後,都須要再從新計算 b,及對應的 Ei值。

  最後更新全部的 αi,y 和 b,這樣模型就出來了,從而便可求出我們開頭提出的分類函數:

   此外,這裏有一篇相似的文章,你們能夠參考下(https://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html)。

 5.2  SMO算法的步驟

  綜上,總結下SMO的主要步驟,以下:

   意思是:

  • 1,第一步:選取一對 αi 和 αj,選取方法使用啓發式方法
  • 2,第二步:固定除αi 和 αj 以外的其餘參數,肯定W 極值條件下的 αi 和 αj 由 αi 表示

  假定在某一次迭代中,須要更新 x1,x2 對應的拉格朗日乘子 α1,α2,那麼這個小規模的二次規劃問題寫爲:

   那麼在每次迭代中,如何更新乘子呢?引用下面地址(http://staff.ustc.edu.cn/~ketang/PPT/PRLec5.pdf)的兩張PPT說明下:

   知道了如何更新乘子,那麼選取哪些乘子進行更新呢?具體有如下兩個步驟:

  • 步驟一:先「掃描」全部乘子,把第一個違反KKT條件的做爲更新對象,令爲 a1
  • 步驟二:在全部不違反KKT條件的乘子中,選擇使 |E1 - E2|最大的 a2 進行更新,使得能最大限度增大目標函數的值(相似於梯度降低,此外 Ei = ui - yi,而 u = w*x - b ,求出來的 E 表明函數 ui 對輸入 xi 的預測值與真實輸出類標記 yi 之差)

  最後,每次更細完兩個乘子的優化後,都須要再從新計算 b,及對應的 Ei 值。

  綜上,SMO算法的基本思想是把 Vapnik 在 1982年提出的 Chunking方法推到極致,SMO算法每次迭代只選出兩個份量 ai 和 aj 進行調整,其餘份量則保持固定不變,在獲得 解 ai 和 aj 以後,再用 ai 和 aj 改進其餘份量。與一般的分解算法比較,儘管它可能須要更多的迭代次數,但每次迭代的計算量比較小,因此該算法表現出較好的快速收斂性,且不須要存儲核函數,也沒有矩陣運算。

5.3  SMO算法的實現

  行文至此,我相信,SVM理解到了必定程度後,是的確能在腦海裏從頭至尾推導出相關公式的,最初分類函數,最大化分類間隔,max1/||w||,min1/2||w||^2,凸二次規劃,拉格朗日函數,轉化爲對偶問題,SMO算法,都爲尋找一個最優解,一個最優分類平面。一步步梳理下來,爲何這樣那樣,太多東西能夠追究,最後實現。

  至於上文中將闡述的核函數則是爲了更好的處理非線性可分的狀況,而鬆弛變量則是爲了糾正或約束少許「不安分」或脫離集體很差歸類的因子。

      臺灣的林智仁教授寫了一個封裝SVM算法的libsvm庫,你們能夠看看,此外這裏還有一份libsvm的註釋文檔。在這篇論文《fast training of support vector machines using sequential minimal optimization》中platt給出了SMO算法的邏輯代碼。

5.4  SMO算法的優缺點

  優勢:

  • 可保證解的全局最優解,不存在陷入局部極小值的問題
  • 分類器複雜度由支撐向量的個數,而非特徵空間(或核函數)的維數決定,所以較少因維數災難發生過擬合線性

  缺點:

  1. 須要求解二次規劃問題,其規模與訓練模式量成正比,所以計算複雜度高,且存儲開銷大,不適用於需進行在線學習/訓練的大規模分類問題
     

  這篇文章主要參考:https://mp.weixin.qq.com/s/ZFWJUazMbAqeoSIkXjuG5g

相關文章
相關標籤/搜索