☰
SVM 2D/3D多分类可视化:从决策边界到核函数实战
2026/10/20 14:04:22 网站建设 项目流程

做分类任务的朋友,基本都会绕不开支持向量机(SVM)。它虽然不像深度网络那样动不动跑几个小时的训练,但靠着“间隔最大化”和“核技巧”这两板斧,在中小规模数据集上依然非常能打。这两年我陆陆续续做了不少分类相关的实战,其中最常被问到的一个问题是:SVM 做多分类,到底怎么直观地理解它学到的边界?怎么做出好看又有解释力的 2D、3D 可视化图?

这篇博文就围绕“SVM 2D/3D 多分类案例与可视化”展开,我先把方案设计思路捋清楚,再给出完整的训练代码和可视化代码,最后把我踩过的坑和排查经验一并整理出来。内容覆盖从原理到实操、从二维决策边界到三维超平面的完整链路,适合刚接触机器学习、想弄懂 SVM 多分类原理的入门读者,也适合需要快速产出演示实验的从业者。

1. 案例设计思路:数据、工具与多分类策略取舍

1.1 核心需求拆解

拿到“SVM 2D/3D 多分类案例与可视化”这个需求,我先不急着写代码,而是拆成三个问题。

第一个问题:数据从哪里来。2D 可视化需要数据本身只有两个特征,这样横轴纵轴分别对应一个特征,画出来的决策区域才直观。3D 可视化需要三个特征,才能在三维空间里展示点云和超平面。真实数据集大多是高维的,直接拿来可视化效果很差,所以最稳的思路是使用生成数据。我用的是 scikit-learn 自带的make_blobs和make_classification,可以精确控制类别数、样本量、簇间距离和噪声,这对于演示 SVM 行为非常有帮助。

第二个问题:多分类怎么做。SVM 天生是二分类器,多分类必须靠“拆”。常用方案有三类:一对多(One-vs-Rest,OVR)、一对一(One-vs-One,OVO)和直接优化多分类目标。工程上最常见的就是前两种,我后面会详细对比。

第三个问题:可视化到底要画什么。2D 场景下,决策边界是一条条曲线或折线,把平面划分成几个区域;3D 场景下,决策边界是曲面,把空间划分成几块区域。可视化的本质不是“画得好看”,而是把模型学到的分类规则直观地摆出来,方便发现过拟合、欠拟合、边界混乱等问题。

1.2 方案选型与工具链

工欲善其事,必先利其器。这个案例的核心工具链非常轻量:

  • scikit-learn:提供SVC、数据生成、标准化、模型评估等全部能力。
  • matplotlib:负责 2D 和 3D 绘图。2D 用contourf填充等高线,3D 用plot_surface或带透明度的scatter。
  • numpy:处理网格生成、数据重塑等底层计算。

这套方案选型的理由很简单:scikit-learn 的 SVM 实现稳定、接口统一、文档完善,而且内置了 OVR 和 OVO 的完整支持;matplotlib 是 Python 绘图的默认选择,虽然 3D 交互性不如 plotly,但胜在随处可用、输出静态图清晰,适合写博文和做实验记录。

从工程实践的角度,我不建议在这个案例中引入重量级框架,也不建议用 torch 或 tensorflow 手写 SVM 优化。这个需求的核心在于“理解、演示、复用”,轻量方案效率最高。

1.3 多分类策略:OVR 和 OVO 的取舍

SVM 多分类最常见的是这两种策略,它们的原理和取舍很关键。

一对多(OVR)的思路是:如果有 K 个类别,就训练 K 个二分类器,每个分类器负责区分“这个类别”和“其余所有类别”。预测时,K 个分类器各自输出一个置信度,置信度最高的那个类别胜出。优点是分类器数量少,训练速度快;缺点是每个分类器都面对一个“正样本少、负样本非常多”的不平衡问题,并且不同分类器的得分不容易直接比较。

一对一(OVO)的思路是:K 个类别两两组合,共训练 K*(K-1)/2 个二分类器,每个分类器只负责区分其中两个类别。预测时用投票法,得票最多的类别胜出。优点是每个分类器任务简单、训练数据平衡;缺点是类别多时分类器数量呈平方级增长。

scikit-learn 的SVC底层使用的就是 OVO 策略,而LinearSVC使用 OVR。很多人不知道这个差异,导致在对比实验结果时产生困惑。例如同样是 5 分类任务,SVC实际训练了 10 个二分类器,LinearSVC只训练了 5 个,两者的决策边界和预测耗时自然不同。

我的建议是:优先用SVC作为演示和案例的主力模型,因为它支持核函数,兼顾线性与非线性场景,适合用来画 2D/3D 决策边界。LinearSVC留给高维稀疏特征场景使用。

2. SVM 多分类原理速通:先弄懂边界,再谈可视化

2.1 支持向量机的核心思想

想理解 2D 决策边界图上的那些曲线和区域,首先得知道 SVM 在找什么。

对于二分类问题,SVM 要找的是一个超平面,把所有正样本和负样本分开,并且让这个超平面离两类样本都尽可能远。在二维平面上,超平面退化成一条直线;在三维空间中,超平面是一个平面。所谓“支持向量”,就是距离这个超平面最近的那些样本点。算法本质上只关心这些支持向量,其他离边界很远的样本不管有多少,都不影响最终模型。这也是 SVM 相比其他分类器的一大特点:决策边界只由少数关键样本决定,泛化能力和鲁棒性都很好。

当数据线性不可分时,SVM 引入“软间隔”概念,允许少量样本越过边界,并用惩罚参数C控制“容错程度”。C越大,模型越不能容忍分类错误,可能导致过拟合;C越小,边界越宽松,可能出现欠拟合。这个参数在后面的可视化作图中影响非常直观。

2.2 核函数:如何从 2D 到 3D 再到高维

SVM 最漂亮的地方是核技巧。真实数据往往是线性不可分的,但把它们映射到高维空间后,就可能变得线性可分。核函数的作用是:不用真的做高维映射,直接在原空间计算高维空间中的内积,既省计算量,又能达到非线性分类效果。

常见核函数有三个层次:

  • 线性核:不映射,适合本身就线性可分的数据。
  • 多项式核:引入多项式组合,适合有一定交互特征的数据。
  • 高斯径向基核(RBF):本质上是把样本映射到无穷维空间,是最常用的默认选择,对非线性边界拟合能力强。

RBF 核有两个关键参数:C和gamma。gamma控制单个样本的影响半径,gamma越大,每个样本影响的区域越小,边界越弯曲,容易过拟合;gamma越小,边界越平滑,容易欠拟合。理解这两个参数的配合,是读懂后续 2D/3D 可视化图形的钥匙。

2.3 多分类的可视化到底展示了什么

很多人会误以为 2D 多分类决策边界图是“整个 SVM 多分类模型的完整表达”,其实不是。

SVM 多分类是由多个二分类器组合而成的。SVC采用 OVO 策略时,可视化代码在执行预测时,已经把多个二分类器的投票结果合并成了最终类别。因此决策边界图表示的其实是“投票结果按类别划分的区域”,而不是某个特定超平面。更严谨的做法是分别画出每个二分类器的边界,但那样图会非常杂乱,实际演示中通常直接展示最终的类别区域。

搞清楚这一点,再看图就有经验了:图上颜色区域是模型的最终分类规则;区域边缘是决策边界;贴边界的散点往往就是支持向量或靠近边界的难例;图中如果出现细碎的“孤岛”或锯齿状区域,基本可以判断是gamma或C设置不当造成的过拟合。

3. 2D 多分类案例:从数据生成到决策边界可视化

3.1 构造 2D 多分类数据集

2D 案例我选择生成 4 类样本,每类 150 个,一共 600 个样本。使用make_blobs的好处是可以通过cluster_std控制每簇的离散程度,通过centers自行指定中心点分布。

import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC X, y = make_blobs( n_samples=600, centers=4, n_features=2, cluster_std=0.8, random_state=42 ) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42 )

这里random_state固定为 42,保证每次运行结果一致,方便复现。cluster_std=0.8是我反复试下来比较合适的一组值:簇间距离明显、边界处有少量重叠,既能展示 SVM 的软间隔能力,又不至于让分类器完全混乱。

接下来是关键的一步:标准化。

scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test)

这一步不是可有可无的。SVM 对特征尺度极其敏感:如果一个特征数值范围是另一个特征的几十倍,那么在计算距离时,大数值特征会完全主导结果。标准化把每个特征缩放到均值为 0、标准差为 1 的分布,各特征在距离计算中的地位才平等。我见过很多初学者跳过这步,结果画出的决策边界完全倾斜,训练集准确率很高但测试集表现很差,原因就是特征尺度失衡。

3.2 训练 SVM 多分类模型

模型部分代码如下:

svm = SVC(kernel='rbf', C=10, gamma='scale', decision_function_shape='ovo') svm.fit(X_train_scaled, y_train) train_acc = svm.score(X_train_scaled, y_train) test_acc = svm.score(X_test_scaled, y_test) print(f"训练集准确率: {train_acc:.4f}") print(f"测试集准确率: {test_acc:.4f}")

这里我选 RBF 核,gamma='scale'表示根据特征数量自动计算 gamma 值,默认是1 / (n_features * X.var())。2D 数据集只有两个特征,scale模式下的 gamma 会偏小,边界相对平滑,比较适合展示基本的多分类效果。

C=10属于中等强度惩罚。如果C太小,比如 0.01,决策边界会过于宽松,出现大量误分类区域;如果C太大,比如 1000,一个离群点都可能被单独圈成一个区域,边界变得非常崎岖。10 是一个经验安全值,不会让图太难看不至于脱离实际。

有一点需要提醒:在较新版本的 scikit-learn 中,decision_function_shape参数已不建议显式指定,SVC默认就是 OVO,多分类内部自动处理投票。旧代码里写decision_function_shape='ovo'是当时为了兼容性,现在直接省略即可。

3.3 画 2D 决策边界

2D 决策边界可视化的核心思路是:在特征平面上均匀采样大量点,用训练好的模型预测这些点的类别,然后把类别填充到网格中,形成“色块地图”。

from matplotlib.colors import ListedColormap x_min, x_max = X_train_scaled[:, 0].min() - 0.5, X_train_scaled[:, 0].max() + 0.5 y_min, y_max = X_train_scaled[:, 1].min() - 0.5, X_train_scaled[:, 1].max() + 0.5 xx, yy = np.meshgrid( np.linspace(x_min, x_max, 300), np.linspace(y_min, y_max, 300) ) Z = svm.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) colors = ['#4C72B0', '#DD8452', '#55A868', '#C44E52'] cmap = ListedColormap(colors) plt.figure(figsize=(8, 6)) plt.contourf(xx, yy, Z, levels=len(np.unique(y)) - 1, alpha=0.6, cmap=cmap) plt.scatter( X_train_scaled[:, 0], X_train_scaled[:, 1], c=y_train, cmap=cmap, edgecolors='k', s=40 ) plt.xlabel("Feature 1 (standardized)") plt.ylabel("Feature 2 (standardized)") plt.title("SVM 2D Multi-class Decision Boundary (RBF)") plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.show()

这段代码里有几个细节值得琢磨。

np.linspace生成 300 个等距点,网格密度决定决策边界的精细程度。300 这个数量在 2D 场景下不会太慢,边界也比较平滑。如果网格太稀,比如 50,边界会出现明显的锯齿;太密则计算时间增加但视觉差异不大。

np.c_[xx.ravel(), yy.ravel()]把网格坐标堆叠成二维数组,每一行是一个待预测点,shape 是(90000, 2)。预测完成后,把结果reshape回xx的 shape,才能正确填入等高线图中。

contourf的levels参数我设置成len(np.unique(y)) - 1。len(np.unique(y))是类别数,4 类样本需要 3 个层级来分隔 4 个填充区间。这里折腾过一次:最开始我直接省略levels,matplotlib 默认使用 10 个层级,结果决策区域被分割成很多条颜色带,看起来完全不像分类图,反而像地形等高线。这是一个非常典型的可视化翻车现场。

运行上述代码,你会看到四块颜色区域相对清晰地分开,每块区域内部的训练样本颜色一致,区域之间有明显的交界线。交界线的形状取决于 RBF 核的超参数:gamma越大交界越弯曲,C越大交界越精细。

4. 3D 多分类案例:超平面与空间区域可视化

4.1 三维数据集的构造与标准化

3D 案例我选择生成 3 类样本,每类 200 个,共 600 个。三维数据的核心价值在于多了一个特征维度,模型要学的是“空间超平面”而不是“平面曲线”。

X_3d, y_3d = make_blobs( n_samples=600, centers=3, n_features=3, cluster_std=1.0, random_state=7 ) X_3d_train, X_3d_test, y_3d_train, y_3d_test = train_test_split( X_3d, y_3d, test_size=0.3, random_state=42 ) scaler_3d = StandardScaler() X_3d_train_scaled = scaler_3d.fit_transform(X_3d_train) X_3d_test_scaled = scaler_3d.transform(X_3d_test) svm_3d = SVC(kernel='rbf', C=10, gamma='scale') svm_3d.fit(X_3d_train_scaled, y_3d_train) print("3D Train Acc:", svm_3d.score(X_3d_train_scaled, y_3d_train).round(4)) print("3D Test Acc:", svm_3d.score(X_3d_test_scaled, y_3d_test).round(4))

三维场景下的 RBF 核会自动调整 gamma,因为n_features=3,同样的gamma='scale'会得到比 2D 场景稍大的 gamma 值,决策曲面因此更有弹性。cluster_std=1.0让三簇数据在空间中有适量交叠,既能体现分类难度,又不至于让准确率过低。

4.2 散点式 3D 类别展示

3D 可视化最简单直观的展示方式是三维散点图,每个类别一种颜色。先画出原始训练样本的空间分布:

from mpl_toolkits.mplot3d import Axes3D fig = plt.figure(figsize=(10, 7)) ax = fig.add_subplot(111, projection='3d') cmap_3d = ListedColormap(['#4C72B0', '#DD8452', '#55A868']) ax.scatter( X_3d_train_scaled[:, 0], X_3d_train_scaled[:, 1], X_3d_train_scaled[:, 2], c=y_3d_train, cmap=cmap_3d, s=30, alpha=0.8 ) ax.set_xlabel("Feature 1") ax.set_ylabel("Feature 2") ax.set_zlabel("Feature 3") ax.view_init(elev=20, azim=45) plt.show()

三维散点图的重点在于视角。初始视角是固定东偏 45 度、仰角 20 度,这种视角通常能同时看到三个坐标轴的分布,但某些簇可能被前面的点挡住。我一般会在静态图输出后手动旋转几次,找到最清晰的视角再保存。如果想探查数据内部结构,可以临时把alpha调低到 0.4 左右,点变透明后能隐约看到被遮挡的簇。

4.3 用体素或曲面近似三维决策区域

真正困难的是把三维决策边界画出来。matplotlib 没有直接画“分类超平面集合”的原生函数,需要自己想办法。

我尝试过两条路线:第一条路线是用plot_surface分别画每个二分类超平面,但多分类 OVO 策略下超平面数量是 K*(K-1)/2,画出来会乱成一团麻线,排布极其密集,阅读价值很低。

第二条路线是等间距采样三维网格,把每个网格点送入模型预测,再用scatter以低透明度画出预测类别。这样得到的图是所有预测点的“气场区域”,颜色分布越均匀,代表模型分类越稳定。

x_min, x_max = X_3d_train_scaled[:, 0].min() - 0.5, X_3d_train_scaled[:, 0].max() + 0.5 y_min, y_max = X_3d_train_scaled[:, 1].min() - 0.5, X_3d_train_scaled[:, 1].max() + 0.5 z_min, z_max = X_3d_train_scaled[:, 2].min() - 0.5, X_3d_train_scaled[:, 2].max() + 0.5 xx_3d, yy_3d, zz_3d = np.meshgrid( np.linspace(x_min, x_max, 20), np.linspace(y_min, y_max, 20), np.linspace(z_min, z_max, 20) ) grid_points = np.c_[ xx_3d.ravel(), yy_3d.ravel(), zz_3d.ravel() ] grid_pred = svm_3d.predict(grid_points) fig = plt.figure(figsize=(10, 7)) ax = fig.add_subplot(111, projection='3d') ax.scatter( grid_points[:, 0], grid_points[:, 1], grid_points[:, 2], c=grid_pred, cmap=cmap_3d, alpha=0.15, s=10 ) ax.scatter( X_3d_train_scaled[:, 0], X_3d_train_scaled[:, 1], X_3d_train_scaled[:, 2], c=y_3d_train, cmap=cmap_3d, edgecolors='k', s=40 ) ax.set_xlabel("Feature 1") ax.set_ylabel("Feature 2") ax.set_zlabel("Feature 3") ax.view_init(elev=20, azim=45) plt.show()

这里的关键参数是网格密度。np.linspace(..., 20)代表每个维度取 20 个点,总网格点是20^3 = 8000个,预测速度和绘图压力都可以接受。网格密度如果降到 10,决策区域会非常粗糙;升到 50,总点数达到 12.5 万,绘图会卡顿明显,静态图还会因点过多而开成一片“色块浓汤”。

alpha=0.15是这条路线最核心的经验值。网格点透明度太高则看不见决策区域,透明度太低则完全盖住原始散点。0.15 能在保留类别区域的同时显示出原始样本的位置。

5. 踩坑实录:这些问题我替你先试过了

5.1 特征尺度不一致导致边界“一边倒”

这是整个案例中我遇到最多的问题,没有之一。

有一次我用原始未标准化的数据进行训练,二维可视化时发现决策边界几乎完全由特征 1 决定:特征 2 的数值范围只有特征 1 的零头,SVM 在计算距离时几乎忽略了特征 2,导致边界照片般整齐地垂直于特征 1 轴,分类结果看起来像“拍脑袋切了一刀”。

排查过程一点都不复杂:我先把两个特征的min、max、std打印出来,一眼就发现了量级差距,然后加上StandardScaler重新训练,决策边界立刻恢复正常,测试集准确率也从 0.72 提升到 0.94。

这个教训的普适性很强:任何基于距离或内积的模型,都必须先标准化。线性回归可以不做标准化因为系数能自动适配,但 SVM、KNN、神经网络这些基于距离计算的模型不做标准化,基本等于白训。

5.2 混淆矩阵显示准确率虚高

只看准确率很容易被迷惑。有一次我训练完 4 分类模型,测试集准确率达到了 0.96,看起来非常完美,但当我把混淆矩阵打出来一看,某个类别有一批样本被大量错分为另一个类别,只是这两类的样本数量占比较小,掩盖了问题。

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay cm = confusion_matrix(y_test, svm.predict(X_test_scaled)) disp = ConfusionMatrixDisplay(confusion_matrix=cm) disp.plot(cmap='Blues') plt.show()

做多分类案例,我建议至少看一眼混淆矩阵,不要只报准确率。在 SVM 可视化实验中,混淆矩阵还能直接帮助你定位 2D 图中某个颜色区域异常的原因。

5.3 3D 网格采样导致内存溢出

第一次做 3D 可视化时,我把网格设置成np.linspace(x_min, x_max, 50),每个维度 50 个点,总网格点数是50^3 = 125000个。预测本身还好,但当我用scatter绘制时,12.5 万个点加上原始数据点,图像数据量巨大,交互旋转时卡顿到几乎无法操作。

后来的处理方案就是 20 个点。如果想要更精细的效果,可以分两次画:第一次用 20 的网格画底层区域,第二次用 30 的网格只画靠近边界的局部细节,叠加在同一张图上。这比一次性拉满网格密度要平滑得多。

5.4 matplotlib 3D 可视化遮挡问题

3D 散点图的遮挡问题是固有缺陷:后面的点会被前面的点遮住,导致空间分布判断失误。

一个很实用的小技巧是调整alpha和视角。视角上,我习惯先固定elev=20保证从上往下略带俯视,再在azim=0到360之间循环旋转,每转 45 度保存一张图,最后挑最清晰的一张。透明度上,原始样本点用alpha=0.8,网格预测点用alpha=0.15,两者对比层次感拉满。

如果想要完全解决遮挡问题,建议上交互式可视化工具。后续我会单独展开讲。

5.5 过拟合边界的识别

SVM 的决策边界可视化是判断过拟合最好的“照妖镜”。

有一次我把gamma调到了 10,C调到 1000,结果 2D 图中的决策边界出现了很多闭合的“小岛”:某些孤立样本点被模型单独圈成一个区域,看起来像一张长了疱疹的地图。训练集准确率高达 0.99,但测试集准确率掉到 0.81。

正常情况下,RBF-SVM 的决策边界应该呈现平滑的曲线或带状过渡。如果边界出现大量细碎拐点、独立闭环、锯齿状凸起,基本可以断定gamma或C过高。可视化在这里不只是锦上添花,而是名副其实的调试工具。

我把这些坑整理成一张速查表,方便大家随手翻阅:

问题现象根本原因推荐解法
边界“一边倒”特征尺度差异大训练前使用StandardScaler
准确率高但分类混乱类别不均衡设置class_weight='balanced',查看混淆矩阵
3D 图卡顿网格点过多将网格密度降到 20 左右
边界出现“孤岛”gamma/C过大降低gamma或C,重新观察可视化
3D 点被遮挡视角与透明度不佳多角度旋转,样本点高透明度、网格点低透明度

6. 可视化进阶:交互式 3D 与决策置信度输出

6.1 用交互式 3D 解决旋转问题

matplotlib 的 3D 图在 Jupyter 中虽然可以旋转,但静态导出后无法互动。如果想要更体面的演示效果,可以切换到 plotly 的Scatter3d,它能直接输出可拖拽旋转的 HTML 文件,发在博客里读者也能自行探索。

import plotly.graph_objects as go fig = go.Figure() fig.add_trace( go.Scatter3d( x=grid_points[:, 0], y=grid_points[:, 1], z=grid_points[:, 2], mode='markers', marker=dict( size=2, color=grid_pred, colorscale='Viridis', opacity=0.2 ), name='Decision Region' ) )

plotly 的优势不止是旋转。数据量大时,它支持 WebGL 渲染,几万个点也能流畅拖动。代价是需要额外安装依赖,产出的是 HTML/JS 文件,并不适合所有场景。我的经验是:Jupyter 里临时探索用 matplotlib,正式演示和分享用 plotly。

6.2 可视化的同时输出决策置信度

最后分享一个能显著提升案例质量的扩展方向:不要只输出最终类别,还要输出每个类别的置信度。

SVC本身不直接给出概率,需要开启probability=True,训练完后使用predict_proba获得每个类别的概率分布。这需要一个额外的交叉验证步骤来表示概率校准,所以训练时间会变长。但对小型演示数据集来说,这个代价完全可接受。

svm_prob = SVC(kernel='rbf', C=10, gamma='scale', probability=True) svm_prob.fit(X_train_scaled, y_train) prob = svm_prob.predict_proba(X_test_scaled[:10]) print(prob.round(3))

输出结果形如:

[[0.002 0.993 0.004 0.001] [0.971 0.018 0.006 0.005] ... ]

每一行代表一个样本,每一列代表属于某个类别的概率。置信度输出能让可视化结论更有说服力:你不仅看到某个区域被划分为类别 A,还能知道模型在边界区域附近的置信度有多低。这是从“画个图”上升到“讲清楚模型行为”的关键一步。

我在实际做多分类可视化时,最喜欢的做法是把置信度叠加到 2D 图中:在边界附近的样本点上,用颜色深浅代表概率大小,会发现边界带的颜色普遍偏浅,这正是模型“犹豫”的区域,对解释支持向量的分布非常有价值。

个人经验与小结

回头看我做 SVM 2D/3D 多分类可视化这套流程,最有感触的一点是:可视化的价值不在于好看,而在于让模型的行为变得可解释、可调试。2D 的决策边界让我快速理解 RBF 核的C和gamma是如何影响模型复杂度的;3D 的空间点云让我直观看出多分类器的决策临界在哪里,哪些地方是模型容易犯错的重灾区。

两步建议送给正在实操的朋友:第一步,先用 2D 数据把整个流程跑通,确认模型、标准化、预测、画图这条链路没有问题,再把数据换成 3D。这样调试成本最低。第二步,不要只盯着准确率,把 2D 决策边界图或 3D 分类点云图打印出来,用“看图说话”的方式去解释 SVM 的分类规则,这比单纯报一个数字更能让你理解模型到底学会了什么。

如果你正在做一个真实项目的多分类演示,或者需要向团队解释 SVM 的分类逻辑,这个案例完全可以拿过去复用:数据生成的参数改一改、类别数改一改、标准化和训练代码保持不变,可视化部分把画布尺寸和颜色列表调一下,就能输出一套与你的数据场景完全契合的 2D/3D 决策边界图。后续想继续深入的话,还可以把高斯过程的概率输出加进来,或者用 PCA 把高维特征先降维到三维再画图,思路都是互通的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询