【機器學習】SVM核函式的計算

artzers發表於2016-12-09

【機器學習】推導支援向量機SVM二分類中,我們已經推匯出線性核SVM的對偶優化問題:

J=iαi12ijαiαjdidjk(xi)Tk(xj)=iαi12ijαiαjdidjK(xi,xj)subject to αidi=0,0αiC
J=\sum_i \alpha_i -\frac{1}{2}\sum_i \sum_j \alpha_i \alpha_jd_id_jk(x_i)^Tk(x_j) \\ =\sum_i \alpha_i -\frac{1}{2}\sum_i \sum_j \alpha_i \alpha_jd_id_jK(x_i,x_j) \\ subject to \sum\alpha_id_i=0,0\le \alpha_i \le C

在優化好αi
\alpha_i
拉格朗日量後,我們得到的w和b為:
w=αidixib=(y1+y1)/2
w=\sum\alpha_id_ix_i \\ b = -(y_1+y_{-1})/2
需要注意的是,w
w
的表示式中有xi
x_i

  我們引入核函式K(xi,xj)
K(x_i,x_j)
到SVM,必須注意到K(xi,xj)=ϕ(xi)Tϕ(xj)
K(x_i,x_j)=\phi (x_i)^T \phi (x_j)
,也就是說理論上核函式應該能拆開。在引入核函式的前提下,w的表示式為
w=αidiϕ(xi)T
w=\sum\alpha_id_i\phi(x_i)^T

  我們已知幾個常用核函式,比如多項式核函式和徑向基核函式。多項式核函式的的定義為
K(xi,xj)=(xTixj+1)n
K(x_i,x_j)=(x_i^Tx_j+1)^n
假設n=2,那麼拆開為
K(xi,xj)=(xTi)2x2j+2xixj+1=[(xTi)2,2xTi,1][(xTj)2,2xTj,1]T
K(x_i,x_j)=(x_i^T)^2x_j^2+2x_ix_j+1=[(x_i^T)^2,\sqrt{2}x_i^T,1][(x_j^T)^2,\sqrt{2}x_j^T,1]^T
這裡,我們可以確實求出w的值。
  徑向基核函式定義為
K(xi,xj)=e(xixj)2σ2=ex2iσ2ex2jσ2exTixjσ2=ex2iσ2ex2jσ2k=0(2xTixj/σ2)kk!=[ex2iσ2,1,21xiσ,222!(xiσ)2,...][ex2jσ2,1,21xjσ,222!(xjσ)2,...]T
K(x_i,x_j)=e^{-\frac{(x_i-x_j)^2}{\sigma^2}}=e^{-\frac{x_i^2}{\sigma^2}}e^{-\frac{x_j^2}{\sigma^2}}e^{\frac{x_i^Tx_j}{\sigma^2}} \\ = e^{-\frac{x_i^2}{\sigma^2}}e^{-\frac{x_j^2}{\sigma^2}}\sum_{k=0}^{\infty}{\frac{(2 x_i^Tx_j/\sigma^2)^k}{k!}}\\ = [e^{-\frac{x_i^2}{\sigma^2}},1, \sqrt{\frac{2}{1}}\frac{x_i}{\sigma},\sqrt{\frac{2^2}{2!}}(\frac{x_i}{\sigma})^2,...][e^{-\frac{x_j^2}{\sigma^2}},1, \sqrt{\frac{2}{1}}\frac{x_j}{\sigma},\sqrt{\frac{2^2}{2!}}(\frac{x_j}{\sigma})^2,...]^T
結果表明,Φ(x)
\Phi(x)
函式是一個無限維度的函式。這說明,在工程上我們不一定能夠完美地拆開核函式為K(xi,xj)=ϕ(xi)Tϕ(xj)
K(x_i,x_j)=\phi (x_i)^T \phi (x_j)
。之後還有很多各種型別的核函式,比如使用了tanh函式的核函式,這些核函式在工程上是很難拆分求解的,很難獲取ϕ(x)
\phi(x)
函式,亦難以求取w的確切值。
  那麼如何求解引入複雜核函式的SVM呢?在優化求解J之後,我們可以獲取並儲存αi
\alpha_i
。由於SVM只有少量支援向量(資料)對決策超平面有決定作用,很多拉格朗日引數αi0
\alpha_i \rightarrow 0
,我們可以只儲存足夠大的αi
\alpha_i
以及對應的訓練資料xi
x_i
、標記di
d_i
,不直接計算出w的確切值,這在工程上是確實可行的。
  當我們需要進行預測的時候,我們匯入αi
\alpha_i
,xi
x_i
di
d_i
,然後把新資料x代入核函式,計算y=iαidiK(xi,x)+b
y=\sum_i\alpha_id_iK(x_i,x)+b
即可。

相關文章