當前位置:編程學習大全網 - 編程語言 - 支持向量機—從推導到python手寫

支持向量機—從推導到python手寫

筆者比較懶能截圖的地方都截圖了。

支持向量機分為三類:

(1)線性可分支持向量機,樣本線性可分,可通過硬間隔最大化訓練壹個分類器。

(2)線性支持向量機,樣本基本線性可分,可通過軟間隔最大化訓練壹個分類器。

(3)非線性支持向量機,樣本線性不可分,可通過核函數和軟間隔最大化訓練壹個分類器。

上面最不好理解的恐怕就是硬間隔和軟間隔了,

說白了硬間隔就是說存在這麽壹個平面,可以把樣本完全正確無誤的分開,當然這是壹種極理想的情況,現實中不存在,所以就有了軟間隔。

軟間隔說的是,不存在壹個平面可以把樣本完全正確無誤的分開,因此呢允許壹些樣本被分錯,怎麽做呢就是加入松弛變量,因為希望分錯的樣本越小越好,因此松弛變量也有約束條件。加入松弛變量後,問題就變為線性可分了,因為是每壹個樣本都線性可分,因此松弛變量是針對樣本的,每壹個樣本都對應壹個不同的松弛變量。

其實感知機說白了就是找到壹條直線把樣本點分開,就是上方都是壹類,下方是另壹類。當然完全分開是好事,往往是不能完全分開的,因此就存在壹個損失函數,就是誤分類點到這個平面的距離最短:

這裏啰嗦壹句,誤分類點y*(wx+b)<0,所以加個負號在前邊。

壹般情況下||w||都是可以縮放,那麽我們把它縮放到1,最後的目標函數就變成了

間隔就是距離,我們假設分離超平面為 ,那麽樣本點到這個平面的距離可以記為 。我們都知道通過感知機劃分的點,超平面上方的點 ,下方的點 ,然後通過判斷 的值與y的符號是否壹致來判斷分類是否正確。根據這個思路函數間隔定義為:

支持向量的定義來源於幾何間隔,幾何間隔最直接的解釋是離分隔超平面最近點的距離,其他任何點到平面的距離都大於這個值,所以幾何間隔就是支持向量。然後呢同樣道理,w和b是可以縮放的,所以定義支持向量滿足如下條件:

再通俗壹點說,支持向量是壹些點,這些點到分隔平面的距離最近,為了便於表示,把他們進行壹下縮放計算,讓他們滿足了wx+b=+-1.

核函數是支持向量機的核心概念之壹,它存在的目的就是將維度轉換之後的計算簡化,達到減少計算量的目的。我們都知道支持向量機求的是間距最大化,通常情況下我們求得的alpha都等於0,因此支持向量決定了間距最大化程度。

核函數的形式是這樣的

其中x(i)和x(j)都是向量,他們兩個相乘就是向量內積,相乘得到壹個數。剛才說了目標函數壹般只和支持向量有關,因此在做核函數計算之前,實際就是選擇的支持向量進行計算。

這個寫完下面得再補充

我們知道了支持向量的概念,那麽支持向量機的目標函數是要使這兩個支持向量之間的距離盡可能的遠,因為這樣才能更好地把樣本點分開,當然支持向量也要滿足最基本的約束條件,那就是分類正確,還有就是其他點到分隔平面的距離要大於等於支持向量到分隔平面的距離。

這種凸優化問題都可以通過拉格朗日算子進行優化,就是把約束條件通過拉格朗日系數放到目標函數上。這部分基礎知識,就是拉格朗日算法可以將等式約束和不等式約束都加到目標函數上,完成求解問題的轉換,但是要滿足壹些約束條件,也就是我們後邊要說的kkt條件。

這裏有個細節就是轉換時候的加減號問題,這個和目標函數還有約束的正負號有關。壹般這麽理解,就是求最小化問題時候,如果約束是大於0的,那麽拉個朗日算子可以減到這壹部分,這樣壹來目標函數只能越來越小,最優解就是約束為0的時候,這個時候和沒有約束的等價,再求最小就是原問題了。

這裏是最小化問題,直接減掉這部分約束,然後後半部分永遠大於等於0所以這個式子的值是要小於原來目標函數值的。我們知道當x滿足原問題的約束條件的時候,最大化L就等於那個原目標函數。所以我們可以把這個問題轉化為:

把它帶回去原來的目標函數中,整理壹下。

這個時候只要求最優的α,就可以求出w和b了。我們上邊做了那麽壹堆轉換,這個過程要滿足壹個叫做kkt條件的東西,其實這個東西就是把壹堆約束條件整理到壹起。

(1)原有問題的可行性,即h(x )=0,g(x )<0

放到這裏就是:

SMO算法的核心思想是求出最優化的α,然後根據之前推導得到的w,b,α之間的關系計算得到w和b,最後的計算公式是:

現在的問題就是怎麽求α了。

SMO算法總***分兩部分,壹部分是求解兩個α的二次規劃算法,另壹部分是選擇兩個α的啟發式算法。

先說這個選擇α的啟發式算法部分:大神可以證明優先優化違反kkt條件的α可以最快獲得最優解,至於咋證明的,就先不看了。

在講支持向量機的求解算法時候,直接給出了核函數K,那麽怎麽去理解核函數呢。核函數的作用是解決樣本點在高維空間的內積運算問題,怎麽理解呢,通常的分類問題都是有很多個特征的,然後為了達到現線性可分,又會從低維映射到高維,樣本量再壹多計算量非常大,因此先通過函數進行壹個轉換,減少乘法的計算量。

要理解核函數,先理解內積運算,內積運算實際是兩個向量,對應位置相乘加和,比如我有x1 = [v1,v2], x2=[w1,w2],那麽x1和x2的內積計算方法就是:v1w1+v2w2。

如果上面那種情況線性不可分,需要到高維進行映射,讓數據變得線性可分,然後數據變為五維的,即v1 2+v2 2+v1+v2+v1v2,然後再進行壹次內積計算,數據變為 。

稍作變換,可以變為 ,形式展開和上邊那個長式子差不多,然後其實可以映射內積相乘的情況,所以可以進行核函數的變化。

問題在於,當妳需要顯式的寫出來映射形式的時候,在維度很高的時候,需要計算的量太大,比如x1有三個維度,再進行映射就有19維度了,計算很復雜。如果用核函數,還是在原來低維度進行運算,既有相似的效果(映射到高維),又低運算量,這就是核函數的作用了。

核函數的種類:

這部分的核心在於SMO算法的編寫。有待補充。

  • 上一篇:C語言 電影院售票(坐位)系統
  • 下一篇:黑龍江的地形對航運有什麽影響?
  • copyright 2024編程學習大全網