使用Python可视化支持向量机SVM

 更新时间:2024年11月03日 11:19:20   作者:python收藏家  
支持向量机是用于分类和回归任务的强大监督学习模型,本文我们将探索使用Python和流行的库(如scikit-learn和Matplotlib)可视化SVM,有需要的可以了解下

支持向量机(SVM)是用于分类和回归任务的强大监督学习模型。它们受欢迎背后的一个关键因素是它们有效处理线性和非线性数据的能力。在本文中,我们将探索使用Python和流行的库(如scikit-learn和Matplotlib)可视化SVM。

支持向量机(SVM)

支持向量机的工作原理是找到最佳的超平面,最好地分离特征空间中的类。选择超平面以使边缘最大化,边缘是超平面与每个类的最近数据点之间的距离,称为支持向量。这个超平面是通过求解一个优化问题来确定的,该优化问题的目标是最小化分类误差,同时最大化间隔。

SVM可以通过使用不同的核函数(如线性、多项式、径向基函数(RBF)和sigmoid核)来用于线性和非线性分类任务。这些内核允许支持向量机通过将原始特征空间映射到更高维的空间来处理非线性决策边界,其中类变得可分离。

可视化线性SVM

让我们首先使用Iris数据集可视化一个简单的线性SVM。我们将使用Scikit-Learn生成数据并训练SVM模型。然后,我们将绘制决策边界和支持向量,以了解模型如何分离类。

导入必要的库并加载数据集

该数据集包含三种鸢尾花的萼片和花瓣尺寸的测量值。在这里,只有前两个特征(萼片长度和宽度)被保留用于可视化目的。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.svm import SVC
iris = datasets.load_iris()
X = iris.data[:, :2]  # Only first two features for visualization
y = iris.target

基于线性核的SVM训练

在Iris数据集上训练具有线性核的SVM模型。线性核适用于线性可分数据,旨在找到分离不同类别的最佳超平面。

# Train SVM with linear kernel
clf_linear = SVC(kernel='linear')
clf_linear.fit(X, y)

创建决策边界

创建网格以覆盖特征空间。这允许生成用于可视化目的的点。SVM模型的决策边界将绘制在此网格上。

# Create a mesh to plot decision boundaries
h = 0.02  # step size in the mesh
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))

线性支持向量机决策边界的绘制

绘制了具有线性核的SVM的决策边界。这是通过使用predict方法预测 网格上所有点的类标签来实现的。然后使用填充轮廓图(plt.contourf)可视化决策边界,并将原始数据点覆盖在图上以供参考。

# Plot decision boundary of Linear SVM
Z_linear = clf_linear.predict(np.c_[xx.ravel(), yy.ravel()])
Z_linear = Z_linear.reshape(xx.shape)
plt.contourf(xx, yy, Z_linear, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.title('Linear SVM')
plt.xlabel('Sepal Length')
plt.ylabel('Sepal Width')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.show()

在上面的可视化中,线性SVM以线性方式对数据点进行分类。尽管准确度不是很高,我们可以清楚地看到红色部分有大量错误分类的数据点,但这就是非线性svm的用武之地。

可视化非线性SVM

SVM还可以通过使用核函数来处理非线性决策边界。让我们使用具有多项式内核的相同Iris数据集来可视化非线性SVM。

理解γ参数对RBF核函数的影响

在可视化非线性支持向量机之前,让我们来探讨一下RBF核中γ参数的影响。

γ参数显著影响RBF核在SVM中的行为。它本质上决定了单个数据点对决策边界的影响。

  • 较低的γ值会导致每个数据点的影响更大,从而导致更平滑的决策边界。
  • 相反,较高的γ值会缩小数据点的影响,从而创建更复杂且可能过度拟合的决策边界。

定义γ值

定义了一个名为gamma_values的列表,包含γ超参数的不同值,控制单个训练示例的影响。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.svm import SVC
iris = datasets.load_iris()
X = iris.data[:, :2]  # Only first two features for visualization
y = iris.target

gamma_values = [0.1, 1, 10, 50, 100, 200]

为每个γ值绘制决策边界

将创建一个大小为20×10英寸的图形,以容纳每个γ值的子图。代码迭代gamma_values列表中的每个γ值。对于每个γ值,使用指定的γ值训练具有RBF核的SVM模型。

在循环内部,创建一个meshgrid来覆盖特征空间,允许生成用于可视化目的的点。网格定义为步长为0.02。

对于每个γ值,绘制具有RBF核的SVM的决策边界。这是通过使用predict方法预测 网格上所有点的类标签来实现的。

然后使用填充轮廓图(plt.contourf)可视化决策边界。原始数据点覆盖在图上以供参考,颜色对应于其各自的类别标签。

# Plot decision boundaries for each gamma value
plt.figure(figsize=(20, 10))
for i, gamma in enumerate(gamma_values, 1):
    # Train SVM with RBF kernel
    clf_rbf = SVC(kernel='rbf', gamma=gamma)
    clf_rbf.fit(X, y)

    # Create a mesh to plot decision boundaries
    h = 0.02  # step size in the mesh
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))

    # Plot decision boundary
    plt.subplot(2, 3, i)
    Z_rbf = clf_rbf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z_rbf = Z_rbf.reshape(xx.shape)
    plt.contourf(xx, yy, Z_rbf, cmap=plt.cm.Paired, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
    plt.title(f'RBF SVM (Gamma={gamma})')
    plt.xlabel('Sepal Length')
    plt.ylabel('Sepal Width')
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())

plt.tight_layout()
plt.show()

在上面的可视化中,γ值显然对模型的准确性和复杂性有很大影响。

我们选择了6个不同的γ值,因此我们有6个不同的可视化,γ值越高,准确度越高,这就是为什么在γ值为200的可视化中,我们的模型几乎完美地分类了数据点。

但是当我们选择γ值为50的模型时,它与线性SVM的结果非常相似,准确性也不是很高。

结论

总之,支持向量机(SVM)是线性和非线性分类任务的强大模型。可视化支持向量机,特别是使用不同的内核和超参数,可以提供对其行为和性能的有价值的见解。

到此这篇关于使用Python可视化支持向量机SVM的文章就介绍到这了,更多相关Python可视化支持向量机SVM内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PyQt5 控件字体样式等设置的实现

    PyQt5 控件字体样式等设置的实现

    这篇文章主要介绍了PyQt5 控件字体样式等设置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • python程序封装为win32服务的方法

    python程序封装为win32服务的方法

    这篇文章主要为大家详细介绍了python程序封装为win32服务的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Python爬取门户论坛评论浅谈Python未来发展方向

    Python爬取门户论坛评论浅谈Python未来发展方向

    这篇文章主要介绍了如何实现Python爬取门户论坛评论,附含图片示例代码,讲解了详细的操作过程,有需要的的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09
  • 在 Python 中创建DataFrame的方法

    在 Python 中创建DataFrame的方法

    这篇文章主要介绍了教你如何在 Python 中创建DataFrame,我们将学习以多种方式创建DataFrame,DataFrame是数据的二维集合,是一种数据结构,其中数据以表格形式存储,更多相关资料需要的小伙伴可以参考一下
    2022-03-03
  • 在Python的Flask框架中使用日期和时间的教程

    在Python的Flask框架中使用日期和时间的教程

    这篇文章主要介绍了在Python的Flask框架中使用日期和时间的教程,包括对各个时区之间转换的一些处理,需要的朋友可以参考下
    2015-04-04
  • 详解Python中高阶函数(map,filter,reduce,sorted)的使用

    详解Python中高阶函数(map,filter,reduce,sorted)的使用

    高阶函数就是能够把函数当成参数传递的函数就是高阶函数,换句话说如果一个函数的参数是函数,那么这个函数就是一个高阶函数。本文为大家详细讲解了Python中常用的四个高阶函数,感兴趣的可以了解一下
    2022-04-04
  • 利用Python制作动态排名图的实现代码

    利用Python制作动态排名图的实现代码

    这篇文章主要介绍了利用Python制作动态排名图的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • python搜索指定类型文件以及批量移动文件程序详解

    python搜索指定类型文件以及批量移动文件程序详解

    这篇文章主要给大家介绍了关于python搜索指定类型文件以及批量移动文件程序的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • KMP算法精解及其Python版的代码示例

    KMP算法精解及其Python版的代码示例

    KMP算法基本上被人们用作字符串的匹配操作,这里我们就来介绍KMP算法精解及其Python版的代码示例,需要的朋友可以参考下
    2016-06-06
  • 极简的Python入门指引

    极简的Python入门指引

    这篇文章是一个极简的Python入门指引、原文在网络上人气相当高,将一些基本知识用实例代码说明,需要的朋友可以参考下
    2015-04-04

最新评论