news 2026/9/2 23:10:56

Day 85:【99天精通Python】机器学习进阶 - 支持向量机 (SVM) - 寻找最宽的街道

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 85:【99天精通Python】机器学习进阶 - 支持向量机 (SVM) - 寻找最宽的街道

Day 85:【99天精通Python】机器学习进阶 - 支持向量机 (SVM) - 寻找最宽的街道

前言

欢迎来到第85天!

在前面的课程中,我们学习了逻辑回归(找一条线划分)和决策树(用if/else切分)。
今天,我们要学习一个在深度学习流行之前,统治了机器学习领域近 20 年的算法——支持向量机 (Support Vector Machine, SVM)

SVM 的核心思想是:找到一个能将两类数据分得"最开"的决策边界(超平面)。这个边界就像一条马路,我们希望马路越宽越好,这样容错率更高。

本节内容:

  • SVM 原理:最大间隔与支持向量
  • 核技巧 (Kernel Trick):处理非线性数据
  • Sklearn 中的SVCSVR
  • 超参数调优 (C, gamma)
  • 实战练习:手写数字识别 (再战 MNIST)

一、SVM 原理

1.1 最大间隔 (Maximal Margin)

想象一下,在两堆点之间画一条线,可以有无数种画法。SVM 认为,最好的那条线,是离两边最近的点最远的那条。
这条"最宽的马路"的宽度,就叫间隔 (Margin)

1.2 支持向量 (Support Vectors)

决定这条"马路"边界的那些点,就叫支持向量。SVM 只关心这些离边界最近的点,其他点对模型没有影响。

[外链图片转存中…(img-bzIHDqJk-1768672246392)]

1.3 核技巧 (Kernel Trick) -精髓

如果数据是线性不可分的(比如一个圈套着另一个圈),怎么办?
SVM 的天才之处在于核技巧。它通过一个核函数,将数据从低维空间映射到高维空间,让它们变得线性可分。

  • 线性核 (linear): 不做映射。
  • 多项式核 (poly): 映射到多项式空间。
  • 高斯径向基核 (RBF): 最常用,能处理各种复杂形状。

二、Sklearn 中的 SVM

2.1 分类 (SVC) 与 回归 (SVR)

  • SVC: Support VectorClassifier
  • SVR: Support VectorRegressor

2.2 超参数

  • C(惩罚系数)
    • C越大,越追求"纯洁"(所有点都分对),容错率低,容易过拟合。
    • C越小,允许犯一些错误,容错率高,泛化能力可能更好。
  • kernel:'linear','poly','rbf'(默认)。
  • gamma(RBF核专用):
    • gamma越大,影响范围越小,边界越弯曲,容易过拟合。
    • gamma越小,影响范围越大,边界越平滑。

三、实战:再战 MNIST 手写数字识别

我们用 SVM 来解决 Day 79 的手写数字识别问题,看看和神经网络比效果如何。

3.1 数据准备

fromsklearn.datasetsimportfetch_openmlfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportSVCfromsklearn.metricsimportaccuracy_scoreimportpandasaspd# 1. 加载数据 (如果慢,可以只取一小部分)# as_frame=False 返回 NumPy 数组X,y=fetch_openml('mnist_784',version=1,return_X_y=True,as_frame=False)# 数据量太大,只取前 10000 个样本用于演示X=X[:10000]y=y[:10000]# 2. 标准化 (SVM对尺度敏感,必须标准化)scaler=StandardScaler()X_scaled=scaler.fit_transform(X)# 3. 划分数据集X_train,X_test,y_train,y_test=train_test_split(X_scaled,y,test_size=0.3,random_state=42)

3.2 训练与评估

# 1. 创建模型 (RBF 核是默认的)# C 和 gamma 是需要调优的超参数model=SVC(kernel='rbf',C=5,gamma=0.05,random_state=42)# 2. 训练print("开始训练 SVM (这可能会很慢)...")model.fit(X_train,y_train)# 3. 预测与评估print("训练完成,开始评估...")y_pred=model.predict(X_test)acc=accuracy_score(y_test,y_pred)print(f"SVM 在 MNIST 上的准确率:{acc:.3f}")# 结果通常在 0.95 以上,非常强大!

四、非线性分类可视化

让我们看看 SVM 如何处理线性不可分的数据。

fromsklearn.datasetsimportmake_circlesimportnumpyasnpimportmatplotlib.pyplotasplt# 1. 创建环形数据X,y=make_circles(n_samples=100,factor=0.3,noise=0.1)# 2. 训练 SVM (使用 rbf 核)svm=SVC(kernel='rbf').fit(X,y)# 3. 绘制决策边界 (辅助函数)defplot_decision_boundary(model,X,y):h=.02x_min,x_max=X[:,0].min()-.1,X[:,0].max()+.1y_min,y_max=X[:,1].min()-.1,X[:,1].max()+.1xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))Z=model.predict(np.c_[xx.ravel(),yy.ravel()])Z=Z.reshape(xx.shape)plt.contourf(xx,yy,Z,alpha=0.3)plt.scatter(X[:,0],X[:,1],c=y,edgecolors='k')# 4. 可视化plt.figure(figsize=(8,6))plot_decision_boundary(svm,X,y)plt.title("SVM with RBF Kernel")# plt.show()

五、常见问题

Q1:SVM 训练太慢怎么办?

SVM 的计算复杂度较高,尤其是样本量很大时。

  • 数据降维:使用 PCA 等技术减少特征数量。
  • 使用LinearSVC:如果你的数据是线性可分的,或者样本量巨大,LinearSVC专门为大规模线性问题做了优化,比SVC(kernel='linear')快得多。
  • 随机抽样:用一部分数据训练。

Q2:Cgamma怎么选?

这就是所谓的超参数调优 (Hyperparameter Tuning)
通常使用GridSearchCV(网格搜索) 来自动寻找最佳组合。


六、小结

SVM

核心思想

核技巧

超参数

最大化间隔 (Margin)

支持向量 (Support Vectors)

linear (线性)

poly (多项式)

rbf (高斯核 - 推荐)

C (惩罚)

gamma (RBF半径)

关键要点

  1. SVM是一个强大的、基于边界的分类器。
  2. RBF 核让 SVM 能处理复杂的非线性问题。
  3. 标准化调参对 SVM 的性能至关重要。

七、课后作业

  1. Grid Search:使用GridSearchCV在 MNIST 数据上自动搜索最佳的Cgamma值。
  2. 回归问题:使用SVR解决 Day 82 的加州房价预测问题,并与线性回归对比效果。
  3. 可视化对比:在make_circles数据上,分别用kernel='linear'kernel='rbf'训练,对比它们的决策边界,直观感受核技巧的威力。

下节预告

Day 86:机器学习进阶 - K-Means 聚类- 如果数据没有标签怎么办?明天我们学习无监督学习,让机器自己从数据中找出"物以类聚"的规律。


系列导航

  • 上一篇:Day 84 - 决策树与随机森林
  • 下一篇:Day 86 - K-Means聚类(待更新)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 14:11:50

零基础玩转Qwen3-4B:阿里开源大模型保姆级教程

零基础玩转Qwen3-4B:阿里开源大模型保姆级教程 1. 引言:为什么选择 Qwen3-4B-Instruct-2507? 在当前大模型快速演进的背景下,如何在有限算力条件下实现高性能推理成为开发者关注的核心问题。阿里通义实验室推出的 Qwen3-4B-Inst…

作者头像 李华
网站建设 2026/8/23 11:25:52

BGE-M3实战:构建智能问答检索系统

BGE-M3实战:构建智能问答检索系统 1. 引言 在当前信息爆炸的时代,如何从海量文本中快速、准确地检索出用户所需的信息,已成为智能问答系统的核心挑战。传统的关键词匹配方法难以应对语义多样性问题,而近年来兴起的嵌入模型&…

作者头像 李华
网站建设 2026/9/2 21:30:31

Qwen3-Embedding-4B技术分享:多模态应用中的文本嵌入

Qwen3-Embedding-4B技术分享:多模态应用中的文本嵌入 1. 引言:Qwen3-Embedding-4B 的定位与价值 随着大模型在多模态理解、信息检索和语义搜索等场景的广泛应用,高质量的文本嵌入(Text Embedding)能力成为构建智能系…

作者头像 李华
网站建设 2026/9/2 22:18:13

Keil5代码自动补全设置在PLC仿真中的应用实例

Keil5代码自动补全如何让PLC仿真开发快如闪电?在工业自动化现场,你是否见过这样的场景:一位经验丰富的电气工程师熟练地画着梯形图,却对“写代码”三个字望而生畏?传统PLC依赖图形化编程,直观但难扩展&…

作者头像 李华
网站建设 2026/9/2 22:18:41

稳定可靠不宕机!自建识别服务SLA更有保障

稳定可靠不宕机!自建识别服务SLA更有保障 1. 前言:为什么自建识别服务更值得信赖? 在当前AI应用快速落地的背景下,图像识别能力已成为智能内容管理、自动化审核、工业检测等场景的核心支撑。然而,依赖第三方云API的服…

作者头像 李华
网站建设 2026/9/2 22:23:09

快速掌握Mermaid图表制作:让你的技术文档瞬间专业的终极指南

快速掌握Mermaid图表制作:让你的技术文档瞬间专业的终极指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-…

作者头像 李华