賈浩楠 發自 凹非寺
量子位 報道 | 公眾號 QbitAI
SVM?
老分類演算法了,輕鬆拿下。
然而,每一次老闆讓你講解SVM,或每一次面試被問到SVM,卻總是結結巴巴漏洞百出。
「這些人怎麼總能精準發現我的盲點?」
簡直讓人懷疑自己掌握的是假SVM。
如果你有這樣的問題,那這篇
SVM數學原理
對你會有很大幫助,一起來看看吧。
SVM 由線性分類開始
理解SVM,咱們必須先弄清楚一個概念:
線性分類器
。
給定一些資料點,它們分別屬於兩個不同的類,現在要找到一個線性分類器把這些資料分成兩類。
如果用x表示資料點,用y表示類別(y可以取1或者-1,分別代表兩個不同的類),一個線性分類器的目標是要
在n維的資料空間中找到一個超平面
(hyper plane),將x的資料點分成兩類,且超平面距離兩邊的資料的間隔最大。
這個超平面的方程可以表示為( wT中的T代表轉置):
△
2維座標系中,超平面是一條直線
當f(x)等於0的時候,x便是位於超平面上的點,而f(x)大於0的點對應 y=1 的資料點,f(x)小於0的點對應y=-1的點。
SVM 想要的就是找到各類樣本點到超平面的距離最遠,也就是找到最大間隔超平面。任意超平面可以用下面這個線性方程來描述:
二維空間點(x,y)到直線Ax+By+C=0的距離公式是:
擴充套件到n維空間後,點x=(x1,x2……xn)到直線wTx+b=0的距離為:
其中 :
根據支援向量的定義,支援向量到超平面的距離為d,其他點到超平面的距離大於d。
於是有:
||w||d
是正數,令它為 1(之所以令它等於 1,是為了方便推導和最佳化,且這樣做對目標函式的最佳化沒有影響),於是:
將兩個方程合併,有:
至此,就得到了最大間隔超平面的上下兩個超平面。
每個支援向量到超平面的距離可以寫為:
由
y(wTx+b)>1>0
可以得到
y(wTx+b)=|wTx+b|
,所以可以將支援向量到超平面距離改寫為:
最大化這個距離:
這裡乘上 2 倍是為了後面推導方便,對目標函式沒有影響。
帶入一個支援向量,可以得到:
所以得到的最最佳化問題是:
處理異常值
有時,對於某些點(x(i),y(i)),分類器可能會做出錯誤操作。
儘管在開發實際使用的SVM模型時,會設計冗餘,避免過擬合,但仍然需要想辦法將誤差控制在一個較小的範圍。
可以透過在模型中增加
懲罰機制
(用c表示)解決這個問題。
設SVM輸出結果為E,則上圖中出現的E=0則沒有懲罰。
若果c非常大,則模型分類更加精準,但支援向量到超平面距離小,容易出現過擬合。
若c=1,則支援向量到超平面距離最大化,儘管會出現一些分類誤差,但這是一種較好的方案。
約束凸最佳化問題
為了克服
約束凸最佳化問題
,採用PEGASOS演算法。
重新構造一個約束獨立性方程:
上式表示,如果點遠離直線,則誤差將為零,否則誤差將為(1-t(i))。
我們需要最小化的是:
由於消除了約束,因此可以採用梯度下降來最大程度地減少損失。
梯度下降演算法計算損失:
在SVM上應用梯度下降:
非線性分類
使用SVM對非線性資料進行分類,需要將資料投影到更高的維度,即透過
增加低維資料的特徵向量將其轉換為高維資料
。
增加資料特徵向量需要消耗巨大的計算資源,這裡採用核函式。
而這種思路最難的點,是為你自己的模型選擇一個合適的核函式。
這裡推薦一種自動調參方法
GridSearch
。
將多種核函式(線性、RBF、多項式、sigmoid等)等標號,依次呼叫,找到一個最合適自己模型的。
定義一個變數params:
params = [{‘kernel’:[‘linear’, ‘rbf’, ‘poly’, ‘sigmoid’], ‘c’:[0。1, 0。2, 0。5, 1。0, 2。0, 5。0]}
呼叫:
以上詳細介紹了SVM背後的數學原理,並提供了一些使用SVM模型時的問題解決辦法。
其中,使用程式碼自動選擇核函式的方法來自外國博主
Daksh Trehan
。
如果你對SVM的原理有更深刻的理解,或有其他實用的技巧,請留言分享給大家吧。
參考連結
https://medium。com/@dakshtrehan?source=post_page——-d46e94b23b9d————————————