整個過程看懂了,理解了,決定寫這一篇部落格來記錄下。
第一,何為svm
支援向量機,網上有許多部落格都寫的非常完善,我的理解就是svm就是乙個二類分類器。其基本模型定義為特徵空間上的間隔最大的線性分類器,其學習策略是間隔最大化,最終可以轉化為乙個凸二次規劃問題。我個人理解就是將兩個不同類的點,劃分開,找到最佳的分類邊界,即最大間隔。
1.1邏輯回歸
要想理解svm,則必須弄明白什麼是邏輯回歸。
根據線性回歸相關概念,假如有一些資料點,它們屬於兩個不同的類,現在要找到乙個線性分類器來將他們分類。用x表示資料點,用y表示類別(常用1,-1),則在n維資料空間,可以找到以下乙個超平面將資料點分隔開:
其中假設函式:
x是n維特徵向量,函式g()就是邏輯函式。而邏輯函式的影象為:
由此可以發現將資料範圍對映到了(0,1)之間。
而假設函式就是特徵屬於y=1的概率。
也就意味著當我們要判斷乙個新的資料點屬於哪一類時,只需要計算假設函式的值,而假設函式只與(θ.t * x)有關,且如果(θ.t * x)>0則假設函式大於0.5。而我們要生成的模型希望對所有y=1的資料點(θ.t * x)>>0,y=0的資料點(θ.t * x)(θ.t * x)<<0。邏輯回歸的目的就是學習得到滿足上述條件的θ。
1.2線性分類的例子
下面舉個簡單的例子。如下圖所示,現在有乙個二維平面,平面上有兩種不同的資料,分別用圈和叉表示。由於這些資料是線性可分的,所以可以用一條直線將這兩類資料分開,這條直線就相當於乙個超平面,超平面一邊的資料點所對應的y全是-1 ,另一邊所對應的y全是1。
這個超平面可以用分類函式f(x)=w.t*x+b表示,當f(x) 等於0的時候,x便是位於超平面上的點,而f(x)大於0的點對應 y=1 的資料點,f(x)小於0的點對應y=-1的點,如下圖所示:
在進行分類的時候,遇到乙個新的資料點x,將x代入f(x) 中,如果f(x)小於0則將x的類別賦為-1,如果f(x)大於0則將x的類別賦為1。
則接下來的問題是如何確定這個超平面。從直觀上而言,這個超平面應該是最適合分開兩類資料的直線。而判定「最適合」的標準就是這條直線離直線兩邊的資料的間隔最大。所以,得尋找有著最大間隔的超平面。
1.3函式間隔與幾何間隔
在整個留學的課程學習過程中,對這兩個定義沒什麼印象。參考大神部落格才知道這兩個定義與概念。函式間隔:
而超平面(w,b)關於t中所有樣本點(xi,yi)的函式間隔最小值即為超平面(w,b)關於訓練集t的函式間隔。
但是如果成比例的改變w和b,函式間隔的值也隨之改變,顯然超平面沒有改變,所以只有函式間隔是不充分不完全的。這時,我們對法向量w加一些約束條件,從而真正定義點到超平面的距離:幾何間隔。
這時想要得到γ的絕對值,令γ乘上對應的類別y,即可得到幾何間隔:
1.4最大間隔分類器
如上圖所示,當對乙個資料點進行分類時,當超平面離資料點的間隔越大,置信度也就越大。所以,為了使分類的置信度盡量高,需要讓選擇的超平面最大化這個間隔,也就是圖里gap。根據以上分析,也就是說要最大化幾何間隔。
於是最大化集合間隔的分類器的目標函式可以定義為:
令γ=1(課程中老師講解如此的原因是方便化簡,對原公式無影響。根據各個部落格,都是這個意思,沒發現具體這樣做的原因),於是可以將目標函式轉化為:
也可以理解為最小化||w||。如下圖所示,中間的實線便是尋找到的最優超平面(optimal hyper plane),其到兩條虛線邊界的距離相等,這個距離便是幾何間隔,兩條虛線間隔邊界之間的距離等於2γ,而虛線間隔邊界上的點則是支援向量。由於這些支援向量剛好在虛線間隔邊界上,所以它們滿足y(w.tx + b) = 1。(處於方便推導和優化的目的,我們可以令γ,而對於所有不是支援向量的點,則顯然有y(w.tx + b)>1。
引用了一些大神的部落格:
SVM支援向量機的理解
support vector machine 為什麼一定要研究線性分類?首先說一下為什麼對資料集一定要說線性可分或線性不可分,難道不可以非線性分開嗎?想要非線性分開當然可以,實際上svm只是把原來線性不可分的資料點對映到乙個新的空間,轉換為在新空間中線性可分資料來進行分類的。如果返回到原來資料的空間...
滑動視窗的支援向量機(SVM)
1 滑動視窗 滑動視窗顧名思義 用乙個一直滑動的視窗 要比影象小 去檢查影象。舉例 在人臉識別中,有detectmultiscale 函式,第乙個引數是影象,第二個便是滑動視窗的滑動比例 列入1.1就代表滑動從左到右滑動了 110個的單位。非最大值抑制 舉例 假如影象中有一張人臉,那麼你想 當這個會...
OpenCV的支援向量機SVM的程式
include include include include include include include using namespace std define width 28 define height 30 int main int argc,char argv else svm data...