目錄html
更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
支持向量機分爲三種,線性可分支持向量機和線性支持向量機都是對線性可分的數據作處理,線性支持向量機也僅僅是對異常值作處理,並非真正的對非線性可分數據作處理,接下來將會介紹支持向量機的第三種方法非線性支持向量機(non-linear support vector machine)。算法
曾在線性迴歸中講到過多項式迴歸,此處只作簡單回顧。數據結構
假設一個正方體的房子的價格與房子的邊長、房子的佔地面積和房子的體積有關係,然而如今只有房子的邊長\(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 \]
經過上述轉變能夠看到把線性迴歸轉換成多項式迴歸以後又變回了線性迴歸,即對於一維不是線性的數據,把它映射到了三維以後,數據則變成了線性的數據。機器學習
其實非線性支持向量機即運用了這個思想,即非線性支持向量機把低維特徵數據映射到高維,讓數據變得線性可分,此時問題就變成了線性可分的數據分類問題。函數
首先回顧線性支持向量機的目標函數的優化問題爲
\[ \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個,而是成千上萬個,若是再對特徵進行映射處理,那麼特徵的維度的快速增長,計算強度也隨之增長,並且遇到無窮維的特徵,那麼根本沒法計算,因此這並非很合理的。而核函數則很好的解決了計算量大的問題。學習
設\(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^*) \]
假設輸入空間是\(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 \]
若是已知映射\(\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庫中僅有的幾個核函數。
線性核函數(linear kernel)本質上就是線性支持向量機,既能夠把線性支持向量機稱做使用線性核函數的非線性支持向量機,線性核函數的表達式爲
\[ K(x,z) = xz \]
在此情形下,分類決策函數爲
\[ f(x) = sign(\sum_{i=1}^m{\alpha_i}^*y_i(xx_i)+b^*) \]
多項式核函數(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^*) \]
高斯核函數(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^*) \]
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^*) \]
# 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()
有\(m\)個樣本的線性可分訓練集\(T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}\),其中\(x_i\)爲\(n\)維特徵向量,\(y_i\)爲二元輸出即值爲\(1\)或者\(-1\)。
分離超平面的參數\(w^*\)和\(b^*\)以及分類決策函數
非線性支持向量機借用了多項式迴歸的思想,把數據映射到高維空間,讓數據從線性不可分變得線性可分。又因爲核函數的使用,它不須要在數據集映射到高維以後再去計算特徵之間的關係,而是在數據映射以前就可以計算特徵之間的關係,這也正是核函數的巧妙之處。
線性支持向量機其實仍是有一個很大的問題,人們老是追求完美,若是這麼13的算法既可以支持分類問題,又可以支持迴歸問題那豈不是上天了,這種算法有是必定有的,即支持向量迴歸(support vector regression, SVR)。