人工智能之核心基础 机器学习
第五章 支持向量机(SVM)
5.1 SVM核心思想
🎯 核心目标:找一条“最宽”的分界线!
想象你有一堆红球和蓝球散落在桌上,你要用一张纸把它们完全分开。 SVM 的目标不是随便找一条分界线,而是找最粗的那张纸——这样即使球稍微移动,也不会混在一起。
✅ 关键概念:
- 分隔超平面(Separating Hyperplane):在高维空间中的“分界线”(2D是线,3D是面)
- 间隔(Margin):分界线到最近样本的距离
- 支持向量(Support Vectors):离分界线最近的那些样本点(决定分界线位置!)
图:SVM寻找最大间隔的分隔线,红色/蓝色点为支持向量
🔍 为什么“间隔最大化”重要?
- 鲁棒性强:对噪声和新数据更稳定
- 泛化能力好:避免过拟合(不像决策树可能绕来绕去)
💡 通俗理解: 普通分类器:“只要分开就行” SVM:“不仅要分开,还要留足安全距离!”
5.2 线性可分 vs 线性不可分
✅ 情况1:线性可分(理想情况)
- 所有样本能被一条直线(或超平面)完美分开
- SVM 直接求解硬间隔最大化
但现实数据往往有噪声、有重叠 → 线性不可分!
⚠️ 情况2:线性不可分 → 软间隔 + 核技巧
1️⃣ 软间隔(Soft Margin)
允许某些样本“站错队”,通过引入松弛变量 :
- :正则化参数
- 很大 → 不容忍错误(接近硬间隔)
- 很小 → 允许更多错误(防止过拟合)
📌 调参重点:
C控制“间隔宽度”与“分类错误”的权衡
2️⃣ 核函数(Kernel Trick)——处理非线性问题
当数据无法用直线分开时,SVM 可以通过核函数将数据映射到高维空间,使其变得线性可分!
✨ 核技巧精髓:不用显式计算高维坐标,直接计算高维空间的内积!
常用核函数:
| 核函数 | 公式 | 特点 | 适用场景 |
|---|---|---|---|
| 线性核 | 等价于原始空间线性SVM | 文本分类、高维稀疏数据 | |
| 多项式核 | 可拟合曲线边界 | 中等复杂非线性 | |
| RBF核(高斯核) | 最常用!能拟合任意形状 | 图像、一般非线性问题 |
💡 RBF核参数:
- (gamma):控制单个样本的影响范围
- 大 → 模型复杂(可能过拟合)
- 小 → 模型平滑(可能欠拟合)

图:RBF核能拟合复杂边界,线性核只能分直线
5.3 SVM的优缺点与适用场景
✅ 优点
| 优势 | 说明 |
|---|---|
| 高维有效 | 即使特征数 > 样本数也能工作(如文本) |
| 内存高效 | 只存储支持向量(通常远少于总样本) |
| 泛化强 | 间隔最大化带来良好理论保证 |
| 核灵活 | 通过核函数处理非线性问题 |
❌ 缺点
| 劣势 | 说明 |
|---|---|
| 大数据慢 | 训练复杂度约 ,不适合百万级数据 |
| 难调参 | C 和 gamma 需要仔细调整 |
| 不直接输出概率 | 需额外校准(如 Platt scaling) |
| 对特征缩放敏感 | 必须标准化!(否则RBF核失效) |
🎯 适用场景
- 中小规模数据集(< 10万样本)
- 高维稀疏数据(如文本分类)
- 需要清晰决策边界的任务
- 特征维度较高但样本不多的情况
🚫 不适合:超大规模数据(用随机森林/XGBoost)、需要概率输出的场景(可用逻辑回归)
5.4 实战案例 + 代码实现
案例1:图像简单分类(手写数字 0 vs 1)
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
# 加载手写数字数据(只取0和1)
digits = datasets.load_digits()
X, y = digits.data, digits.target
X, y = X[y < 2], y[y < 2] # 只保留0和1
# 划分数据 + 标准化(❗SVM必须标准化!)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 网格搜索找最佳参数(C, gamma)
param_grid = {'C': [0.1, 1, 10], 'gamma': ['scale', 'auto', 0.001, 0.01]}
svm = SVC(kernel='rbf')
grid_search = GridSearchCV(svm, param_grid, cv=3, scoring='accuracy')
grid_search.fit(X_train_scaled, y_train)
print("最佳参数:", grid_search.best_params_)
print("测试集准确率:", grid_search.score(X_test_scaled, y_test))
案例2:文本分类(新闻类别)
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
# 加载两类新闻(科技 vs 宗教)
categories = ['comp.graphics', 'soc.religion.christian']
newsgroups_train = fetch_20newsgroups(subset='train', categories=categories)
newsgroups_test = fetch_20newsgroups(subset='test', categories=categories)
# 构建管道:TF-IDF + SVM
text_clf = Pipeline([
('tfidf', TfidfVectorizer()),
('svm', SVC(kernel='linear', C=1.0)) # 文本常用线性核!
])
text_clf.fit(newsgroups_train.data, newsgroups_train.target)
predicted = text_clf.predict(newsgroups_test.data)
print("准确率:", (predicted == newsgroups_test.target).mean())
print("\n分类报告:")
print(classification_report(newsgroups_test.target, predicted,
target_names=newsgroups_test.target_names))
💡 文本分类技巧:
- 用线性核(速度快,效果好)
- TF-IDF 自动处理高维稀疏特征
- 不需要标准化(TF-IDF 已归一化)
🎯 本章总结
- SVM = 找最宽马路分隔两类
- 线性可分?→ 硬间隔;不可分?→ 软间隔 + 核函数
- RBF核最万能,线性核适合文本
- 必须标准化!必须调参!不适合大数据!
💡 初学者建议:
- 先用
SVC(kernel='linear')试试线性可分性- 再用
SVC(kernel='rbf')+GridSearchCV调参- 文本任务优先选线性核,又快又好!
资料关注
公众号:咚咚王 gitee:gitee.com/wy185850518…

《Python编程:从入门到实践》 《利用Python进行数据分析》 《算法导论中文第三版》 《概率论与数理统计(第四版) (盛骤) 》 《程序员的数学》 《线性代数应该这样学第3版》 《微积分和数学分析引论》 《(西瓜书)周志华-机器学习》 《TensorFlow机器学习实战指南》 《Sklearn与TensorFlow机器学习实用指南》 《模式识别(第四版)》 《深度学习 deep learning》伊恩·古德费洛著 花书 《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》 《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》 《自然语言处理综论 第2版》 《Natural-Language-Processing-with-PyTorch》 《计算机视觉-算法与应用(中文版)》 《Learning OpenCV 4》 《AIGC:智能创作时代》杜雨+&+张孜铭 《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》 《从零构建大语言模型(中文版)》 《实战AI大模型》 《AI 3.0》
图:SVM寻找最大间隔的分隔线,红色/蓝色点为支持向量