1. 支持向量機(SVM)是什么?
支持向量機(SVM,Support Vector Machine)是一種監督學習算法,廣泛應用于分類和回歸問題,尤其適用于高維數據的分類。其核心思想是尋找最優分類超平面,使得不同類別的樣本間隔(Margin)最大化,從而提高模型的泛化能力。
2. SVM的基本原理
2.1. 核心思想
- 目標: 在特征空間中找到一個超平面(決策邊界),使得兩類樣本的間隔最大化。
- 關鍵概念:
- 支持向量(Support Vectors): 距離超平面最近的樣本點,決定超平面的位置。這些點在定義分類邊界時起著至關重要的作用,因此稱為“支持向量”
- 間隔(Margin): 支持向量到超平面的距離,越大表示分類器魯棒性越強。SVM通過最大化這個間隔來選擇最佳超平面。
3. 線性可分和非線性可分
-
線性可分: 如果數據可以通過一個直線(二維空間)或超平面(高維空間)分開,則稱數據是線性可分的。在這種情況下,SVM能夠找到一個線性決策邊界。
-
非線性可分: 當數據不是線性可分時,我們可以通過核函數將數據映射到更高維的空間,使得在這個高維空間中數據變得線性可分。這個過程稱為核技巧。
4. SVM的數學基礎
4.1. 線性可分情況(硬間隔 SVM)
4.1.1. 間隔最大化
-
在二維空間中,我們用一個線性決策邊界(直線)來將數據分開。假設數據點可以被線性分開,則可以表示為:
w ? x + b = 0 w?x+b=0 w?x+b=0 -
其中:
- w w w 是法向量,決定超平面的方向。
- b b b 是偏置項,控制超平面與原點的距離。
- x x x 是數據點。
-
目標是找到一個決策邊界,使得不同類別的數據點到該邊界的距離盡量遠。最大化間隔可以轉化為如下的優化問題:
m a x i m i z e 2 ∥ w ∥ maximize \frac{2}{\|w\|} maximize∥w∥2?
- 其中, ∥ w ∥ \|w\| ∥w∥是法向量的范數,優化的目標是使這個范數最小化,從而間隔最大化。
4.1.2. SVM 的優化目標
-
假設數據線性可分,SVM 的優化目標是:
最大化間隔?等價于?最小化 1 2 ∥ w ∥ 2 最大化間隔 \ 等價于 \ 最小化 \frac {1}{2}\|w\|^2 最大化間隔?等價于?最小化21?∥w∥2 -
約束條件: y i ( w T x i + b ) ≥ 1 , ? i y_i(w^T x_i + b) \geq 1, \quad \forall i yi?(wTxi?+b)≥1,?i
-
其中
- w w w:是法向量。
- b b b :是偏置項。
- y i ∈ ? 1 , + 1 y_i∈{?1,+1} yi?∈?1,+1:樣本標簽。
-
幾何解釋:
-
超平面方程: w T x + b = 0 w^Tx+b=0 wTx+b=0。
-
支持向量滿足 y i ( w T x i + b ) = 1 y_i(w ^Tx_i +b)=1 yi?(wTxi?+b)=1。
-
3. 線性不可分情況(軟間隔 SVM)
當數據存在噪聲或輕微重疊時,引入松弛變量(Slack Variables) ξ i ≥ 0 \xi_i≥0 ξi?≥0,允許部分樣本違反約束:
最大化間隔?等價于 min ? 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i 最大化間隔 \ 等價于 \min \frac{1}{2} \|w\|^2 + C \sum_{i=1}^{N} \xi_i 最大化間隔?等價于min21?∥w∥2+Ci=1∑N?ξi?
- ξ i \xi_i ξi?是松弛變量,表示第 i i i個樣本點與分類邊界的偏差。
約束條件:
y i ( w T x i + b ) ≥ 1 ? ξ i , ξ i ≥ 0 y_i(w^T x_i + b) \geq 1 - \xi_i, \xi_i≥0 yi?(wTxi?+b)≥1?ξi?,ξi?≥0
-
參數 C C C:控制分類嚴格性:
-
C C C 大 → 更嚴格(可能過擬合)。
-
C C C 小 → 允許更多錯誤(提高泛化性)。
-
4. 非線性 SVM(核方法)
當數據非線性可分時,通過核函數(Kernel)將數據映射到高維空間,使其線性可分。
常用核函數
- 線性核(無映射):
K ( x i , x j ) = x i T x j K(x_i, x_j) = x_i^T x_j K(xi?,xj?)=xiT?xj? - 線性核(無映射):
K ( x i , x j ) = ( x i T x j + c ) d K(x_i, x_j) = (x_i^T x_j + c)^d K(xi?,xj?)=(xiT?xj?+c)d - 高斯核(RBF)(最常用):
K ( x i , x j ) = exp ? ( ? ∥ x i ? x j ∥ 2 2 σ 2 ) K(x_i, x_j) = \exp \left( -\frac{\|x_i - x_j\|^2}{2\sigma^2} \right) K(xi?,xj?)=exp(?2σ2∥xi??xj?∥2?)- σ 控制樣本間影響范圍(小 → 過擬合,大 → 欠擬合)。
- Sigmoid 核:
K ( x i , x j ) = tanh ? ( α x i T x j + c ) K(x_i, x_j) = \tanh(\alpha x_i^T x_j + c) K(xi?,xj?)=tanh(αxiT?xj?+c)
核技巧(Kernel Trick)
- 無需顯式計算高維映射 ? ( x ) ?(x) ?(x),直接通過核函數計算內積:
? ( x i ) T ? ( x j ) = K ( x i , x j ) \phi(x_i)^T \phi(x_j) = K(x_i, x_j) ?(xi?)T?(xj?)=K(xi?,xj?)
5. 優化方法(對偶問題)
原始問題轉化為拉格朗日對偶問題,通過求解:
max ? α ∑ i = 1 n α i ? 1 2 ∑ i , j α i α j y i y j K ( x i , x j ) \max_{\alpha} \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j K(x_i, x_j) αmax?i=1∑n?αi??21?i,j∑?αi?αj?yi?yj?K(xi?,xj?)
約束:
∑ i = 1 n α i y i = 0 , 0 ≤ α i ≤ C \sum_{i=1}^{n} \alpha_i y_i = 0, \quad 0 \leq \alpha_i \leq C i=1∑n?αi?yi?=0,0≤αi?≤C
α i α_i αi?:拉格朗日乘子,非零 α i α_i αi? 對應支持向量。
最終決策函數:
f ( x ) = sign ( ∑ i ∈ S V α i y i K ( x i , x ) + b ) f(x) = \text{sign} \left( \sum_{i \in SV} \alpha_i y_i K(x_i, x) + b \right) f(x)=sign(i∈SV∑?αi?yi?K(xi?,x)+b)
6. 優缺點
-
? 優點
-
高維數據有效(尤其適合文本、圖像)。
-
核方法處理非線性問題。
-
泛化能力強(最大化間隔)。
-
對過擬合有一定魯棒性(通過 C C C 控制)。
-
-
? 缺點
-
計算復雜度高(訓練時間隨樣本數增長)。
-
對參數( C C C、核參數)敏感。
-
不直接提供概率輸出(需額外校準)。
-
7. Python 示例(Scikit-learn)
7.1. 線性 SVM
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split# 加載數據
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 訓練線性SVM(C=1.0)
model = SVC(kernel='linear', C=1.0)
model.fit(X_train, y_train)# 評估
print("Accuracy:", model.score(X_test, y_test))
7.2. 非線性 SVM(RBF 核)
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler# 標準化數據
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 訓練RBF核SVM(C=1.0, gamma='scale')
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train_scaled, y_train)# 預測
print("Accuracy:", model.score(X_test_scaled, y_test))
7.3. 支持向量可視化
import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay# 僅用前兩特征簡化可視化
X_2d = X[:, :2]
model = SVC(kernel='linear').fit(X_2d, y)disp = DecisionBoundaryDisplay.from_estimator(model, X_2d, response_method="predict",plot_method="pcolormesh", alpha=0.3,
)
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y, edgecolor='k')
plt.title("SVM Decision Boundary")
plt.show()
8. 關鍵參數調優
-
C C C:平衡分類嚴格性與泛化能力。
- 網格搜索:GridSearchCV(param_grid={‘C’: [0.1, 1, 10]})
-
核函數選擇:
-
線性:kernel=‘linear’
-
RBF:kernel=‘rbf’(需調 gamma)
-
-
γ γ γ(RBF核):
- 小 → 決策邊界平滑,大 → 復雜(過擬合風險)。
9. 總結
-
SVM 核心:最大化間隔的超平面,支持核方法處理非線性。
-
關鍵參數:
-
正則化參數 C C C。
-
核函數類型(RBF/線性/多項式)。
-
RBF 核的 γ γ γ。
-
-
適用場景:
-
中小規模高維數據(如文本分類、圖像識別)。
-
需強泛化能力的分類任務。
-