支持向量机原理及scikit-learn实现
引言
支持向量機(SVM)是一個功能強大并且全面的機器學習模型,它能夠執行線性或者非線性分類、回歸,甚至異常值檢測任務。它是機器學習最受歡迎的模型之一,任何對機器學習感興趣的人都應該在工具箱中配置一個。SVM特別適用于中小型復雜數據分類。
目錄
引言
線性可分和線性不可分
線性可分數學定義(二維):
線性可分情況下的最優分隔平面
線性可分情況下最優分隔平面的數學理論(優化理論)
二次規劃問題
線性不可分情況下的最優分隔平面
少數樣本導致線性不可分情況
大量樣本線性不可分情況
線性不可分轉換為線性可分的方法:低維變換為高維
核函數(kernel function)
核函數舉例
Mercer定理
運用核函數求解支持向量機預測問題(線性方程的值)
原問題和對偶問題
將SVM原問題轉換為對偶問題
SVM分類的Python實現
線性SVM分類
非線性SVM分類
利用多項式特征
使用多項式核函數
線性可分和線性不可分
二維度情況:存在一條直線,能夠將兩個類別都數據集分開
三維(多維)情況:存在一個平面(超平面),能夠將兩個列別數據集分開。
下面是線性可分和不可分都例子:
線性可分數學定義(二維):
一個訓練樣本集{(X1,y1),(Xi,yi),...(XN,yN)} 在i=1~N線性可分,是指存在一個(), 對于i=1~N有:
注:yi=+1/-1僅僅是不同分類的標簽,也可以取1/0或者其他數字。
寫成向量形式:
先看線性可分的情況,然后推廣到線性不可分的情況
線性可分情況下的最優分隔平面
如果數據集是線性可分的,則存在無數個平面能將數據集進行分開,那么那個平面是最好的平面呢?
我們將分隔平面進行平移,直到分隔平面觸碰到兩類數據集實例,這樣的實例也稱支持向量,兩類實例平面的距離定義為間隔,
最優平面定義為:使間隔最大且處于間隔中間的分隔平面。
因此最優分隔平面需滿足三個條件:
1. 該平面正確的分開了兩類
2. 該平面最大化間隔
3. 該平面處于間隔的中間,到所有支持向量的距離相等
線性可分情況下最優分隔平面的數學理論(優化理論)
先說結論再推導,最優化分隔平面就是尋找最小的(與最小化相同,后者求導更方便),同時滿足下述限制條件:
為什么是這樣?為了推導這個結論,我們先給出兩個事實:
事實1:
?
事實2:
比如,二維情況點到面的距離公式:
有了這兩個事實,就可以理解SVM中推導中最難理解的部分:
- 根據事實1,可以有常數a去縮放(),(),使得:
- 根據事實2,支持向量X0到超平面的距離將變為:
因此最大化d,就是最小化,
同時由于yi=+1時,, 因此,對于yi=-1的情況同理。
尋找最大間隔分隔面的問題就變成如下優化問題:
其中,{xi,yi}已知,(ω,b)待求,是一個典型的凸優化二次規劃問題,有成熟的求解工具。
二次規劃問題
二次規劃問題的定義:
1. 目標函數是二次項
2. 約束條件是一次項
二次規劃問題要么有唯一解,要么無解。
線性不可分情況下的最優分隔平面
少數樣本導致線性不可分情況
在線性不可分的條件下,限制條件無法同時滿足,需要引入一個松弛變量,
現在有兩個相互沖突的目標,越小越好(對應間隔越小)從而減少間隔違例,而我們又要使最小從而最大化間隔,這也是超參數C的用武之地。
優化問題可以改寫為:
?可以看出,C越大,權重越大,間隔越小。
大量樣本線性不可分情況
某些情況下,數據集大量樣本都是線性不可分的,例如下圖中都X和??,無論取什么樣的線性平面,分隔的情況都不理想,只有取圖示橢圓的分隔面,才能把兩類樣本分開。
線性不可分轉換為線性可分的方法:低維變換為高維
這個時候需要使用函數變換,將樣本從低維變換為高維(),從而變為線性可分。這是因為:
定理:在一個M維空間上隨機去N個樣本,隨機對每個樣本賦予標簽+1/-1,假設這些樣本線性可分對概率為P(M), 則在當M趨于∞時,P(M)=1
例如:下面對數據集在只有x1維度時是線性不可分的,當從x1映射到(x1, x1^2)時,就變成線性可分了。
所以,問題就是尋找適當的變換函數(),使得樣本在空間線性可分,原最優問題也就轉換為了下列問題:
注意,此優化和約束條件從X空間轉換到了,因此ω維度和維度相同,而不是和X維度相同了(此ω不是原X空間問題的ω了)
核函數(kernel function)
前面提到,現在的問題就是找到合適的,使得X在空間線性可分。但是很多情況下具體形式并不容易得到。即使如此,在某些情況下也并不妨礙我們對樣本進行訓練和預測,這里就不得不提核函數的作用了。
核函數定義為,對于任意連個向量X1,X2,滿足:
則K(X1,X2)為核函數,核函數是一個實數,這個可以從等式的右邊看出來。核函數和是一一對應的關系
核函數舉例
1. 已知具體形式,求K(X1,X2)
假設是一個將二維向量映射為三維向量的映射,具有下列形式:
2. 已知K(X1,X2),求具體形式
其中
則具有如下形式:
Mercer定理
核函數不能任意取,需要滿足一定的條件,才能分解為兩個函數的內積的形式
運用核函數求解支持向量機預測問題(線性方程的值)
原問題和對偶問題
將SVM原問題轉換為對偶問題
前面提到SVM原問題為:
這個和上一節提到的原問題轉換為對偶問題的原問題限制條件有一些區別,接下來,我們將原問題轉換為上一節原問題的形式。
將取,得到:
上一節提到的對偶問題的現在變為了(),可以看到目標函數是凸函數,限制條件是線性函數,符合強對偶定理,原問題和對偶問題的解相等。
對偶問題如下:
該問題是一個二次規劃問題,要求θ(α,β)對最大值, 令?θ(α,β)對α,β,b進行求導并令導數為0,得到:
注明:第(2)式應該是
分別將上述三個式子代入對偶問題表達式θ(α,β),簡化后:
限制條件:
可以看到,對偶問題也是一個二次規劃問題,可以方便求解。
由于知道核函數,可以解出
接下來如果要運用支持向量機對樣本進行預測,需要求得的值,因此需要求得b的值
根據KKT條件(一個線性規劃問題有最優解的充分必要條件),有:
?
如果對于某個i=1~N, 如果?(若, 則,該樣本不會對線性分隔平面產生任何影響),必須有, 可得:
于是我們就可以求出的值了:
其中,
我們可以看出,即使在不知道的具體形式而只知道K(X1,X2),仍然可以對樣本進行預測,這稱為核函數戲法(kenel function trick)
SVM分類的Python實現
線性SVM分類
下面是一個使用鳶尾花數據集進行線性SVM分類的例子,其中的X是花葉子的長度和寬度,y是否為Iris-Virginica品類(一共有3中品類)
步驟主要是:加載鳶尾花數據集,進行特征縮放,然后訓練一個線性SVM模型(使用LinearSVC,C=1,hinge損失函數),然后進行預測
import numpy as np from sklearn import datasets from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.svm import LinearSVCiris = datasets.load_iris() X = iris["data"][:, (2, 3)] # petal length, petal width y = (iris["target"] == 2).astype(np.float64) # Iris-Virginicasvm_clf = Pipeline([("scaler", StandardScaler()),("linear_svc", LinearSVC(C=1, loss="hinge", random_state=42)),])svm_clf.fit(X, y)# 使用模型作出預測 >>>svm_clf.predict([[5.5, 1.7]]) array([1.0])下圖展示在不同C取值下線性分類的結果:C越大,間隔越小。
非線性SVM分類
下面是一個使用衛星數據進行非線性SVM分類的例子,有兩個特征X1,X2,兩類數據如圖所示:
其中藍綠分別代表不同的數據標簽,可以看到該數據集是線性不可分的,可以嘗試使用3階多項式SVM分類方法
利用多項式特征
from sklearn.datasets import make_moons from sklearn.pipeline import Pipeline from sklearn.preprocessing import PolynomialFeaturespolynomial_svm_clf = Pipeline([("poly_features", PolynomialFeatures(degree=3)),("scaler", StandardScaler()),("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42))])polynomial_svm_clf.fit(X, y)訓練結果如圖:
使用多項式核函數
添加多項式特征實現起來非常簡單,并且對所有對機器學習算法(不只式SVM)都非常有效,但問題是多項式太低階,無法處理非常復雜的數據集,而高階則會創造大量的特征,導致模型變得很慢。幸運的是,可以運用核函數技巧,它產生的結果就跟添加了許多項多項式特征一樣,但實際上并不需要添加,所以不存在數量爆炸的組合特征。
from sklearn.svm import SVCpoly_kernel_svm_clf = Pipeline([("scaler", StandardScaler()),("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))]) poly_kernel_svm_clf.fit(X, y)結果如下圖所示:左圖使用了一個3階多項式核SVM分類器,右圖使用的是?一個10階多項式核SVM分類器,其中超參數coef0(圖中的r=1或者100)接受高階還是低階多項式的程度
總結
以上是生活随笔為你收集整理的支持向量机原理及scikit-learn实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 涨涨涨疯了!特斯拉美国再次上调Model
- 下一篇: 世界第一货运飞船!“天舟”家族还有这些高