支持向量机是一种强大的监督学习算法,主要用于分类问题,但也可以用于回归和异常检测。SVM 的核心思想是通过最大化分类边界的方式找到数据的最佳分离超平面。
1. 核心思想
目标
给定训练数据 ,其中 是特征向量, 是标签,SVM 的目标是找到一个超平面将数据分开,同时最大化分类边界的间隔。
决策函数
超平面可以表示为:
其中:
- w 是超平面的法向量。
- b 是偏置项,决定超平面与原点的距离。
分类条件:
优化目标
最大化边界的间隔(Margin),即:
同时满足分类条件:
通过拉格朗日对偶问题,最终转化为凸优化问题求解。
2. 线性 SVM
损失函数
对线性可分的数据,优化问题为:
当数据不可完全分离时,引入松弛变量 :
- C 是正则化参数,控制对误分类的容忍度。
3. 非线性 SVM
对于线性不可分的数据,SVM 使用核技巧(Kernel Trick)将数据映射到高维特征空间,使其在高维空间中线性可分。
核函数
核函数 表示输入数据在高维空间的内积:
常用核函数:
- 线性核:
- 多项式核:
- 高斯核(RBF):
- Sigmoid 核:
4. SVM 的分类过程
- 训练阶段:通过优化问题学习权重 w 和偏置 b。
- 预测阶段:计算输入数据到超平面的距离,决定类别标签。
5. 优势与劣势
优势
- 适合高维数据:在高维数据中仍表现良好。
- 非线性处理能力强:通过核技巧解决非线性问题。
- 全局最优解:优化问题是凸的,不容易陷入局部最优。
劣势
- 效率问题:对大规模数据或高维特征数据训练速度较慢。
- 参数敏感性 :核函数和正则化参数 C、核参数(如 )需要精心调试。
- 对噪声敏感:容易受到噪声数据的影响。
6. 代码示例
以下是使用 sklearn
实现 SVM 的分类示例。
分类示例
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[:, :2] # 取前两个特征
y = (iris.target != 0).astype(int) # 二分类任务
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练 SVM 模型
model = SVC(kernel='linear', C=1.0)
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估
print("Accuracy:", accuracy_score(y_test, y_pred))
输出结果
bash
Accuracy: 1.0
核函数示例
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[:, :2] # 取前两个特征
y = (iris.target != 0).astype(int) # 二分类任务
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 使用 RBF 核
model_rbf = SVC(kernel='rbf', gamma=0.7, C=1.0)
model_rbf.fit(X_train, y_train)
# 预测与评估
y_pred_rbf = model_rbf.predict(X_test)
print("Accuracy with RBF kernel:", accuracy_score(y_test, y_pred_rbf))
输出结果
bash
Accuracy with RBF kernel: 1.0
7. 应用场景
- 文本分类与情感分析:如垃圾邮件分类。
- 图像分类:如手写数字识别。
- 生物信息学:如基因分类。
- 异常检测:如检测网络入侵。