支持向量机(SVM,Support Vector Machine)是一种监督学习算法,主要用于分类任务,也可扩展到回归(SVR)。它的核心目标是寻找最优分隔超平面,让不同类别样本之间的间隔最大。

1. 基本原理
在样本空间中,分隔两类样本的决策边界称为超平面。
超平面公式:
- :权重向量,决定超平面方向
- :偏置,决定超平面位置
间隔:样本点到超平面的距离。SVM 追求最大间隔,离超平面最近的样本点叫做支持向量,整个模型只由这些点决定。
线性可分 SVM
样本可以被一条直线(二维)/平面(高维)完全分开,目标:最大化间隔。
软间隔 SVM
现实数据大多不是完全线性可分,允许少量样本错分,引入惩罚系数 :
- 越大:越不能容忍错分,容易过拟合
- 越小:允许更多错分,追求更大间隔,泛化更好
核函数 Kernel
当数据线性不可分,SVM 通过核函数把低维数据映射到高维空间,在高维空间里寻找可分超平面,不需要显式计算高维特征。
常用核函数:
- 线性核:
linear - 多项式核:
poly - 高斯核(RBF径向基核):
rbf,最常用
2. SVM 回归(SVR)
和分类SVM思路相反:设置一个ε间隔带,落在间隔带内的样本都认为预测正确,目标让样本尽量落在间隔带里面。
3. 优缺点
✅ 优点
- 小样本数据集上表现优秀
- 核技巧可以处理非线性问题
- 优化目标是全局最优,不容易陷入局部最优
- 泛化能力强,适合高维数据
❌ 缺点
- 样本量大时训练速度很慢
- 对参数、核函数选择敏感
- 原生是二分类,做多分类需要组合策略
- 可解释性弱,相比决策树很难理解规则
4. Python 代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 字体配置,解决 DejaVu Sans 中文缺失警告
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
# 生成二分类数据集
np.random.seed(42)
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)
# 划分训练集、测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建SVM模型,RBF高斯核
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train, y_train)
# 预测评估
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"测试集准确率:{acc:.2f}")
# 绘制决策边界
def plot_decision_boundary(clf, X, y):
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.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')
plt.scatter(X[:,0], X[:,1], c=y, cmap='coolwarm')
plt.xlabel("x1")
plt.ylabel("x2")
plot_decision_boundary(model, X_train, y_train)
plt.title("SVM 决策边界")
plt.show()
结果:

5. 适用场景
- 中小规模、高维特征数据(文本分类、图像小样本识别)
- 非线性分类任务
- 对泛化能力要求较高、样本不多的场景
6. 常见误区
- SVM 天然适合大数据:样本上万之后训练速度会显著下降
- RBF核一定比线性核好:特征维度很高时,线性核往往足够
- 越大越好:C过高会强行拟合噪声,造成过拟合
思考题
- 什么是支持向量?去掉其他样本,只保留支持向量训练,结果会变吗?
- 核函数的作用是什么?为什么核技巧可以避免直接构造高维特征?
0 条笔记