支援向量機(support vector machine,簡稱為SVM)是一種簡單的分類模型,如果我們看維基百科的描述肯定會一頭霧水:
支援向量機(英語:support vector machine,常簡稱為SVM,又名支援向量網路)是在分類與迴歸分析中分析資料的監督式學習模型與相關的學習演算法。給定一組訓練實例,每個訓練實例被標記為屬於兩個類別中的一個或另一個,SVM訓練演算法建立一個將新的實例分配給兩個類別之一的模型,使其成為非概率二元線性分類器。SVM模型是將實例表示為空間中的點,這樣對映就使得單獨類別的實例被儘可能寬的明顯的間隔分開。然後,將新的實例對映到同一空間,並基於它們落在間隔的哪一側來預測所屬類別。
其實它的模型就是在特徵空間中間隔最大的線性分類器,而SVM的學習目標便是讓間隔最大化。
我們一樣拿維基百科的圖來舉例:
我們現在有 H1, H2, H3 三條直線,如果三條直線分別代表3個分類器的話,那麼很明顯地:H3 表現的最好。因為 H1 不能把類別分開;H2 可以,但只有很小的間隔;而 H3 能以最大間隔將它們分開。
對於 SVM 來說,資料點被視為 p 維向量,而我們想知道是否可以用 p-1 維超平面來分開這些點。這就是所謂的線性分類器。
所以維基百科上的這張圖就是一個 將2維的資料以 1維的直線分開的例子。而以此類推:
SVM 便可以用這種方式,將三維的資料以2維的超平面分開了。
其實分類的線未必會是直線,也有可能會是曲線,而不同的演算法都是在不同的假設或條件下去找那條分類的線。
而 SVM 則是去假設有一個超平面 可以完美分割兩組資料,所以 SVM 就是在找參數(w和b) 讓兩組之間的距離最大化。
詳細的數學式這裡不會做太多介紹。總之,你只需要知道 SVM 會希望區隔兩類的邊界(虛線)距離越大越好!而這其實就是一個簡單的最佳化問題。剩下的就交給公式了(X
先前提到,當我們遇到在低維度線性不可分的問題時,可以透過將樣本映射到高維度的方式,找到一個最適的超平面。而這時候就有很多種不同的kernel Function可以完成這件事,我們列舉幾個常用的:
優點:
缺點:
一樣透過iris資料集進行簡單的分類實作:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
iris = load_iris()
# X是花萼與花瓣的長度、寬度的原始資料
# Y是將花分類之後的正確答案
X = iris.data
Y = iris.target
# 拆分成訓練集與測試集
x_train, x_test, y_train, y_test = train_test_split(X ,Y ,test_size =0.2, random_state=0)
# 核函式,預設是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
clf = SVC(kernel='linear')
clf.fit(x_train,y_train)
print(clf.predict(x_test)) # 印出測試的預測結果
print(y_test) # 印出測試答案
print(clf.score(x_test,y_test)) # 印出預測準度
https://zhuanlan.zhihu.com/p/49331510
https://pyecontech.com/2020/03/24/svm/