当前位置: 首页 > ds >正文

SVM实战:从理论到鸢尾花数据集的分类可视化

SVM实战:从理论到鸢尾花数据集的分类可视化

在机器学习的广阔领域中,支持向量机(Support Vector Machine,SVM)作为一种经典且强大的分类算法,备受瞩目。它凭借独特的思想和卓越的性能,在模式识别、数据分类等诸多领域发挥着重要作用。本文将结合Python代码,通过对鸢尾花数据集的处理,带大家深入了解SVM的工作原理与实战应用。

一、SVM原理概述

SVM的核心目标是在特征空间中找到一个超平面,该超平面能够将不同类别的数据点尽可能清晰地分隔开来,并且使分隔的间隔达到最大。这个超平面可以用一个线性方程表示: w T x + b = 0 w^Tx + b = 0 wTx+b=0,其中 w w w是权重向量,决定了超平面的方向, b b b是偏置项,决定了超平面的位置。

在二维空间中,超平面就是一条直线;在三维空间中,超平面是一个平面;而在更高维度的空间中,超平面是一个具有高维几何特性的决策边界。那些距离超平面最近且恰好位于间隔边界上的数据点,被称为支持向量,它们对超平面的确定起着关键作用,决定了超平面的位置和方向。

SVM的优势在于,它不仅能够处理线性可分的数据,还能通过核函数将低维空间中线性不可分的数据映射到高维空间,使其在高维空间中变得线性可分,从而实现非线性数据的分类。常见的核函数有线性核函数、多项式核函数、径向基函数(RBF)等。

二、代码实现步骤解析

1. 数据读取与预处理

import pandas as pddata = pd.read_csv("iris.csv", header=None)

上述代码使用pandas库的read_csv函数读取鸢尾花数据集。由于数据集中没有表头,所以设置header=None。鸢尾花数据集包含150条记录,每条记录有4个特征和1个类别标签,4个特征分别为花萼长度、花萼宽度、花瓣长度和花瓣宽度,类别标签表示鸢尾花的品种(山鸢尾、杂色鸢尾、维吉尼亚鸢尾)。

2. 原始数据可视化

import matplotlib.pyplot as pltdata1 = data.iloc[:50, :]
data2 = data.iloc[50:, :]
# 原始数据是四维,无法展示,选择两个进行展示
plt.scatter(data1[1], data1[3], marker='+')
plt.scatter(data2[1], data2[3], marker='o')

为了直观地观察数据分布,选取数据集中的部分数据(前50条和后100条),并选择两个特征(花萼宽度和花瓣宽度)进行可视化。通过matplotlib库的scatter函数绘制散点图,可以初步看到不同类别数据点在二维平面上的分布情况。

3. SVM模型训练

from sklearn.svm import SVCX = data.iloc[:, [1, 3]]
y = data.iloc[:, -1]
svm = SVC(kernel='linear', C=float('inf'), random_state=0)
svm.fit(X, y)

从数据集中提取用于训练的特征矩阵X(选取花萼宽度和花瓣宽度两列)和标签向量y。使用sklearn库中的SVC类创建SVM模型,这里设置kernel='linear'表示使用线性核函数,意味着数据在当前二维特征空间中是线性可分的;C=float('inf')表示对分类错误的惩罚力度无穷大,要求模型必须将所有训练数据正确分类;random_state=0用于设置随机种子,保证结果的可重复性。最后调用fit方法对模型进行训练,使模型学习到数据的特征与类别之间的关系。

4. SVM结果可视化

# 参数w[原始数据为二维数组]
w = svm.coef_[0]
# 偏置项[原始数据为一维数组]
b = svm.intercept_[0]import numpy as npx1 = np.linspace(0, 7, 300)  # 在0~7之间产生300个数据
# 超平面方程
x2 = -(w[0] * x1 + b) / w[1]
# 上超平面方程
x3 = (1 - (w[0] * x1 + b)) / w[1]
# 下超平面方程
x4 = (-1 - (w[0] * x1 + b)) / w[1]
# 可视化原始数据,选取1维核3维的数据进行可视化
# plt.scatter(data1[1],data1[3],marker='+',color='b')
# plt.scatter(data2[1],data2[3],marker='o',color='b')
# 可视化超平面
plt.plot(x1, x2, linewidth=2, color='r')
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')
# 进行坐标轴限制
plt.xlim(4, 7)
plt.ylim(0, 5)
# 找到支持向量[二维数组]可视化支持向量
vets = svm.support_vectors_
plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')plt.show()

训练完成后,提取模型的权重向量w和偏置项b,根据超平面方程计算出一系列点的坐标,用于绘制超平面、上超平面和下超平面。通过matplotlibplot函数将这些平面绘制出来,并设置合适的颜色、线宽和线型。同时,提取支持向量,使用scatter函数将其可视化,直观地展示支持向量在分类中的关键作用。最后通过xlimylim函数设置坐标轴的范围,使可视化效果更加美观和清晰。

三、结果分析

从可视化结果可以清晰地看到,SVM模型成功地找到了一个线性超平面,将不同类别的鸢尾花数据点分隔开来。支持向量位于间隔边界上,它们确定了超平面的位置和方向。在这个例子中,由于设置了较大的惩罚参数C,模型对训练数据实现了完美分类,所有数据点都被正确划分到相应的类别区域。

然而,在实际应用中,过高的C值可能导致模型过拟合,即模型在训练数据上表现良好,但在新数据上的泛化能力较差。因此,需要根据具体问题和数据特点,合理调整C值以及选择合适的核函数,以达到更好的分类效果。

四、总结

通过对鸢尾花数据集的SVM分类实战,我们深入了解了SVM的原理、代码实现过程以及结果分析方法。SVM作为一种强大的机器学习算法,在数据分类任务中展现出了优秀的性能和独特的优势。希望本文的内容能够帮助大家更好地理解和应用SVM,在实际的机器学习项目中发挥其价值。在后续的学习和实践中,我们还可以进一步探索不同核函数、参数调整以及SVM在更多复杂数据集上的应用,不断拓展对这一算法的认识和掌握程度。

以上博客从多方面解读了SVM的实战应用。你若觉得某些部分需要补充、修改,或有其他想法,欢迎随时和我说。

这篇博客全面剖析了SVM的实战应用。若你对博客的内容深度、篇幅长度等有新想法,随时和我交流。

http://www.xdnf.cn/news/3791.html

相关文章:

  • skynet中的client.socket库函数详解
  • WebRTC 服务器之Janus架构分析
  • 大模型开发的环节
  • AIGC算力消耗白皮书:Stable Diffusion vs Midjourney的架构成本差异
  • 头歌数据库课程实验(索引与数据库完整性)
  • 从零认识阿里云OSS:云原生对象存储的核心价值
  • 解析机器人 2.0.2 | 支持超过50种短视频平台的链接解析,无水印提取,多功能下载工具
  • 华为OD机试真题——智能驾驶(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • 什么是函数重载?
  • MySQL 空值处理函数对比:IFNULL、COALESCE 和 NULLIF
  • 《Linux macOS :GCC升级方法》
  • 私人医生通过AI分析基因数据,是否有权提前告知癌症风险?
  • 【AI面试准备】XMind拆解业务场景识别AI赋能点
  • QML图像提供器 (Image Provider)
  • 【Ansible自动化运维实战:从Playbook到负载均衡指南】
  • 【算法基础】插入排序算法 - JAVA
  • 怎样增加AI对话的拟人化和增加同理心
  • WEB前端小练习——记事本
  • 先知AIGC超级工场,撬动运营效率新杠杆
  • 在 Trae CN IDE 中配置 Python 3.11的指南
  • Nat. Hum. Behav:大脑“变形记”,注意力错误下的空间认知奇遇
  • 如何解决 403 错误:请求被拒绝,无法连接到服务器
  • 【KWDB 创作者计划】Docker单机环境下KWDB集群快速搭建指南
  • with的用法
  • 家用服务器 Ubuntu 服务器配置与 Cloudflare Tunnel 部署指南
  • 【中间件】brpc_基础_用户态线程上下文
  • 小程序与快应用:中国移动互联网的渐进式革命——卓伊凡的技术演进观
  • JavaScript性能优化实战之调试与性能检测工具
  • KeyPresser 一款自动化按键工具
  • 【c语言】数据在内存中的存储