核函數的起源是對於線性不可分的分類情況,其實可以通過p次方多項式,及非線性模型進行分類;然后對於這類非線性多次方的,其實可以按照廣義線性模型來進行升維變形,使之成為線性模型,這樣就可以放到SVM中來進行處理了(svm只能處理非線性模型)。
但是升維之后是有維度爆炸現象的(二次方對應6維度,三次方對應19維度),為了解決這個問題,核函數出場了,簡單講核函數就是計算計算是在低維進行,但是形式卻是映射到高維。
SVM的優化目標:
假設xi和xj都是低維非線性的函數,我們定義映射到高維的函數為φ(x),那么上面的式子可以寫成:
核函數,就是實現了計算在低維計算,返回形式是高維:
K(x, z) = φ(x) * φ(z)
但是這種映射並不是容易獲取的,需要滿足Gram矩陣K = [K(x,z)]是半正定型,也就是說,一個函數想要成為核函數,必須要滿足里面任何點的集合形成的Gram矩陣是半正定矩陣。
這里解釋一下,gram矩陣是指n維歐式空間中任意k個向量內積組成的矩陣:
關於正定矩陣:M是n階方陣,對於非0向量,z.T *M*z > 0,矩陣的乘法還是矩陣,這里> 0,我理解是因為乘法形式的行列式的值是大於0的。
半正定矩陣和正定矩陣就是一字之差:z.T * M * z >= 0,半正定允許等於0,所以范圍更加寬廣,所以血統不那么純正,所以稱之為半正定(越純正要求越嚴格)。
話題再扯回來,如果想要滿足核函數,那么函數K的矩陣要滿足Gram矩陣是半正定的;這個門檻其實很高的,好在我們數學大佬們已經帶我們走出探索的沼澤,並且親自指出了常用的核函數與:
線性核函數(Linear Kernel):
K(x, z) = x·z,線性svm就是使用這個核函數;
多項式核函數(Polynomial Kernel):
k(x, z) = (γx·z + r)^d,其中gamma,r以及d需要自己調參;
高斯核函數(Gaussian Kernel),也稱之為徑向基和函數(Radial Basis Function,RBF):
K(x, z)=xp(−γ||x−z||²)
Sigmoid核函數:
K(x,z)=tanh(γx∙z+r),其中γ和r需要自己調參;
參考: