上一節我學習了完整的SVM過程,下面繼續對核函數進行詳細學習,具體的參考連接都在上一篇文章中,SVM四篇筆記連接爲:html
我在上一節有完整的學習了SVM算法,爲了避免讓本身這麼快就忘了,這裏先學習一個實例,回顧一下,並引出核函數的概念。算法
數據是這樣的:有三個點,其中正例 x1(3, 3),x2(4,3),負例 x3(1,1)數組
求解:網絡
約束條件爲:dom
這個約束條件是經過這個獲得的(爲何這裏強調一下呢,由於咱們這個例子自己說的就是SVM的求解過程):機器學習
咱們能夠知道 y1 = +1, y2 = +1 , y3 = -1,同時,代入 α ,則獲得:函數
α1 + α2 - α3=0工具
下面經過SVM求解實例。post
咱們將數據代入原式中:性能
因爲 α1 + α2 = α3 化簡可得:
而後分別對 α1 和 α2 求偏導,偏導等於 0 可得: α1 = 1.5 α2 = -1 ,可是咱們發現這兩個解並不知足約束條件 αi >= 0,i=1,2,3,因此解應該在邊界上(正常狀況下,咱們須要對上式求偏導,進而算出 w,b)。
首先令 α1 = 0,得出 α2 = -2/13 ,α3 = -2/13 (不知足約束)
再令 α2 = 0,得出 α1 = 0.25 ,α3 = 0.25 (知足約束)
因此最小值在(0.25, 0,0.25)處取得。
咱們將 α 的結果代入求解:
因此咱們代入 w b ,求得最終的平面方程爲:
熱身完畢,下面學習核函數,爲了方便理解咱們下面要說的核函數,我在知乎找了一個簡單易懂的故事,讓咱們瞭解支持向量機,更是明白支持向量機的核函數是個什麼鬼,下面看故事。
下面故事來源於此(這是源做者連接):點擊我便可
在好久之前的情人節,有一個大俠要去救他的愛人,可是魔鬼和他玩了一個遊戲。
魔鬼在桌面上彷佛有規律放了兩種顏色的球,說:「你用一根棍分開他們?要求:儘可能在放更多球以後,仍然使用」
因而大俠這樣作,幹得不錯吧:
而後魔鬼又在桌上放了更多的球,彷佛有一個球站錯了陣營。
SVM就是試圖把棍放在最佳位置,好讓在棍的兩邊有儘量大的間隙。
如今即便魔鬼放了更多的球,棍仍然是一個好的分界線。
而後,在SVM工具箱中有另外一個更加劇要的trick 。魔鬼看到大俠已經學會了一個trick,因而魔鬼給了大俠一個新的挑戰。
如今,大俠沒有棍能夠很好地幫他分開這兩種球了,如今怎麼辦,固然像全部武俠片中同樣大俠桌子一拍,球飛到空中。而後憑藉着大俠的輕功,大俠抓起一張紙,插到了兩種球的中間。
如今,從魔鬼的角度看這些球,這些球好像是被一條曲線分開了。
在以後,無聊的大人們,把這些球叫作 「data」,把棍子 叫作 「classifier」, 最大間隙trick 叫作「optimization」, 拍桌子叫作「kernelling」, 那張紙叫作「hyperplane」。
因此說,Support Vector Machine,一個普通的SVM就是一條直線罷了,用來完美劃分linearly separable的兩類。可是這又不是一條普通的直線,這是無數條能夠分類的直線當中最完美的,由於它剛好在兩個類的中間,距離兩個類的點都同樣遠。而所謂的Support vector就是這些離分界線最近的點,若是去掉這些點,直線多半是要改變位置的。若是是高維的點,SVM的分界線就是平面或者超平面。其實沒有差,都是一刀切兩塊,咱們這裏統一叫作直線。
再理解一下,當一個分類問題,數據是線性可分的,也就是用一根棍就能夠將兩種小球分開的時候,咱們只要將棍的位置放在讓小球距離棍的距離最大化的位置便可。尋找這個最大間隔的過程,就叫作最優化。可是,顯示每每是殘酷的,通常的數據是線性不可分的。也就是找不到一個棍將兩種小球很好的分類,這時候咱們就須要像大俠同樣,將小球排起,用一張紙代替小棍將兩種小球進行分類,想讓數據飛起,咱們須要的東西就是核函數(kernel),用於切分小球的紙,就是超平面。
上面故事說明了SVM能夠處理線性可分的狀況,也能夠處理非線性可分的狀況。而處理非線性可分的狀況是選擇了核函數(kernel),經過將數據映射到高位空間,來解決在原始空間中線性不可分的問題。
咱們但願樣本在特徵空間中線性可分,所以特徵空間的好壞對支持向量機的性能相當重要,可是在不知道特徵映射的狀況下,咱們是不知道什麼樣的核函數是適合的,而核函數也只是隱式的定義了特徵空間,因此,核函數的選擇對於一個支持向量機而言就顯得相當重要,若選擇了一個不合適的核函數,則數據將映射到不合適的樣本空間,從而支持向量機的性能將大大折扣。
因此構造出一個具備良好性能的SVM,核函數的選擇是關鍵。而核函數的選擇包含兩部分工做:一是核函數類型的選擇,二是肯定核函數類型後相關參數的選擇。
咱們知道,核函數的精妙之處在於不用真的對特徵向量作核映射,而是直接對特徵向量的內積進行變換,而這種變換卻等價於先對特徵向量作核映射而後作內積。
SVM主要是在用對偶理論求解一個二次凸優化問題,其中對偶問題以下:
求得最終結果:
固然這是線性可分的狀況,那麼若是問題自己是線性不可分的狀況呢?那就是先擴維後再計算。具體來講,在線性不可分的狀況下,支持向量機首先在低維空間中完成計算,而後經過核函數將輸入空間映射到高維特徵空間,最終在高維特徵空間中構造出最優分離超平面,從而把平面上自己很差分的非線性數據分開。以下圖所示,一堆數據在二維空間中沒法劃分,從而映射到三維空間中劃分:
而在咱們遇到核函數以前,若是用原始的方法,那麼在用線性學習器學習一個非線性關係,須要選擇一個非線性特徵集,而且將數據寫成新的表達形式,這等價於應用一個固定的非線性映射,將數據映射到特徵空間,在特徵空間中使用線性學習器。所以,考慮的假設集是這種類型的函數:
這裏 Φ :X -> F 是從輸入空間到某個特徵空間的映射,這意味着創建非線性學習器分爲兩步:
而因爲對偶形式就是線性學習器的一個重要性質,這意味着假設能夠表達爲訓練點的線性組合,所以決策規則能夠用測試點和訓練點的內積來表示:
爲向量加上核映射後,要求解的最優化問題變爲:
根據核函數知足的等式條件,它等價於下面的問題:
其線性不可分狀況的對偶形式以下:
其中 Φ(xi) 表示原來的樣本擴維後的座標。
最後獲得的分類判別函數爲:
和不用核映射相比,只是求解的目標函數,最後的斷定函數對特徵向量的內積作了核函數變換。若是K是一個非線性函數,上面的決策函數則是非線性函數,此時SVM是非線性模型。當訓練樣本不少,支持向量的個數很大的時候,預測時的速度是一個問題,所以不少時候咱們會使用線性支持向量機。
下面先從一個小例子來闡述問題。假設咱們有兩個數據, x = (x1, x2, x3) y = (y1, y2, y3)。此時在3D空間已經不能對其進行線性劃分了,那麼咱們經過一個函數將數據映射到更高維的空間,好比9維的話,那麼 f(x) = (x1x1, x1x2, x1x3, x2x1, x2x2, x2x3, x3x1, x3x2, x3x3),因爲須要計算內積,因此在新的數據在 9 維空間,須要計算 <f(x), f(y)> 的內積,須要花費 O(n^2)。
再具體點,令 x = (1, 2, 3), y = (4, 5, 6),那麼 f(x) = (1, 2, 3, 2, 4, 6, 3, 6, 9),f(y) = (16, 20, 24, 20, 25, 36, 24, 30, 36)
此時: <f(x), f(y)> = 16 + 40 + 72 +40 +100 + 180 + 72 +180 +324 = 1024
對於3D空間這兩個數據,彷佛還能計算,可是若是將維數擴大到一個很是大數的時候,計算起來可就不是這麼一點點問題了。
然而,咱們發現 K(x, y) = (<x, y>)^2 ,代入上式: K(x, y) = (4 + 10 + 18)^2 = 32^2 = 1024
也就是說 : K(x, y) = (<x, y>)^2 = <f(x), f(y)> 。
可是 K(x, y) 計算起來卻比 <f(x), f(y)> 簡單的多,也就是說只要用 K(x, y)來計算,效果與 <f(x), f(y)> 是同樣的,可是計算效率卻大幅度提升了,如 K(x, y) 是 O(n),而 <f(x), f(y)> 是 O(n^2),因此使用核函數的好處就是,能夠在一個低維空間去完成一個高緯度(或者無限維度)樣本內積的計算,好比上面例子中 K(x, y)的3D空間對比 <f(x), f(y)> 的9D空間。
下面再舉個例子來證實一下上面的問題,爲了簡單起見,假設全部樣本點都是二維點,其值分別爲(x, y),分類函數爲:
它對應的映射方式爲:
能夠驗證:任意兩個擴維後的樣本點在3維空間的內積等於原樣本點在二維空間的函數輸出:
有了這個核函數,之後的高維內積均可以轉換爲低維的函數運算了,這裏也就是說只須要計算低維的內積,而後再平方。明顯問題獲得解決且複雜度下降極大。總而言之:核函數它本質上隱含了從低維到高維的映射,從而避免直接計算高維的內積。
固然上述例子是多項式核函數的一個特例,其實核函數的種類還有不少,後文會一一介紹。
經過上面的例子,咱們大概能夠知道核函數的巧妙應用了,下面學習一下核函數的計算原理。
若是有一種方法能夠在特徵空間中直接計算內積 <Φ(xi , Φ(x)> ,就像在原始輸入點的函數中同樣,就有可能將兩個步驟融合到一塊兒創建一個非線性的學習器,這樣直接計算的方法稱爲核函數方法。
設 x 是輸入空間(歐式空間或者離散集合),H爲特徵空間(希爾伯特空間),若是存在一個從 x 到 H 的映射:
核是一個函數 K,對於全部 x, z ∈ χ, 則知足:
則稱Κ(x,z)爲核函數,φ(x)爲映射函數,φ(x)∙φ(z)爲x,z映射到特徵空間上的內積。
參考網友的理解:任意兩個樣本點在擴維後的空間的內積,若是等於這兩個樣本點在原來空間通過一個函數後的輸出,那麼這個函數就叫核函數。
因爲映射函數十分複雜難以計算,在實際中,一般都是使用核函數來求解內積,計算複雜度並無增長,映射函數僅僅做爲一種邏輯映射,表徵着輸入空間到特徵空間的映射關係。至於爲何須要映射後的特徵而不是最初的特徵來參與計算,爲了更好地擬合是其中一個緣由,另外的一個重要緣由是樣例可能存在線性不可分的狀況,而將特徵映射到高維空間後,每每就可分了。
下面將核函數形式化定義。若是原始特徵內積是 <X , Z>,映射 <Φ(xi • Φ(x)>,那麼定義核函數(Kernel)爲:
到這裏,咱們能夠得出結論,若是要實現該節開頭的效果,只須要計算 Φ(x) ,而後計算 Φ(x)TΦ(x)便可,然而這種計算方式是很是低效的。好比最初的特徵是n維的,咱們將其映射到 n2 維,而後再計算,這樣須要O(n2 ) 的時間,那麼咱們能不能想辦法減小計算時間呢?
先說結論,固然是能夠的,畢竟咱們上面例子,活生生的說明了一個將須要 O(n2 ) 的時間 轉換爲 須要O(n ) 的時間。
先看一個例子,假設x和z都是n維度的,
展開後,獲得:
這個時候發現咱們能夠只計算原始特徵 x 和 z 內積的平方(時間複雜度爲O(n)),就等價於計算映射後特徵的內積。也就是說咱們不須要花O(n2 ) 的時間了。
如今看一下映射函數(n = 3),根據上面的公式,獲得:
也就是說核函數 Κ(x,z) = (xTz)2 只能選擇這樣的 φ 做爲映射函數時纔可以等價於映射後特徵的內積。
再看另一個核函數,高斯核函數:
這時,若是 x 和 z 很相近 (||x - z || 約等於 0),那麼核函數值爲1,若是 x 和 z 相差很大(||x - z || >> 0),那麼核函數值約等於0.因爲這個函數相似於高斯分佈,所以稱爲高斯核函數,也叫作徑向基函數(Radial Basis Function 簡稱爲RBF)。它可以把原始特徵映射到無窮維。
下面有張圖說明在低維線性不可分時,映射到高維後就可分了,使用高斯核函數。
注意,使用核函數後,怎麼分類新來的樣本呢?線性的時候咱們使用SVM學習出w和b,新來樣本x的話,咱們使用 wTx + b 來判斷,若是值大於等於1,那麼是正類,小於等因而負類。在二者之間,認爲沒法肯定。若是使用了核函數後,wTx + b 就變成了 wTΦ(x) + b,是否先要找到 Φ(x) ,而後再預測?答案確定不是了,找 Φ(x) 很麻煩,回想咱們以前說過的。
只需將 <(x(i) , x> 替換成 (x(i) , x),而後值的判斷同上。
問題:給定一個函數K,咱們可否使用K來替代計算 Φ(x)TΦ(x),也就說,是否可以找出一個 Φ,使得對於全部的x和z,都有 K(x, z) = Φ(x)TΦ(x),即好比給出了 K(x, z) = (xTz)2,是否可以認爲K是一個有效的核函數。
下面來解決這個問題,給定m個訓練樣本(x(1),x(2), ....,x(m)),每個x(i) 對應一個特徵向量。那麼,咱們能夠將任意兩個 x(i) 和 x(j) 帶入K中,計算獲得Kij = K(x(i), x(j))。i 能夠從1到m,j 能夠從1到m,這樣能夠計算出m*m的核函數矩陣(Kernel Matrix)。爲了方便,咱們將核函數矩陣和 K(x, z) 都使用 K 來表示。若是假設 K 是有效地核函數,那麼根據核函數定義:
可見,矩陣K應該是個對稱陣。讓咱們得出一個更強的結論,首先使用符號ΦK(x)來表示映射函數 Φ(x) 的第 k 維屬性值。那麼對於任意向量 z,得:
最後一步和前面計算 K(x, z) = (xTz)2 時相似。從這個公式咱們能夠看出,若是K是個有效的核函數(即 K(x, z) 和 Φ(x)TΦ(z)等價),那麼,在訓練集上獲得的核函數矩陣K應該是半正定的(K>=0)。這樣咱們獲得一個核函數的必要條件:K是有效的核函數 ==> 核函數矩陣K是對稱半正定的。
Mercer定理代表爲了證實K是有效的核函數,那麼咱們不用去尋找 Φ ,而只須要在訓練集上求出各個 Kij,而後判斷矩陣K是不是半正定(使用左上角主子式大於等於零等方法)便可。
來看個核函數的例子。以下圖所示的兩類數據,分別分佈爲兩個圓圈的形狀,這樣的數據自己就是線性不可分的,此時咱們該如何把這兩類數據分開呢?
事實上,上圖所示的這個數據集,是用兩個半徑不一樣的圓圈加上了少許的噪音生成獲得的,因此,一個理想的分界應該是「圓圈」 而不是「一條線」(超平面)。若是用 X1 和 X2 來表示這個二維平面的兩個座標的話,咱們知道一條二次曲線(圓圈是二次曲線的一種特殊狀況)的方程能夠寫做這樣的形式:
注意上面的形式,若是咱們構造另一個五維的空間,其中五個座標的值分別爲:
那麼顯然,上面的方程在新的座標系下能夠寫作:
關於新的座標 Z,這正是一個 hyper plane 的方程!也就是說,若是咱們作一個映射:
將X按照上面的規則映射爲 Z,那麼在新的空間中原來的數據將變成線性可分的,從而使用以前咱們推導的線性分類算法就能夠進行處理了。這正是Kernel方法處理非線性問題的基本思想。
再進一步描述 Kernel 的細節以前,不妨再來看看上述例子在映射事後的直觀形態。固然,咱們沒法將五維空間畫出來,不過因爲我這裏生成數據的時候用了特殊的情形,因此這裏的超平面實際的方程是這個樣子的(圓心在X2軸上的一 個正圓):
所以我只須要把它映射到下面這樣一個三維空間中便可:
下圖便是映射以後的結果,將座標軸通過適當的旋轉,就能夠很明顯的看出,數據是能夠經過一個平面來分開的
核函數至關於把原來的分類函數:
映射成:
而其中的 α 能夠經過求解以下 dual 問題而獲得的:
這樣一來問題就解決了嗎?彷佛是的:拿到非線性數據,就找一個映射(Φ(•),而後一股腦把原來的數據映射到新空間中,再作線性SVM便可。不過事實上問題好像沒有這麼簡單)。
細想一下,剛纔的方法是否是有問題:
在最初的例子裏,咱們對一個二維空間作映射,選擇的新空間是原始空間的全部一階和二階的組合,獲得了五個維度;
若是原始空間是三維(一階,二階和三階的組合),那麼咱們會獲得:3(一次)+3(二次交叉)+3(平方)+3(立方)+1(x1 * x2 * x3) + 2*3(交叉,一個一次一個二次,相似 x1*x2^2)=19 維的新空間,這個數目是呈指數級爆炸性增加的,從而勢必這給 Φ(•) 的計算帶來很是大的困難,並且若是遇到無窮維的狀況,就根本無從計算了。
這個時候,可能就須要Kernel出馬了。
不妨仍是從最開始的簡單例子觸發,設兩個向量爲:
而 Φ(•) 便是前面說的五維空間的映射,所以映射事後的內積爲:
(公式說明:上面的這兩個推導過程當中,所說的前面的五維空間的映射,這裏說的即是前面的映射方式,回顧下以前的映射規則,再看看那個長的推導式,其實就是計算x1,x2各自的內積,而後相乘相加便可,第二個推導則是直接平方,去掉括號,也很容易推出來)
另外,咱們又注意到:
兩者有不少類似的地方,實際上,咱們只要把某幾個維度線性縮放一下,而後再加上一個常數維度,具體來講,上面這個式子的計算結果實際上和映射
以後的內積 <Φ(xi • Φ(x)> 的結果是相等的,那麼區別在什麼地方呢?
(公式說明:上面之中,最後的兩個式子,第一個算式,是帶內積的徹底平方式,能夠拆開,而後,再經過湊一個獲得,第二個算式,也是根據第一個算式湊出來的)
回想剛纔提到的映射的維度爆炸,在前一種方法已經沒法計算的狀況下,後一種方法卻依舊能從容處理,甚至是無窮維度的狀況也沒有問題。
咱們把這裏的計算兩個向量在隱式映射事後的空間中的內積的函數叫作核函數(kernel Function),例如,在剛纔的例子中,咱們的核函數爲:
核函數能簡化映射空間中的內積運算——恰好「碰巧」的是,在咱們的SVM裏須要計算的地方數據向量老是之內積的形式出現的。對比剛纔咱們上面寫出來的式子,如今咱們的分類函數爲:
其中 α 由以下 dual 問題計算而得:
這樣一來計算的問題就算解決了,避免了直接在高維空間中進行計算,而結果倒是等價的!固然,由於咱們這裏的例子很是簡單,因此能夠手工構造出對應於 Φ(•) 的核函數出來,若是對於任意一個映射,想要構造出對應的核函數就很是困難了。
下面概況一下核函數的意思:
下面引用這個例子距離下核函數解決非線性問題的直觀效果。
假設如今你是一個農場主,圈養了一批羊羣,但爲了預防狼羣襲擊羊羣,你須要搭建一個籬笆來把羊羣圈起來。可是籬笆應該建在哪裏呢?你極可能須要依據羊羣和狼羣的位置搭建一個「分類器」,好比下圖這幾種不一樣的分類器,咱們能夠看到SVM完成了一個很完美的解決方案。
這個例子側面簡單說明了SVM使用非線性分類器的優點,而邏輯模式以及決策樹模式都是使用了直線方法。
核函數有嚴格的數學要求,因此設計一個核函數是很是困難的,科學家們通過不少不少嘗試也就只嘗試出來幾個核函數,因此咱們就不要在這方面下無用功了,直接拿這常見的幾個核函數使用就OK。
下面來分別學習一下這幾個常見的核函數。
基本原理:實際上就是原始空間中的內積
這個核存在的主要目的是使得「映射後空間中的問題」 和 「映射前空間中的問題」 二者在形式上統一塊兒來了(意思是說:咱們有的時候,寫代碼或者寫公式的時候,只要寫個模板或者通用表達式,而後再代入不一樣的核,即可以了。於此,便在形式上統一了起來,不用再找一個線性的和一個非線性的)
線性核,主要用於線性可分的狀況,咱們能夠看到特徵空間到輸入空間的維度是同樣的。在原始空間中尋找最優線性分類器,具備參數少速度快的優點。對於線性可分數據,其分類效果很理想。所以咱們一般首先嚐試用線性核函數來作分類,看看效果如何,若是不行再換別的。
優勢:
限制:
基本原理:依靠升維使得本來線性不可分的數據線性可分。
多項式核函數能夠實現將低維的輸入空間映射到高維的特徵空間。多項式核適合於正交歸一化(向量正交且模爲1)數據,屬於全局核函數,容許相距很遠的數據點對核函數的值有影響。參數d越大,映射的維度越高,計算量就會越大。
優勢:
缺點:
徑向基核函數是SVM中經常使用的一個核函數。徑向基函數是一個採用向量做爲自變量的函數,可以基於向量距離運算輸出一個標量。
也能夠寫成以下格式:
徑向基函數是指取值僅僅依賴於特定點距離的實值函數,也就是:
任意一個知足上式特性的函數 Φ 都叫徑向量函數,標準的通常使用歐氏距離,儘管其餘距離函數也是能夠的。因此另外兩個比較經常使用的核函數,冪指數核,拉普拉斯核也屬於徑向基核函數。此外不太經常使用的徑向基核還有ANOVA核,二次有理核,多元二次核,逆多元二次核。
高斯徑向基函數是一種局部性強的核函數,其能夠將一個樣本映射到一個更高維的空間內,該核函數是應用最廣的一個,不管大樣本仍是小樣本都有比較好的性能,並且其相對於多項式核函數參數要少,所以大多數狀況下在不知道用什麼樣的核函數的時候優先使用高斯核函數。
徑向基核函數屬於局部核函數,當數據點距離中心點變遠時,取值會變小。高斯徑向基覈對數據中存在的噪聲有着較好的抗干擾能力,因爲其很強的局部性,其參數決定了函數做用範圍,隨着參數 σ 的增大而減弱。
優勢:
缺點:
上述所講的徑向核函數表達式:
冪指數核(Exponential Kernel)
拉普拉斯核(LaplacIan Kernel)
ANOVA 核(ANOVA Kernel)
二次有理核(Rational Quadratic Kernel)
多元二次核(Multiquadric Kernel)
逆多元二次核(Inverse Multiquadric Kernel)
Sigmoid核函數來源於神經網絡,被普遍用於深度學習和機器學習中
採用Sigmoid函數做爲核函數時,支持向量機實現的就是一種多層感知器神經網絡,應用SVM方法,隱含層節點數目(它肯定神經網絡的結構),隱含層節點對輸入節點的權重都是在設計(訓練)的過程當中自動肯定的。並且支持向量機的理論基礎決定了它最終求得的是全局最優值而不是局部最優值,也保證了它對未知樣本的良好泛化能力而不會出現過學習線性。
利用專家的先驗知識預先選定核函數
採起Cross-Validation方法,即在進行核函數選取時,分別試用不一樣的核函數,概括偏差最小的核函數就是最好的核函數。如針對傅里葉核,RBF核,結合信號處理問題中的函數迴歸問題,經過仿真實驗,對比分析了在相同數據條件下,採用傅里葉核的SVM要比採用RBF核的SVM偏差小不少。
採用由Smits等人提出的混合核函數方法,該方法較以前二者是目前選取核函數的主流方法,也是關於如何構建核函數的又一開創性的工做,將不一樣的核函數結合起來後有更好的特性,這是混合核函數方法的基本思想。
當樣本特徵不少時,特徵的維度很高,這是每每樣本線性可分,可考慮用線性核函數的SVM或者LR(如何不考慮核函數,LR和SVM都是線性分類算法,也就是說他們的分類決策面都是線性的)
當樣本的數量不少,但特徵較少時,能夠手動添加一些特徵,使樣本線性可分,再考慮用線性核函數的SVM或者LR
當樣本特徵維度不高時,樣本數量也很少時,考慮使用高斯核函數(RBF核函數的一種,指數核函數和拉普拉斯核函數也屬於RBF核函數)
若是特徵的數量大道和樣本數量差很少,則選用LR或者線性核的SVM
若是特徵的數量小,樣本的數量正常,則選用SVM+ 高斯核函數
若是特徵的數量小,而樣本的數量很大,則須要手工添加一些特徵從而變成第一種狀況
這裏簡單說一下核函數與其餘參數的做用(後面會詳細學習關於使用Sklearn學習SVM):
咱們來看一個簡單的例子,數據爲[-5.0 , 9.0] 的隨機數組,函數以下 :
下面分別使用三種核SVR:兩種乘法系數高斯核rbf和一種多項式核poly。代碼以下:
from sklearn import svm import numpy as np from matplotlib import pyplot as plt import warnings warnings.filterwarnings('ignore') X = np.arange(-5.0 , 9.0 , 0.1) # print(X) X = np.random.permutation(X) # print('1X:',X) X_ = [[i] for i in X] b = 0.5 y = 0.5 * X ** 2.0 + 3.0 * X + b + np.random.random(X.shape) * 10.0 y_ = [i for i in y] # degree = 2 , gamma=, coef0 = rbf1 = svm.SVR(kernel='rbf',C=1,) rbf2 = svm.SVR(kernel='rbf',C=20,) poly = svm.SVR(kernel='poly',C=1,degree=2) rbf1.fit(X_ , y_) rbf2.fit(X_ , y_) poly.fit(X_ , y_) result1 = rbf1.predict(X_) result2 = rbf2.predict(X_) result3 = poly.predict(X_) plt.plot(X,y,'bo',fillstyle='none') plt.plot(X,result1,'r.') plt.plot(X,result2,'g.') plt.plot(X,result3,'b.') plt.show()
結構圖以下:
藍色是poly,紅色是c=1的rbf,綠色c=20的rbf。其中效果最好的是C=20的rbf。若是咱們知道函數的表達式,線性規劃的效果更好,可是大部分狀況下咱們不知道數據的函數表達式,所以只能慢慢實驗,SVM的做用就在這裏了。
支持向量機是一種分類器。之因此稱爲「機」是由於它會產生一個二值決策結果,即它是一種決策「機」。支持向量機的泛化錯誤率較低,也就是說它具備良好的學習能力,且學到的結果具備很好的推廣性。這些優勢使得支持向量機十分流行,有些人認爲它是監督學習中最好的定式算法。
支持向量機視圖經過求解一個二次優化問題來最大化分類間隔。在過去,訓練支持向量機常採用很是複雜而且低效的二次規劃求解方法。John Platt 引入了SMO算法,此算法能夠經過每次只優化2個 α 值來加快SVM的訓練速度。
核方法或者說核技巧會將數據(有時候是非線性數據)從一個低維空間映射到一個高維空間,能夠將一個在低維空間中的非線性問題轉化爲高維空間下的線性問題來求解。核方法不止在SVM中適用,還能夠用於其餘算法。而其中的徑向基函數是一個經常使用的度量兩個向量距離的核函數。