一、支持向量機
-
支持向量機只能做二分類任務
-
SVM全稱支持向量機,即尋找到一個超平面使樣本分成兩類,且間隔最大
-
硬間隔:如果樣本線性可分,在所有樣本分類都正確的情況下,尋找最大間隔;如果出現異常值或樣本線性不可分,此時硬間隔無法實現
-
軟間隔:允許部分樣本,在最大間隔之內,甚至在錯誤的一邊,尋找最大間隔;目標是盡可能保持間隔寬闊和限制間隔違例之間尋找良好的平衡
-
懲罰系數:通過懲罰系數來控制這個平衡,C值越小,則間隔越寬,分錯的樣本個數也就越多;反之,C值越大,則間隔越窄,分錯的樣本個數越少
二、LinearSVC_API
class sklearn.svm LinearSVC(C = 1.0)
- 示例
from plot_util import plot_decision_boundary_svc, plot_decision_boundary
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.svm import LinearSVCX, y = load_iris(return_X_y= True)x = X[y < 2, :2]
y = y[y < 2]plt.scatter(x[y == 0, 0], x[y == 0, 1], c = 'r')
plt.scatter(x[y == 1, 0], x[y == 1, 1], c = 'b')
plt.show()# 特征處理
transform = StandardScaler()
x_tran = transform.fit_transform(x)# 模型訓練
model = LinearSVC(C = 30)
model.fit(x_tran, y)
y_pre = model.predict(x_tran)
print(accuracy_score(y, y_pre))# 可視化處理
plot_decision_boundary_svc(model, axis = [-3, 3, -3, 3])
plt.scatter(x_tran[y == 0, 0], x_tran[y == 0, 1], c = 'r')
plt.scatter(x_tran[y == 1, 0], x_tran[y == 1, 1], c = 'b')
plt.show()# 模型訓練
model = LinearSVC(C = 0.01)
model.fit(x_tran, y)
y_pre = model.predict(x_tran)
print(accuracy_score(y, y_pre))# 可視化處理
plot_decision_boundary_svc(model, axis = [-3, 3, -3, 3])
plt.scatter(x_tran[y == 0, 0], x_tran[y == 0, 1], c = 'r')
plt.scatter(x_tran[y == 1, 0], x_tran[y == 1, 1], c = 'b')
plt.show()
三、SVM算法原理
要去求一組參數(w, b),使其構建的超平面函數能夠最優地分離兩個集合
樣本空間中任一點x到超平面(w, b)的距離可寫成: r = w T x + b ∣ ∣ w ∣ ∣ r = \frac{w^Tx+b}{||w||} r=∣∣w∣∣wTx+b?,想要找到具有最大間隔的劃分超平面,也就是要找到能滿足下式中約束的參數w和b,使得間隔 γ \gamma γ最大
? { w T x i + b ? + 1 , y i = + 1 ; w T x i + b ? ? 1 , y i = ? 1. \begin{cases} \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i} + b \geqslant +1, & y_{i} = +1; \\ \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i} + b \leqslant -1, & y_{i} = -1. \end{cases} {wTxi?+b?+1,wTxi?+b??1,?yi?=+1;yi?=?1.?
距離超平面最近的幾個訓練樣本點使上式等號成立,他們被稱為“支持向量”,兩個異類支持向量到超平面的距離之和為(最大間隔距離表示): 2 ∣ ∣ w ∣ ∣ \frac{2}{||w||} ∣∣w∣∣2?
-
訓練樣本: { w T x i + b ? + 1 , y i = + 1 ; w T x i + b ? ? 1 , y i = ? 1. \begin{cases} \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i} + b \geqslant +1, & y_{i} = +1; \\ \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i} + b \leqslant -1, & y_{i} = -1. \end{cases} {wTxi?+b?+1,wTxi?+b??1,?yi?=+1;yi?=?1.?則目標函數可以寫成: m a x w , b = 2 ∣ ∣ w ∣ ∣ s . t . y i ( w T x i + b ) ? 1 ,其中 i = 1 , 2 , 3 , … , m max_{w, b} = \frac{2}{||w||}s.t.y_i(w^Tx_i+b) \geqslant 1,其中i=1,2,3,\dots, m maxw,b?=∣∣w∣∣2?s.t.yi?(wTxi?+b)?1,其中i=1,2,3,…,m
-
將目標函數進一步優化: m i n w , b = 1 2 ∣ ∣ w ∣ ∣ 2 s . t . y i ( w T x i + b ) ? 1 , 其中 i = 1 , 2 , 3 , … , m min_{w, b} = \frac{1}{2}||w||^2 s.t.y_i(w^Tx_i+b) \geqslant 1,其中i = 1, 2, 3, \dots, m minw,b?=21?∣∣w∣∣2s.t.yi?(wTxi?+b)?1,其中i=1,2,3,…,m
-
添加核函數,將目標函數轉化成以下形式:KaTeX parse error: {align*} can be used only in display mode.
-
構建拉格朗日函數:其中 α i \alpha_i αi?為拉格朗日乘子(相當于 λ i \lambda_i λi?): L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 ? ∑ i = 1 n α i ( 1 ? y i ( w T ? Φ ( x i ) + b ) ? 1 ) … … ① L(w, b, \alpha) = \frac{1}{2}||w||^2-\sum_{i = 1}^{n} \alpha_i\left(1 - y_{i} \left(\boldsymbol{w}^{\mathrm{T}} \cdot \boldsymbol{\varPhi}(x_{i}) + b\right)-1\right) \dots \dots ① L(w,b,α)=21?∣∣w∣∣2?∑i=1n?αi?(1?yi?(wT?Φ(xi?)+b)?1)……①
-
要想求得極小值,上式后半部分應該取的極大值: m i n w , b m a x α L ( w , b , α ) < = = > m a x α m i n w , b L ( w , b , α ) min_{w, b}max_{\alpha}L(w, b, \alpha) <==> max_{\alpha }min_{w, b}L(w, b, \alpha) minw,b?maxα?L(w,b,α)<==>maxα?minw,b?L(w,b,α)
-
要找 m i n w , b L ( w , b , α ) min_{w, b}L(w, b, \alpha) minw,b?L(w,b,α),既要先對 w , b w, b w,b求導
-
對 w w w求偏導,并令其為0: L = 1 2 ∣ ∣ w ∣ ∣ 2 ? ∑ i = 1 n α i ( y i w T φ ( x i ) + y i b ? 1 ) = 1 2 ∣ ∣ w ∣ ∣ 2 ? ∑ i = 1 n α i y i w T φ ( x i ) + α i y i b ? α i L=\frac{1}{2}||w||^2-\sum_{i = 1}^n \alpha_i(y_iw^T \varphi(x_i)+y_ib-1)=\frac{1}{2}||w||^2-\sum_{i = 1}^n \alpha_iy_iw^T \varphi(x_i)+\alpha_iy_ib-\alpha_i L=21?∣∣w∣∣2?∑i=1n?αi?(yi?wTφ(xi?)+yi?b?1)=21?∣∣w∣∣2?∑i=1n?αi?yi?wTφ(xi?)+αi?yi?b?αi?
? L ? w = w ? ∑ i = 1 n α i y i φ ( x i ) = 0 \frac{\partial L}{\partial w}= w-\sum_{i = 1}^n\alpha_iy_i \varphi(x_i) = 0 ?w?L?=w?∑i=1n?αi?yi?φ(xi?)=0
得到: w = ∑ i = 1 n α i y i φ ( x i ) = 0 w =\sum_{i = 1}^n\alpha_iy_i \varphi(x_i) = 0 w=∑i=1n?αi?yi?φ(xi?)=0
-
對b求偏導,并令其為0:
L = 1 2 ∣ ∣ w ∣ ∣ 2 ? ∑ i = 1 n α i y i w T φ ( x i ) + α i y i b ? α i L = \frac{1}{2}||w||^2-\sum_{i = 1}^n \alpha_iy_iw^T\varphi(x_i)+\alpha_iy_ib-\alpha_i L=21?∣∣w∣∣2?∑i=1n?αi?yi?wTφ(xi?)+αi?yi?b?αi?? L ? b = ∑ i = 1 n α i y i = 0 \frac{\partial L}{\partial b}=\sum_{i = 1}^n\alpha_iy_i=0 ?b?L?=∑i=1n?αi?yi?=0
得到: ∑ i = 1 n α i y i = 0 \sum_{i = 1}^n\alpha _iy_i = 0 ∑i=1n?αi?yi?=0
-
-
將上面兩個求導的結果代入①式中,得到:KaTeX parse error: {align*} can be used only in display mode.
四、SVM核函數
- 核函數作用:核函數將原始輸入空間映射到新的特征空間,從而使原本線性不可分的樣本可能在核空間可分
- 核函數分類
- 線性核: k ( x i , x j ) = x i T x j k(x_i, x_j)=x_i^Tx_j k(xi?,xj?)=xiT?xj?
- 多項式核: k ( x i , x j ) = ( x i T x j ) d k(x_i, x_j) = (x_i^Tx_j)^d k(xi?,xj?)=(xiT?xj?)d
- 高斯核(RBF, 徑向基函數): k ( x I , x j ) = e p x ( ? ∣ ∣ x i ? x j ∣ ∣ 2 2 σ 2 ) k(x_I, x_j) = epx(-\frac{||x_i-x_j||^2}{2\sigma^2}) k(xI?,xj?)=epx(?2σ2∣∣xi??xj?∣∣2?)——產生將樣本投射到無限維空間的運算效果,使得原來不可分的數據變得可分,使用最多
- 拉普拉斯核: k ( x i , x j ) = e x p ( ? ∣ ∣ x i ? x j ∣ ∣ 2 σ ) k(x_i, x_j)=exp(-\frac{||x_i-x_j||^2}{\sigma}) k(xi?,xj?)=exp(?σ∣∣xi??xj?∣∣2?)
- Sigmod核: k ( x i , x j ) = t a n h ( β x i T x j + θ ) k(x_i, x_j) = tanh(\beta x_i^Tx_j+\theta) k(xi?,xj?)=tanh(βxiT?xj?+θ)
1.高斯核
-
公式: K ( x , y ) = e ? γ ∣ ∣ x ? y ∣ ∣ 2 K(x, y) = e^{-\gamma||x-y||^2} K(x,y)=e?γ∣∣x?y∣∣2,其中 γ = 1 2 σ 2 \gamma=\frac{1}{2\sigma^2} γ=2σ21?
- γ \gamma γ是超參數,作用與標準差相反, γ \gamma γ越大(標準差越小),高斯分布越窄, γ \gamma γ越小,高斯分布越寬
-
API( γ \gamma γ較大,過擬合; γ \gamma γ較小,欠擬合)
from sklearn.svm import SVC
SVC(kernel = 'rbf', gamma=gamma)