支持向量机示例--三维可视化
支持向量机(SVM)是最流行的数据分类算法之一,对三维数据和二维数据都有强大的处理能力。在本篇支持向量机示例文章中,我们将使用 Python和 scikit-learn, matplotlib 使用图书馆 三维支持向量机 (SVM)并重点关注如何将结果可视化。
三维空间中的分类边界可能更加复杂,但可视化可以使其更容易理解。让我们看看这个例子,了解 SVM 如何处理三维数据。

了解三维支持向量机 (SVM)
SVM是一种算法,它能找到将数据分为两类的最佳边界(超平面)。在三维空间中,这个超平面显示为一个平面,将数据划分为不同的类别。在本例中,我们将使用具有三个特征的数据对三维分类边界进行可视化。
逐步编写 Python 代码
1. 导入所需的库
首先,加载生成三维数据和实现 SVM 所需的库。
将 numpy 导入 np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 三维可视化模块
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVCmpl_toolkits.mplot3d.Axes3D绘制 3D 图形需要该模块。交换虚电路:scikit-learn公司提供的支持向量机(SVM)分类器。
2. 创建样本数据
接下来,生成三维数据来训练 SVM。
# 生成具有三个特征的三维数据
X, y = datasets.make_classification(n_samples=100, n_features=3, n_informative=3, n_redundant=0, random_state=42)
# 将数据分别用于训练和测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)n_samples=100:生成 100 个样本。n_features=3设置:将每个样本设置为 3 个特征。n_informative=3这三个特征都是分类的重要信息。
3. 创建并训练 SVM 模型
使用创建的数据训练 SVM 模型。
为 # 3D 数据创建 SVM 模型
model = SVC(kernel='linear')
训练 # 模型
model.fit(X_train, y_train)内核='线性使用线性核查找数据之间的分类界限。
4. 可视化 SVM 3D 结果
现在,您可以将训练好的 SVM 模型结果输出到 3D 可视化在三维空间中,分类边界呈现为一个平面。
# 用于可视化训练有素的 SVM 模型的三维分类边界的函数
def plot_3d_decision_boundary(X, y, model):
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
在三维空间中绘制 # 数据点
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap='coolwarm', s=60, edgecolours='k')
设置 # 边界可视化网格
xlim = (X[:, 0].min(), X[:, 0].max())
ylim = (X[:, 1].min(), X[:, 1].max())
zlim = (X[:, 2].min(), X[:, 2].max())
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 30)、完整的集成代码
以下是三维支持向量机 (SVM) 模型的完整代码,并附有注释。
将 numpy 导入 np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 用于绘制三维图形的模块
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# 1. 生成三维数据
# 生成 100 个具有 3 个特征的样本。
# n_informative=3:只使用 3 个重要特征,n_redundant=0:无冗余特征
X, y = datasets.make_classification(n_samples=100, n_features=3, n_informative=3、
n_redundant=0, random_state=42)
# 2.将数据集分为训练集和测试集
# 使用 701 TP3T 数据进行训练,使用 301 TP3T 数据进行测试。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. 生成 SVM 模型
使用 # 线性内核创建 SVM 模型。
model = SVC(kernel='linear')
# 4. 训练模型
使用 # 训练数据训练 SVM 模型。
model.fit(X_train, y_train)
# 5.定义三维可视化函数
def plot_3d_decision_boundary(X, y, model):
# 为三维图形生成一个绘图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 5.1 可视化数据点
# 在三维空间中显示数据,并根据每个类别进行颜色编码。
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap='coolwarm', s=60, edgecolours='k')
# 5.2 为边界可视化设置网格
xlim = (X[:, 0].min(), X[:, 0].max())
ylim = (X[:, 1].min(), X[:, 1].max())
zlim = (X[:, 2].min(), X[:, 2].max())
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 30), np.linspace(ylim[0], ylim[1], 30))
# 5.3 计算决策边界平面
使用 # 线性 SVM 的权重和截距定义边界平面。
# 模型的 coef_ 代表晶体边界平面的斜率。
Z = (-model.coef_[0][0] * xx - model.coef_[0][1] * yy - model.intercept_)/model.coef_[0][2]
# 5.4 可视化晶体边界平面
ax.plot_surface(xx, yy, Z, color='green', alpha=0.3)
# 5.5 设置轴标签
ax.set_xlabel("Feature 1")
ax.set_ylabel("Feature 2")
ax.set_zlabel("Feature 3")
ax.set_title("SVM 3D 判定边界")
# 5.6 显示图表
plt.show()
# 6.使用测试数据直观显示 SVM 决策边界
plot_3d_decision_boundary(X_test, y_test, model)代码说明:
- 生成数据:
分类函数生成三维数据,以便用 SVM 进行训练。n_features=3创建三维数据。 - 数据分区:
训练测试拆分将训练和测试数据分开。 - 创建和训练 SVM 模型:
交换虚电路类,使用线性核创建 SVM 模型,并在训练数据上对模型进行训练。 - 3D 可视化:
mpl_toolkits.mplot3d.Axes3D模块来实现三维可视化,并将 SVM 训练出的分类边界平面可视化。ax.plot_surface用函数可视化 SVM 的决策边界平面。
常见问题(FAQ)
问题 1: SVM 的决策边界在三维数据中是如何显示的?
A1. 在三维数据中,SVM 的决策边界是一个平面。该平面将两个类别分开,SVM 通过最大化该平面与最近数据点(支持向量)的距离来学习。
问题 2 什么是内核函数?
A2. 核函数是帮助 SVM 将数据转换到更高维度空间的函数,这样 SVM 就可以线性分离非线性数据。 在本例中,我们将使用线性核 (线形),但还有许多其他内核可用,包括 RBF 内核、多项式内核等。
Q3. coef_和 拦截_是?
A3. coef_是 SVM 中代表决策边界斜率的值、 拦截_表示晶体边界的截距。通过这两个值可以定义分类边界(平面)。
问题 4: 除了三维数据,我还能将更高维度的数据可视化吗?
您最多可以将三个维度的数据可视化,但不能超过四个维度。 不过,SVM 在处理高维数据时非常强大。在处理高维数据时,可以使用降维技术(如 PCA)将其可视化。
问题 5: SVM 能否用于对非线性数据进行分类?
答 5: 是的,SVM 可以使用非线性核(如 RBF 核或多项式核)对非线性数据进行分类。即使是复杂的数据分布,也可以使用核方法进行有效分类。
总结
在这篇文章中,我们学习了如何使用 Python 实现三维支持向量机 (SVM) 并将结果可视化。 可视化的结果让我们直观地了解了 SVM 如何设置分类边界并从三维数据中学习。
将 SVM 应用于真实世界的数据,并通过使用不同的核函数或高维数据进一步探索 SVM 的威力。





