支持向量机(SVM)详解
监督学习算法
适合中小规模样本,高维度数据,非线性,分类任务
超平面: 在高维空间里分隔数据的线性边界
支持向量: 距离超平面最近的样本点, 这些样本点决定了超平面的位置
间隔:支持向量到超平面的距离, svm算法的目标就是最大化这个间隔, 间隔越大, 则鲁棒性越好, 泛化能力越强.
在低维空间里是线性不可分的, 通过映射函数, 把数据映射到更高维空间内, 可能就变的线性可分了, 这正是SVM处理非线性问题的核心逻辑
是不是只要升高维度, 就一定会变的线性可分?
是的, 根据mercer定理, 如果升到**无限维**(如高斯核对应无限维空间),数据几乎总是可分的(由Mercer定理保证)
1. 算法概述
支持向量机(Support Vector Machine, SVM) 是一种监督学习算法,主要用于分类任务,尤其是二分类,也可用于回归。
其核心思想是找到一个最优超平面,最大化不同类别数据之间的间隔(称为“间隔最大化”)。
SVM 在小样本、高维数据和非线性分类问题中表现优异。
2. 原理解析
3. 适用场景
-
数据特点:中小规模、高维(如文本分类、图像识别)。
-
问题类型:
- 二分类问题(可通过“一对一”或“一对多”扩展到多分类)。
- 回归问题(使用支持向量回归,SVR)。
- 非线性可分数据(需配合核函数)。
4. 可解决的问题
- 分类:垃圾邮件检测、手写数字识别。
- 回归:房价预测。
- 异常检测:工业缺陷检测。
5. 优缺点
| 优点 | 缺点 |
|---|---|
| 高维数据有效 | 大规模数据训练慢 |
| 核技巧处理非线性问题 | 对参数(C, γ)敏感(超参数, 可以通过网格搜索进行模型优化) |
| 泛化能力强,避免过拟合 | 需要特征缩放 |
| 依赖少数支持向量,内存效率高 | 黑盒模型,解释性差 |
6. Python 代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 生成模拟数据
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 标准化数据
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 训练 SVM 模型(使用 RBF 核)
model = SVC(kernel='rbf',
C=1.0, # 软间隔
gamma='scale')
model.fit(X_train, y_train)
# 预测与评估
y_pred = model.predict(X_test)
print(f"准确率: {accuracy_score(y_test, y_pred):.2f}")
print(f"支持向量数量: {len(model.support_vectors_)}")
# 可视化决策边界
def plot_decision_boundary():
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
Z = model.predict(scaler.transform(np.c_[xx.ravel(), yy.ravel()]))
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolor='k', s=20)
plt.title("SVM 决策边界 (RBF 核)")
plt.show()
plot_decision_boundary()
输出结果:
准确率: 0.95
支持向量数量: 127
代码解释
- 数据生成:使用
make_classification创建二维可分数据。 - 标准化:SVM 对特征尺度敏感,需标准化。
- 模型训练:选择 RBF 核,调整
C和gamma可优化性能。 - 可视化:绘制决策边界,直观展示分类效果。
通过调整参数(如 C、gamma 和核函数),可进一步优化模型表现。实际应用中,建议使用网格搜索(GridSearchCV)进行超参数调优。