02-33 非線性支持向量機

更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython

非線性支持向量機

支持向量機分爲三種,線性可分支持向量機和線性支持向量機都是對線性可分的數據作處理,線性支持向量機也僅僅是對異常值作處理,並非真正的對非線性可分數據作處理,接下來將會介紹支持向量機的第三種方法非線性支持向量機(non-linear support vector machine)。算法

1、非線性支持向量機學習目標

  1. 核技巧
  2. 正定核函數
  3. 經常使用的4個核函數
  4. 非線性支持向量機的步驟

2、非線性支持向量機詳解

2.1 多項式迴歸和非線性支持向量機

曾在線性迴歸中講到過多項式迴歸,此處只作簡單回顧。數據結構

假設一個正方體的房子的價格與房子的邊長、房子的佔地面積和房子的體積有關係,然而如今只有房子的邊長\(x_1\)一個特徵,若是隻拿特徵去預測房子的價格,則有很大可能會欠擬合,所以須要增長房子的佔地面積和體積這兩個特徵,即
\[ \hat{y} = \omega_1x_1 + \omega_2{x_1}^2 + \omega_3{x_1}^3 + b \]
\(x_1=x_1,x_2={x_1}^2,x_3={x_1}^3\),則多項式的線性模型變成
\[ \hat{y} = \omega_1x_1 + \omega_2x_2 + \omega_3x_3 + b \]
經過上述轉變能夠看到把線性迴歸轉換成多項式迴歸以後又變回了線性迴歸,即對於一維不是線性的數據,把它映射到了三維以後,數據則變成了線性的數據。機器學習

其實非線性支持向量機即運用了這個思想,即非線性支持向量機把低維特徵數據映射到高維,讓數據變得線性可分,此時問題就變成了線性可分的數據分類問題。函數

2.2 核技巧

2.2.1 核函數引入

首先回顧線性支持向量機的目標函數的優化問題爲
\[ \begin{align} & \underbrace{\min}_{\alpha} {{\frac{1}{2}}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j(x_ix_j)-\sum_{i=1}^m\alpha_i} \\ & s.t. \quad \sum_{i=1}^m\alpha_iy_i=0 \\ & \quad\quad 0\leq\alpha_i\geq{C} \end{align} \]
從上式能夠發現線性支持向量機的目標函數對於特徵的處理是以\(x_ix_j\)的形式出現的,此時若是定義一個低維特徵空間到高維特徵空間的映射函數\(\phi(x)\),讓全部特徵映射到一個更高的維度,讓數據線性可分,所以則能夠繼續按照線性支持向量機的方法優化目標函數,進而求出分離超平面和分類決策函數,即線性支持向量機的目標函數的優化問題變成了
\[ \begin{align} & \underbrace{\min}_{\alpha} {{\frac{1}{2}}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j(\phi(x_i)\phi(x_j))-\sum_{i=1}^m\alpha_i} \\ & s.t. \quad \sum_{i=1}^m\alpha_iy_i=0 \\ & \quad\quad 0\leq\alpha_i\geq{C} \end{align} \]
能夠發現使用該方法貌似完美的解決了該問題,而且因爲只是改動了數據的特徵維度,可是以前一直使用的數據都是測試數據,若是真的到了生產上,那麼特徵可能不只僅就是1個、2個,而是成千上萬個,若是再對特徵進行映射處理,那麼特徵的維度的快速增長,計算強度也隨之增長,並且遇到無窮維的特徵,那麼根本沒法計算,因此這並非很合理的。而核函數則很好的解決了計算量大的問題。學習

2.2.2 核函數

\(X\)是低維輸入空間(歐式空間\(R^n\)的子集或離散集合),\(H\)爲高維特徵空間(希爾伯特空間),若果存在一個從\(X\)\(H\)的映射\(\phi(x):X \rightarrow H\)使得對全部的\(x,z\in{X}\),函數\(K(x,z)\)知足條件
\[ K(x,z)=\phi(x)\phi(z) \]
則稱\(K(x,z)\)爲核函數,\(\phi(x)\)爲映射函數,式中的\(\phi(x)\phi(z)\)\(\phi(x)\)\(\phi(z)\)的內積。測試

因爲\(x,z\in{X}\),在計算\(K(x,z)\)的時候是在低維輸入空間\(R^n\)中直接計算的,而不是經過\(\phi(x)\phi(z)\)計算出\(K(x,z)\),由於\(\phi\)是輸入空間\(R^n\)到特徵空間\(H\)的映射,特徵空間\(H\)通常是高維的,甚至是無窮維的,而且就算給定了核\(K(x,z)\),特徵空間和映射函數也不是惟一的,能夠有多種不一樣的映射關係即不一樣的特徵空間,即便是在同一特徵空間裏也能夠取不一樣的映射關係。優化

總而言之核函數的好處在於它在低維空間上計算,而將實質上的分類效果即內及計算表如今了高維空間中,所以避免了直接在高維中的複雜計算。網站

經過使用核函數\(K(x,z)\)後非線性支持向量機的分離超平面爲
\[ \sum_{i=1}^m \sum_{i=1}^m{\alpha_i}^*y_iK(x,x_i)+b^* = 0 \]
分類決策函數爲
\[ f(x) = sign(\sum_{i=1}^m{\alpha_i}^*y_iK(x,x_i)+b^*) \]

2.2.3 核函數舉例

假設輸入空間是\(R^2\),核函數是\(K(x,z)=(xz)^2\),則能夠經過上述信息找到特徵空間\(H\)和映射\(\phi(x):R^2\rightarrow{H}\)

取特徵空間\(H=R^3\),因爲輸入空間是二維的,記\(x=(x_1,x_2)^T\)\(z=(z_1,z_2)^T\),因爲
\[ (xz)^2 = (x_1z_1+x_2z_2)^2=(x_1z_1)^2+2x_1z_1x_2z_2+(x_2z_2)^2 \]
即得映射爲
\[ \phi(x)=((x_1)^2,\sqrt{2}x_1x_2,(x_2)^2)^T \]
容易驗證
\[ \phi(x)\phi(z)=(xz)^2=K(x,z) \]
若是特徵空間仍是爲\(H=R^3\),可得映射爲
\[ \phi(x)={\frac{1}{\sqrt{2}}}((x_1)^2-(x_2)^2,2x_1x_2,(x_1)^2+(x_2)^2)^T \]
一樣容易驗證
\[ \phi(x)\phi(z)=(xz)^2=K(x,z) \]
若是特徵空間爲\(H=R^4\),可得映射爲
\[ \phi(x)=((x_1)^2,x_1x_2,x_1x_2,(x_2)^2)^T \]

2.3 正定核函數

若是已知映射\(\phi(x)\),能夠經過\(\phi(x)\)\(\phi(z)\)的內積求得核函數,可是不構造映射可否直接判斷一個給定的函數是否是核函數呢?下面將講述函數得知足什麼條件才能成爲一個核函數。

通常狀況下核函數都稱做正定核函數(positive definite kernel function),此處將直接說明正定核函數的充要條件。一個函數想要成爲一個正定核函數,必須知足它裏面的任何點的集合造成的Gram矩陣是半正定的,即對於任意的\(x_i\in{X},\quad i=1,2,\ldots,m\)\(K(x_i,x_j)\)對應的Gram矩陣\(K=[K(x_i,x_j)]_{m*m}\)是半正定矩陣,則\(K(x,x)\)是正定核函數。

因爲尋找某個函數是否爲核函數的過程是很是困難的,此處很少贅述。而且牛人們已經找到了不少核函數,但在實際問題中經常使用的核函數就只有幾個,接下來將只介紹工業上經常使用的幾個核函數,同時這些核函數也是sklearn庫中僅有的幾個核函數。

2.4 線性核函數

線性核函數(linear kernel)本質上就是線性支持向量機,既能夠把線性支持向量機稱做使用線性核函數的非線性支持向量機,線性核函數的表達式爲
\[ K(x,z) = xz \]
在此情形下,分類決策函數爲
\[ f(x) = sign(\sum_{i=1}^m{\alpha_i}^*y_i(xx_i)+b^*) \]

2.5 多項式核函數

多項式核函數(polynomial kernel)是線性支持向量機經常使用的核函數之一,表達式爲
\[ K(x,z) = (\gamma{xz}+r)^d \]
其中\(\gamma,r,d\)都是超參數。

在此情形下,分類決策函數爲
\[ f(x) = sign(\sum_{i=1}^m{\alpha_i}^*y_i((\gamma{xx_i}+r)^d)+b^*) \]

2.6 高斯核函數

高斯核函數(Gaussian kernel)對應的支持向量機是高斯徑向基函數(radial basis function,RBF)分類器,它是非線性支持向量機最主流的核函數,表達式爲
\[ K(x,z) = e^{-\gamma{||x-z||}^2}, \quad \gamma>0 \]
其中\(\gamma\)是超參數。

在此情形下,分類決策函數爲
\[ f(x) = sign(\sum_{i=1}^m{\alpha_i}^*y_i(e^{\gamma{||x-x_j||}^2})+b^*) \]

2.7 Sigmoid核函數

Sigmoid核函數(sigmoid kernel)也是線性支持向量機經常使用的核函數之一,表達式爲
\[ K(x,z) = \tanh(\gamma{xz}+r) \]
其中\(\gamma,r\)都是超參數,\(\tanh()\)爲雙曲正切函數(注:該函數圖形相似於Sigmoid函數,至於爲何還要稱做Sigmoid核函數,你能夠問問sklearn的做者)。

在此情形下,分類決策函數爲
\[ f(x) = sign(\sum_{i=1}^m{\alpha_i}^*y_i(\tanh\gamma{xx_j}+r)+b^*) \]

2.7.1 tanh()函數

# tanh()函數圖例
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.linspace(-5, 5, 666)
y = np.tanh(x)

plt.plot(x, y, label='tanh()')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

png

2.8 核函數的選擇

  1. 若是Feature的數量很大,跟樣本數量差很少,這時候選用LR或者是Linear Kernel的SVM
  2. 若是Feature的數量比較小,樣本數量通常,不算大也不算小,選用SVM+Gaussian Kernel
  3. 若是Feature的數量比較小,而樣本數量不少,須要手工添加一些feature變成第一種狀況
  4. 若是沒法肯定使用哪一個核函數,能夠全部的核函數都測試幾回,而後斷定哪一個核函數更適合

3、非線性支持向量機流程

3.1 輸入

\(m\)個樣本的線性可分訓練集\(T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}\),其中\(x_i\)\(n\)維特徵向量,\(y_i\)爲二元輸出即值爲\(1\)或者\(-1\)

3.2 輸出

分離超平面的參數\(w^*\)\(b^*\)以及分類決策函數

3.3 流程

  1. 選擇適當的核函數\(K(x,z)\)和一個懲罰係數\(C>0\),構造約束優化問題爲
    \[ \begin{align} & \underbrace{\min}_{\alpha} {\frac{1}{2}} \sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j(K(x_i,x_j)) - \sum_{i=1}^m\alpha_i \\ & s.t. \sum_{i=1}^m \alpha_iy_i =0 \\ & \quad 0\geq\alpha_i\leq{C}, \quad i=1,2,\ldots,m \end{align} \]
  2. 使用SMO算法求出上式最小時對應的\(\alpha^*\)
  3. 計算\(w^*\)
    \[ w^* = \sum_{i=1}^m \alpha^*y_i\phi(x_i) \]
  4. 找到全部的\(S\)個支持向量,即知足\(0<{\alpha_i}^*<C\)的樣本\((x_s,y_s)\),經過\(y_s(\sum_{i=1}^S{\alpha_i}^*y_iK(x_i,x_s)+b^*)-1=0\)計算出每一個支持向量對應的\(b^*\),計算出這些全部的\(b^*\)的平均值即爲最終的\(b^*={\frac{1}{S}}\sum_{i=1}^Sb^*\)
  5. 求得分離超平面爲
    \[ \sum_{i=1}^m{\alpha_i}^*y_iK(x,x_i)+b^* = 0 \]
  6. 求得分類決策函數爲
    \[ f(x) = sign(\sum_{i=1}^m{\alpha_i}^*y_iK(x,x_i)+b^*) \]
    線性支持向量機的步驟和線性可分支持向量機的步驟大體相同,因爲線性支持向量機使用了鬆弛因子,二者之間最大的不一樣點在於對\(b^*\)值的考慮。

4、非線性支持向量機優缺點

4.1 優勢

  1. 能夠對非線性可分的數據分類

4.2 缺點

  1. 只支持二分類問題,對於多分類問題須要使用OvR等其餘輔助方法
  2. 支持分類問題不支持迴歸問題

5、小結

非線性支持向量機借用了多項式迴歸的思想,把數據映射到高維空間,讓數據從線性不可分變得線性可分。又因爲核函數的使用,它不須要在數據集映射到高維以後再去計算特徵之間的關係,而是在數據映射以前就可以計算特徵之間的關係,這也正是核函數的巧妙之處。

線性支持向量機其實仍是有一個很大的問題,人們老是追求完美,若是這麼13的算法既可以支持分類問題,又可以支持迴歸問題那豈不是上天了,這種算法有是必定有的,即支持向量迴歸(support vector regression, SVR)。

相關文章
相關標籤/搜索