演算法學習——支援向量機SVM
SVM現在的公式推導很多,都是現成的,而且寫的也很好,我會提供相關資源,這篇博文主要從思想理解的方面做一個簡單介紹。
1、SVM 是如何工作的?
支援向量機的基礎概念可以通過一個簡單的例子來解釋。讓我們想象兩個類別:紅色和藍色,我們的資料有兩個特徵:x 和 y。我們想要一個分類器,給定一對(x,y)座標,輸出僅限於紅色或藍色。我們將已標記的訓練資料列在下圖中:
支援向量機會接受這些資料點,並輸出一個超平面(在二維的圖中,就是一條線)以將兩類分割開來。這條線就是判定邊界:將紅色和藍色分割開。
但是,最好的超平面是什麼樣的?對於 SVM 來說,它是最大化兩個類別邊距的那種方式,換句話說:超平面(在本例中是一條線)對每個類別最近的元素距離最遠。
這裡有一個通俗易懂的視訊解釋可以告訴你最佳的超平面是如何找到的(有簡單的計算):
2、非線性可分資料
上面的例子很簡單,因為那些資料是線性可分的——我們可以通過畫一條直線來簡單地分割紅色和藍色。然而,大多數情況下事情沒有那麼簡單。看看下面的例子:
很明顯,你無法找出一個線性決策邊界(一條直線分開兩個類別)。然而,兩種向量的位置分得很開,看起來應該可以輕易地分開它們。
這個時候我們需要引入第三個維度。迄今為止,我們有兩個維度:x 和 y。讓我們加入維度 z,並且讓它以直觀的方式出現:z = x² + y²(沒錯,圓形的方程式)
於是我們就有了一個三維空間,看看這個空間,他就像這樣:
支援向量機將會如何區分它?很簡單:
請注意,現在我們處於三維空間,超平面是 z 某個刻度上(比如 z=1)一個平行於 x 軸的平面。它在二維上的投影是這樣:
於是,我們的決策邊界就成了半徑為 1 的圓形,通過 SVM 我們將其成功分成了兩個類別。
下面的視訊用 3D 形式展現了一個類似的分類效果(很容易看明白):
3、核函式技巧
在以上例子中,我們找到了一種通過將空間巧妙地對映到更高維度來分類非線性資料的方法。然而事實證明,這種轉換可能會帶來很大的計算成本:可能會出現很多新的維度,每一個都可能帶來複雜的計算。為資料集中的所有向量做這種操作會帶來大量的工作,所以尋找一個更簡單的方法非常重要。
還好,我們已經找到了訣竅:SVM 其實並不需要真正的向量,它可以用它們的數量積(點積)來進行分類。這意味著我們可以避免耗費計算資源的境地了。我們需要這樣做:
-
想象一個我們需要的新空間:
-
找到新空間中點積的形式:
-
讓 SVM 處理新的點積結果——這就是核函式
這就是核函式的技巧,它可以減少大量的計算資源需求。通常,核心是線性的,所以我們得到了一個線性分類器。但如果使用非線性核心(如上例),我們可以在完全不改變資料的情況下得到一個非線性分類器:我們只需改變點積為我們想要的空間,SVM 就會對它忠實地進行分類。
注意,核函式技巧實際上並不是 SVM 的一部分。它可以與其他線性分類器共同使用,如邏輯迴歸等。支援向量機只負責找到決策邊界。
4、選擇核函式
現在我們有了特徵向量,唯一要做的事就是選擇模型適用的核函數了。每個任務都是不同的,核函式的選擇有關於資料本身。在我們的例子中,資料呈同心圓排列,所以我們需要選擇一個與之匹配的核函式。
一些現實世界中 SVM 在其他領域裡的應用或許會用到數十,甚至數百個特徵值。同時自然語言處理分類用到了數千個特徵值,在最壞的情況下,每個詞都只在訓練集中出現過一次。這會讓問題稍有改變:非線性核函式或許在其他情況下很好用,但特徵值過多的情況下可能會造成非線性核心資料過擬合。因此,最好堅持使用舊的線性核函式,這樣才能在那些例子中獲得很好的結果。
以上就是支援向量機的基礎。總結來說就是:
-
支援向量機能讓你分類線性可分的資料;
-
如果線性不可分,你可以使用 kernel 技巧;
-
然而,對文字分類而言最好只用線性 kernel。
相比於神經網路這樣更先進的演算法,支援向量機有兩大主要優勢:更高的速度、用更少的樣本(千以內)取得更好的表現。這使得該演算法非常適合文字分類問題。
下邊是一些很好的理論講解與公式推導文章,大家可以細細品味
這是劉建平老師的:
這個是july大神的部落格,寫的很全也很體系:支援向量機的通俗導論
提供一個B站視訊講解版的手推SVM:機器學習-白板推導系列-支援向量機SVM