1. 程式人生 > >【支援向量機SVM】 演算法原理 公式推導 python程式設計實現

【支援向量機SVM】 演算法原理 公式推導 python程式設計實現

1.前言

    如圖,對於一個給定的資料集,通過直線A或直線B(多維座標系中為平面A或平面B)可以較好的將紅點與藍點分類。那麼線A與線B那個更優呢?

                 

在SVM演算法中,我們認為線A是優於線B的。因為A的‘分類間隔’大於B。

         那麼什麼是分類間隔呢? 以A線所在圖為例,平移直線A直到找到一個極限位置,越過該位置,就會產生分類錯誤的現象。如圖,直線A左右兩邊的直線就是所謂的極限位置,再往左或者往右移動一下直線都會出現分類錯誤的情況。這2條直線之前的垂直距離就是分類間隔。(2d)

     而這2條直線中間的分界線也是分類間隔中心所在的直線就是SVM的‘最優決策面

    而這兩條直線上面的點,我們稱之為‘支援向量

     通俗一點來說,SVM的分類目的就是找到最大的分類間隔即使得2倍的d最大。

2.SVM的最優化問題

    首先回顧一下初中便開始接觸的知識:

    對於求座標系中任意點\small \bg_white \small (x^{i},y^{i})到直線\small Ax+By+C=0的距離,我們很容易給出下面的式子:

                                            \small d=\frac{\left | Ax^{i}+By^{i}+C \right |}{\sqrt{A^{2}+B^{2}}}

   把這個原理應用在N維的空間會怎樣?首先N維空間的曲線我們可以用一個我們熟知的式子來表示:

                                                    \small W^{T}x+b=0

  那麼空間中任意一點到曲線的距離可以表示為:

                                               \small d=\frac{\left | W^{T}x^{i}+b\right |}{\left \| W \right \|}

  其中:\small \left \| W \right \|=\sqrt{w_{1}^{2}+w_{2}^{2}+w_{3}^{2}+....+w_{n}^{2}}

  我們令左側的資料的類別為-1,及對應決策平面左側的點\small y^{i}=-1。同理,右側的點為+1,\small y^{i}=1

你不用去在意為什麼是-1和1,實質上你可以令其為任何你想的數,只是用1和-1會在之後的計算中更為簡便一些。

那麼決策平面A左右2側的極限位置外的點我們就可以這樣表示:

                                               \bg_white \large \left\{\begin{matrix} \frac{\left | W^{T}x^{i}+b\right |}{\left \| W \right \|}\geq d& y^{(i)}=1\\ \frac{\left | W^{T}x^{i}+b\right |}{\left \| W \right \|}\leq -d& y^{(i)}=-1\end{matrix}\right.

移項:

                                               \bg_white \large \left\{\begin{matrix} \frac{\left | W^{T}x^{i}+b\right |}{\left \| W \right \|d}\geq 1& y^{(i)}=1\\ \frac{\left | W^{T}x^{i}+b\right |}{\left \| W \right \|d}\leq -1& y^{(i)}=-1\end{matrix}\right.

我們令

                                                \frac{W^{T}}{\left \| W \right \|d}=W^{T}_{d}

              \frac{b}{\left \| W \right \|d}=b_{d}

那麼原式就可以轉化為

                                                \left\{\begin{matrix}\left | W^{T}_{d}x^{i}+b_{d}\right |\geq 1& y^{(i)}=1\\ \left | W^{T}_{d}x^{i}+b_{d}\right |\leq -1& y^{(i)}=-1\end{matrix}\right

對於決策平面A我們也可以用同樣的方式表示:

                                                  \small W^{T}_{d}x^{i}+b_{d}=0  

這裡有個技巧性的辦法,因為我們之前令\small y^{i}=+1 /-1。那麼上式也可以轉化為:

                                                  y^{(i)}[ W^{T}_{d}x^{i}+b_{d}] \geq 1

為了之後的便於書寫,通常情況下,在這個時候,我們會直接設

                                                   W^{T}_{d}=W^{T}         b_{d}=b

*這裡的W^{T}b與之前的W^{T}b是不同的概念,相差了一個係數\frac{1}{\left \| W \right \|d}的關係,這樣做也是為了便於書寫,這些是約定俗成的

*記住在這之後的W^{T}b都是\frac{W^{T}}{\left \| W \right \|d},\frac{b}{\left \| W \right \|d}

這樣之後

                                               \left\{\begin{matrix}\left | W^{T}_{d}x^{i}+b_{d}\right |\geq 1& y^{(i)}=1\\ \left | W^{T}_{d}x^{i}+b_{d}\right |\leq -1& y^{(i)}=-1\end{matrix}\right

                                                 \small W^{T}_{d}x^{i}+b_{d}=0

                                                 y^{(i)}[ W^{T}_{d}x^{i}+b_{d}] \geq 1

就轉化為了

                                                 \left\{\begin{matrix}\left | W^{T}x^{i}+b\right |\geq 1& y^{(i)}=1\\ \left | W^{T}x^{i}+b\right |\leq -1& y^{(i)}=-1\end{matrix}\right

                                                 \small W^{T}x^{i}+b=0

                                                 y^{(i)}[ W^{T}x^{i}+b] \geq 1

所以我們求最大分割間隔的長度問題就可以表示為:

                                               \small max(2d)=max(\frac{2\left | W^{T}x^{i}+b\right |}{\left \| W \right \|})

而我們知道決策平面平移的極限條件為y^{(i)}[ W^{T}x^{i}+b] =1,所以:

                                                \small max(2d)=max(\frac{2\left | W^{T}x^{i}+b\right |}{\left \| W \right \|})=max(\frac{2}{\left \| W \right \|})=min(\frac{1}{2}\left \| W \right \|)

通常情況下我們不會去求\small min(\frac{1}{2}\left \| W \right \|)而是轉而去求\small min(\frac{1}{2}\left \| W \right \|^{2})的值,這實質上也是為了計算方便,但是從理論上上兩者結果並無差別。

我們梳理一下重點內容,通過上面的推到,我們把一個分類的問題轉化為了一個最優化問題,

                                                           min(\frac{1}{2}\left \| W \right \|^{2})

                                                           {\color{Red} s.t.}y^{(i)}[ W^{T}x^{i}+b] \geq 1     {\color{Red} s.t.}表示的是限定的條件)

3.解決SVM最優化問題

上一節我們由分類間隔的思想得到一個最優化問題。這節將以純數學的方式和大家一起解決這個最優化問題。

首先需要為大家介紹一下,拉格朗日運算元。

百度百科:
   在數學最優化問題中,拉格朗日乘數法(以數學家約瑟夫·路易斯·拉格朗日命名)是一種尋找變數受一個或多個條件所限制的多元函式的極值的方法。這種方法將一個有n 個變數與k 個約束條件的最優化問題轉換為一個有n + k個變數的方程組的極值問題,其變數不受任何約束。這種方法引入了一種新的標量未知數,即拉格朗日乘數:約束方程的梯度(gradient)的線性組合裡每個向量的係數。

拉格朗日運算元的定義是生澀不易懂的,所以這裡我將用一個例題來讓對SVM中拉格朗日運算元的作用有更深刻的認識:

例:給定橢球\bg_white \frac{x^{2}}{a^{2}}+\frac{y^{2}}{b^{2}}+\frac{z^{2}}{c^{2}}=1,求這個橢球的內接長方體的最大體積,即f(x,y,z)=8xyz的最大值的最大值

                      解:建立拉普拉斯算式,算式的偏導為0

                               \bg_white f(x,y,z)=8xyz+\lambda(\frac{x^{2}}{a^{2}}+\frac{y^{2}}{b^{2}}+\frac{z^{2}}{c^{2}}-1)

                               f(x,y,z)x,y,z的偏導結果為0

                                \large \left\{\begin{matrix} \frac{\partial f(x,y,z)}{\partial x}=8yz+\frac{2\lambda x}{a^2}=0\\ \frac{\partial f(x,y,z)}{\partial y}=8xz+\frac{2\lambda y}{b^2}=0\\ \frac{\partial f(x,y,z)}{\partial z}=8xy+\frac{2\lambda z}{c^2}=0\\ \frac{\partial f(x,y,z)}{\partial \lambda }= \frac{x^{2}}{a^{2}}+\frac{y^{2}}{b^{2}}+\frac{z^{2}}{c^{2}}-1=0\end{matrix}\right.

                              聯立四個方程:

                                \left\{\begin{matrix} bx=ay\\cy=bz\\az=cx \end{matrix}\right.

                              代入\bg_white \frac{x^{2}}{a^{2}}+\frac{y^{2}}{b^{2}}+\frac{z^{2}}{c^{2}}=1

                               \left\{\begin{matrix} x=\frac{\sqrt{3}}{3}a\\y=\frac{\sqrt{3}}{3}b\\z=\frac{\sqrt{3}}{3}c\end{matrix}\right.

                            於是得到:

                               max(f(x,y,z))=\frac{8\sqrt{3}}{9}abc

同樣以拉格朗日的運算元的原理來求解我們SVM分類的最優化問題:

                                                            min(\frac{1}{2}\left \| W \right \|^{2})

                                                           {\color{Red} s.t.}y^{(i)}[ W^{T}x^{i}+b] \geq 1     {\color{Red} s.t.}表示的是限定的條件)

由拉格朗日運算元定義可以轉化成:

                                             L(w,b,x_{i})=\frac{1}{2}\left \| w \right \|^{2}-\sum _{i=1}^{n}\alpha _{i}(y^{(i)}[ W^{T}x^{i}+b]-1)

其中L(w,b,x_{i})w,b的偏導為0

                                               \large \left\{\begin{matrix} \frac{\partial L(w,b,x_{i})}{\partial w}=w-\sum_{i=1}^{n}\alpha _{i}x^{(i)}y^{(i)} =0\\ \frac{\partial L(w,b,x_{i})}{\partial b}=\sum_{i=1}^{n}\alpha_{i}y^{(i)}=0\end{matrix}\right.

得到結果:

                                              \large w=\sum_{i=1}^{n}\alpha _{i}x^{(i)}y^{(i)}           \large \sum_{i=1}^{n}\alpha_{i}y^{(i)}=0

將這2個結果代入L(w,b,x_{i})

                             L(w,b,x_{i})=

                                        \small =\frac{1}{2}\sum_{i=1}^{n}\alpha _{i}x^{(i)}y^{(i)}\sum_{j=1}^{n}\alpha _{j}x^{(j)}y^{(j)}-\sum_{i=1}^{n}\alpha _{i}x^{(i)}y^{(i)}\sum_{j=1}^{n}\alpha _{j}x^{(j)}y^{(j)} -\sum_{i=1}^{n}\alpha_{i}y^{(i)}b+\sum_{i=1}^{n}\alpha_{i}

                                        \bg_white \small \dpi{100} \small =\sum_{i=1}^{n}\alpha_{i}-\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}\alpha _{i}\alpha _{j}y^{(i)}y^{(j)}x^{(i)}x^{(j)}

 所以我們的最優化問題就轉化為了:

                                 \large \bg_white \small max[\sum_{i=1}^{n}\alpha_{i}-\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}\alpha _{i}\alpha _{j}y^{(i)}y^{(j)}x^{(i)}x^{(j)}]

                                 {\color{Red} s.t.}\sum_{i=1}^{n}\alpha_{i}y^{(i)}=0

                                         0\leq \alpha_{i}\leq C

4.SVM的核函式

     在第三節中,我們將最優化問題使用拉格朗日運算元進行了轉化,在這一小節要介紹的是SVM的核函式,瞭解SVM是怎麼通過核函式減少欠擬合和過擬合現象的。

                    首先觀察式子 \large \bg_white \small max[\sum_{i=1}^{n}\alpha_{i}-\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}\alpha _{i}\alpha _{j}y^{(i)}y^{(j)}x^{(i)}x^{(j)}]

發現這個式子會對每個\large x^{(i)},x^{(j)}進行點乘,現在我們將\large x^{(i)},x^{(j)}新增上多項式特徵使其得到更為複雜的分割曲線:

我們設具有多項式特徵的\large x^{(i)},x^{(j)}表示為\large x^{'(i)},x^{'(j)},現在假設,我們找到一個函式使得:

                                            \large K(x^{(i)},x^{(j)})=x^{'(i)},x^{'(j)}

那麼求解具有多項式特徵的SVM分類器的最優化問題就轉化為:

                                        \large \bg_white \small max[\sum_{i=1}^{n}\alpha_{i}-\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}\alpha _{i}\alpha _{j}y^{(i)}y^{(j)}K(x^{(i)},x^{(j)})]

         而這個函式\large K(x^{(i)},x^{(j)})就是所謂的核函式

        如果不使用核函式,那麼我們需要先將\large x^{(i)},x^{(j)}轉化為\large x^{'(i)},x^{'(j)}然後再將\large x^{'(i)},x^{'(j)}代入最優化式子去求解。而設定這個核函式就是為了直接將\large x^{(i)},x^{(j)}代入最優化式子求得多項式最優解。這樣減少了部分計算機計算開銷和儲存開銷。

          從這一點可以看出核函式並不是SVM的專用方法,實質上在我們求解最優化問題上遇到\large x^{(i)}點乘\large x^{(j)}的時候,我們都可以使用到核函式這種技巧。

4.0線性核函式

                                   \bg_white \large \dpi{100} \large K(x,y})=x\cdot y

4.1多項式核函式(poly)

                                      \large \dpi{100} \large K(x,y})=(x\cdot y+c)^{d}

我們以2次項為例子,如果我們直接算\large K(x_{i},y_{i})=x^{'}y^{'},我們需要下面這個幾個步驟:

                             \large K(x_{i},y_{i})=(\sum _{i=1}^{n}x_{i}x_{i}+1)^{2}

                                               \large =\sum _{i=1}^{n}x_{i}^{2}y_{i}^{2}+\sum _{i=2}^{n}\sum _{j=1}^{i-1}(\sqrt{2}x_{i}x_{j})(\sqrt{2}y_{i}y_{j})+\sum _{i=1}^{n}\sqrt{2}x_{i}\sqrt{2}y_{i}+1

                                                 \large =x^{'}y^{'}

                         通過上面這個式子,我們可以直接理解為我們將原來的\large x轉化成了

                          \large x^{'}=(x^{2}_{n}...x^{2}_{1},\sqrt{2}x_{n}x_{n-1}.....\sqrt{2}x_{2}x_{1},\sqrt{2}x_{n}....\sqrt{2}x_{1},1)

而使用到核函式這種方法,我們就直接將x,y帶入\large K(x,y})=(x\cdot y+1)^{2},這種方式大大的降低了我們計算的複雜度。

回到這個我們最優化問題中:

                            \large \bg_white \small max[\sum_{i=1}^{n}\alpha_{i}-\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}\alpha _{i}\alpha _{j}y^{(i)}y^{(j)}K(x^{(i)},x^{(j)})]

我們只用將\large K(x,y})替換成\large (x\cdot y+1)^{d},就為其添加了多項式的特徵。其實應該為\large (x\cdot y+c)^{d}這個C為正則化的係數。

4.2高斯核函式(rbf)

                                        \bg_white \large \dpi{100} \large K(x,y})=e^{-\gamma \left \| x-y \right \|^{2}}

首先我們介紹下高斯函式:

                                      \large g(x)=\frac{1}{\sigma \sqrt{2\pi }}e^{-\frac{1}{2}(\frac{x-\mu }{\sigma})^{2}}

高斯核的轉化方式如上圖:雙曲線與座標軸的交點為l_{1},l_{2}                                                                    

                                                  \bg_white \large x\rightarrow (e^{-\gamma \left \| x-l_{1} \right \|^{2}},e^{-\gamma \left \| x-l_{2} \right \|^{2}})

關於高斯核函式的解釋我使用視覺化的方式我覺得這樣可以方便理解:使用工具python的numpy和matpoltlib

import numpy as np
import matplotlib.pyplot as plt
#定義一個從-4到5分佈的數值,分割間隔為1
In [1]:x=np.arange(-4,5,1)
Out[1]: array([-4, -3, -2, -1,  0,  1,  2,  3,  4])
#將-2到2之間的點歸為一類,類別為1,將小於-2和大於2的點歸為一類,類別為0
In [2]:y=np.array((x>=-2)&(x<=2),dtype='int')
Out[2]: array([0, 0, 1, 1, 1, 1, 1, 0, 0])
#視覺化一下
plt.scatter(x[y==0],[0]*len(x[y==0]))
plt.scatter(x[y==1],[0]*len(x[y==1]))
plt.show()

#定義高斯核的公式:
def gaussian(x,l):
    gamma=1.0
    return np.exp(-gamma * (x-l)**2)
#定義L1和L2的值,即分類的邊界點
l1 , l2 = -1, 1
#開闢一個新的空間,用於存放之後計算出來的額高斯值
new_x = np.empty((len(x),2))
#將x中的每個值代入高斯核函式中
for i,data in enumerate(x):
    new_x[i,0] = gaussian(data, l1)
    new_x[i,1] = gaussian(data, l2)
#視覺化一下代入高斯核函式後的x分佈情況
plt.scatter(new_x[y==0,0],new_x[y==0,1])
plt.scatter(new_x[y==1,0],new_x[y==1,1])
plt.show()    

從視覺化的圖形可以看出,經過高斯核函式後的x變得線性可分了。

打賞一下作者: