??支持向量機(Support Vector Machine,SVM)是一種經典的監督學習算法,主要用于分類任務,也可擴展到回歸問題(稱為支持向量回歸,SVR)。其核心思想是通過尋找一個最優超平面,最大化不同類別數據之間的間隔(Margin),從而實現高效分類。
一、核心思想
??SVM的目標是找到一個決策邊界(超平面),將不同類別的數據分開,并確保該邊界到最近數據點(支持向量)的距離最大。這種“最大化間隔”的策略使得模型具有更好的泛化能力。
超平面(Hyperplane):
??在n維空間中,一個超平面是n-1維的子空間。對于二維數據,超平面是一條直線;三維數據中是一個平面。
支持向量(Support Vectors):
??距離最優超平面最近的樣本點稱為支持向量,它們是決定超平面位置的關鍵樣本。其他樣本的位置對超平面無影響,這也是“SVM”名稱的由來。
間隔(Margin):
??超平面到兩類最近支持向量的距離之和。SVM的目標是最大化間隔。
??設超平面方程為 w ? x + b = 0 w\cdot x+b=0 w?x+b=0(其中 w w w是權重向量, b b b是偏置),則單個樣本點 x i x_i xi?到超平面的距離為:
距離 = ∣ w ? x i + b ∣ ∣ ∣ w ∣ ∣ 距離=\frac{\left| w\cdot x_i+b \right|}{\left| \left| w \right| \right|} 距離=∣∣w∣∣∣w?xi?+b∣?
??最優超平面需滿足:對于正類樣本,有 w ? x i + b ≥ 1 w\cdot x_i+b\geq1 w?xi?+b≥1;對于負類樣本,有 w ? x i + b ≤ ? 1 w\cdot x_i+b\leq-1 w?xi?+b≤?1 。此時,間隔為 2 ∣ ∣ w ∣ ∣ \frac{2}{\left| \left| w \right| \right|} ∣∣w∣∣2?,最大化間隔等價于最小化 ∣ ∣ w ∣ ∣ 2 \left| \left| w \right| \right|^{2} ∣∣w∣∣2。
二、線性可分情況(硬間隔SVM)
??假設數據線性可分,SVM的優化問題可表示為
???? min ? w , b 1 2 ∣ ∣ w ∣ ∣ 2 \min_{w,b}{\frac{1}{2}\left| \left| w \right| \right|^{2}} minw,b?21?∣∣w∣∣2 ? s.t. y i ( w ? x i + b ) ≥ 1 ( ? i ) y_i(w\cdot x_i+b)\geq1 \quad (\forall i) yi?(w?xi?+b)≥1(?i)
??目標:最小化 ∣ ∣ w ∣ ∣ \left| \left| w \right| \right| ∣∣w∣∣(等價于最大化間隔 2 ∣ ∣ w ∣ ∣ \frac{2}{\left| \left| w \right| \right|} ∣∣w∣∣2?)。
??約束:確保所有樣本被正確分類且位于間隔邊界之外。
三、非線性可分情況(軟間隔SVM)
??當樣本無法被線性超平面分隔時,SVM 通過以下方法處理:
1. 引入松弛變量(Slack Variables)
??允許部分樣本跨越超平面,但需在優化目標中加入懲罰項(即正則化參數 C C C),平衡間隔最大化和分類錯誤最小化
???? min ? w , b 1 2 ∣ ∣ x ∣ ∣ 2 + C ∑ i ξ i \min_{w,b}{\frac{1}{2}\left| \left| x \right| \right|^{2}}+C\sum_{i}{\xi_i} minw,b?21?∣∣x∣∣2+C∑i?ξi? ? s.t. y i ( w ? x i + b ) ≥ 1 ? ξ i , ξ i ≥ 0 y_i(w\cdot x_i+b)\geq 1-\xi_i,\quad \xi_i\geq0 yi?(w?xi?+b)≥1?ξi?,ξi?≥0
?? C C C的作用:控制分類錯誤的懲罰力度。 C C C越大,模型越嚴格(可能過擬合); C C C越小,允許更多錯誤(可能欠擬合)。
2. 核技巧(Kernel Trick)
??對于非線性可分數據,SVM通過核函數將原始空間映射到高維特征空間,使數據在新空間中線性可分。常見核函數有
??線性核: K ( x i , x j ) = x i ? x j K(x_i,x_j)=x_i\cdot x_j K(xi?,xj?)=xi??xj?
??多項式核: K ( x i , x j ) = ( x i ? x j + c ) d K(x_i,x_j)=(x_i\cdot x_j+c)^{d} K(xi?,xj?)=(xi??xj?+c)d
??高斯徑向基核(RBF): K ( x i , x j ) = e x p ( ? γ ∣ ∣ x i ? x j ∣ ∣ 2 ) K(x_i,x_j)=exp(-\gamma \left| \left| x_i-x_j \right| \right|^{2}) K(xi?,xj?)=exp(?γ∣∣xi??xj?∣∣2)
??Sigmoid核: K ( x i , x j ) = t a n h ( α x i ? x j + c ) K(x_i,x_j)=tanh(\alpha x_i\cdot x_j+c) K(xi?,xj?)=tanh(αxi??xj?+c)
四、優化與求解
??SVM通常轉化為對偶問題,利用拉格朗日乘子法求解:
???? m a x α ∑ i α i ? 1 2 ∑ i , j α i α j y i y j K ( x i , x j ) max_{\alpha}{\sum_{i}{\alpha_i}}-\frac{1}{2}\sum_{i,j}{\alpha_i\alpha_jy_iy_jK(x_i,x_j)} maxα?∑i?αi??21?∑i,j?αi?αj?yi?yj?K(xi?,xj?) ?s.t. 0 ≤ α i ≤ C , ∑ i α i y i = 0 0\leq\alpha_i\leq C,\sum_{i}{\alpha_iy_i=0} 0≤αi?≤C,∑i?αi?yi?=0
??通過拉格朗日對偶性轉化為對偶問題,優勢在于:
????a) 將高維空間中的內積運算轉化為核函數計算(避免直接處理高維數據);
????b) 解的形式僅依賴于支持向量,計算效率更高。
五、Python實現示例
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score# 加載鳶尾花數據集
iris = datasets.load_iris()
X = iris.data # 特征
y = iris.target # 標簽# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42
)# 創建SVM分類器
clf = SVC(kernel='linear') # 使用線性核函數# 訓練模型
clf.fit(X_train, y_train)# 預測
y_pred = clf.predict(X_test)# 評估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"模型準確率: {accuracy:.2f}")# 預測新樣本
new_samples = [[5.1, 3.5, 1.4, 0.2], [6.3, 3.3, 4.7, 1.6]]
predictions = clf.predict(new_samples)
print(f"新樣本預測結果: {[iris.target_names[p] for p in predictions]}")
End.