支持向量机示例--三维可视化

支持向量机(SVM)是最流行的数据分类算法之一,对三维数据和二维数据都有强大的处理能力。在本篇支持向量机示例文章中,我们将使用 Pythonscikit-learn, matplotlib 使用图书馆 三维支持向量机 (SVM)并重点关注如何将结果可视化。

三维空间中的分类边界可能更加复杂,但可视化可以使其更容易理解。让我们看看这个例子,了解 SVM 如何处理三维数据。

서포트 벡트 머신 예제 3차원 포스트 그림
(支持向量机运行结果示例 - 3-D )

了解三维支持向量机 (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 SVC
  • mpl_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)

代码说明:

  1. 生成数据: 分类 函数生成三维数据,以便用 SVM 进行训练。 n_features=3创建三维数据。
  2. 数据分区: 训练测试拆分将训练和测试数据分开。
  3. 创建和训练 SVM 模型: 交换虚电路 类,使用线性核创建 SVM 模型,并在训练数据上对模型进行训练。
  4. 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 的威力。

类似文章