用Python实现SVM分类器:从数据到决策边界可视化,以鸢尾花数据集为例

news2025/2/5 5:59:26

前言

在机器学习的世界里,支持向量机(Support Vector Machine,简称SVM)是一种非常强大的分类算法。它通过寻找最优的决策边界,将不同类别的数据分开。本文将通过一个简单的Python代码示例,展示如何使用SVM对数据进行分类,并可视化决策边界和支持向量。

数据准备

为了方便演示,我们使用了经典的鸢尾花(Iris)数据集。这个数据集包含了三种不同种类的鸢尾花,每种花有四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。为了简化问题,我们只取前两个特征(花萼长度和花萼宽度),并且只考虑其中的两类数据(类别0和类别1)。

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只取前两个特征:花萼长度和花萼宽度
y = iris.target

# 只取两类数据(为了简单起见,我们只取类别0和1)
X = X[y != 2]
y = y[y != 2]

数据划分与标准化

接下来,我们将数据集划分为训练集和测试集,其中70%的数据用于训练,30%的数据用于测试。为了确保模型的泛化能力,我们对数据进行了标准化处理,使每个特征的均值为0,标准差为1。

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

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

模型训练

我们使用了sklearn库中的SVC类来创建一个SVM分类器,并选择了线性核函数。然后,我们用训练集数据对模型进行训练。

from sklearn.svm import SVC

clf = SVC(kernel='linear')  # 选择线性核函数
clf.fit(X_train, y_train)

可视化决策边界和支持向量

为了更好地理解模型的工作原理,我们绘制了训练数据点、决策边界以及支持向量。决策边界是SVM模型的核心,它将不同类别的数据分隔开来;而支持向量则是距离决策边界最近的几个数据点,它们对决策边界的位置起到了决定性的作用。

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(8, 6))
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='coolwarm', s=50, edgecolors='k')

ax = plt.gca()
x_min, x_max = ax.get_xlim()
y_min, y_max = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='black')

plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, facecolors='none', edgecolors='k', label='Support Vectors')
plt.title('SVM')
plt.xlabel('Feature 1 (Sepal Length)')
plt.ylabel('Feature 2 (Sepal Width)')
plt.legend()
plt.show()

模型评估

最后,我们用测试集数据对模型进行评估,计算模型的准确率。准确率是衡量模型性能的一个重要指标,它表示模型正确分类的样本数占总样本数的比例。

from sklearn.metrics import accuracy_score

y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"模型在测试集上的准确率: {accuracy:.2f}")

总结

通过上述代码,我们成功地实现了一个简单的SVM分类器,并对模型的决策边界和支持向量进行了可视化。SVM算法在处理线性可分数据时表现出了强大的分类能力。当然,SVM也有其局限性,例如在处理大规模数据集时可能会遇到性能瓶颈。不过,这并不妨碍它在许多实际应用中发挥重要作用。希望本文能帮助你更好地理解和应用SVM算法。


完整代码

# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# 创建一个简单的数据集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只取前两个特征:花萼长度和花萼宽度
y = iris.target

# 只取两类数据(为了简单起见,我们只取类别0和1)
X = X[y != 2]
y = y[y != 2]

# 划分数据集,70%的数据用来训练,30%的数据用来测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建一个SVM分类器
clf = SVC(kernel='linear')  # 选择线性核函数

# 训练模型
clf.fit(X_train, y_train)

# 可视化数据点和决策边界
plt.figure(figsize=(8, 6))

# 绘制训练数据点
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='coolwarm', s=50, edgecolors='k')

# 绘制决策边界
ax = plt.gca()
x_min, x_max = ax.get_xlim()
y_min, y_max = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='black')

# 绘制支持向量
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, facecolors='none', edgecolors='k', label='Support Vectors')

# 显示图形
plt.title('SVM')
plt.xlabel('Feature 1 (Sepal Length)')
plt.ylabel('Feature 2 (Sepal Width)')
plt.legend()
plt.show()

# 预测并评估模型
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"模型在测试集上的准确率: {accuracy:.2f}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2292154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署

前言 自从deepseek R1发布之后「详见《一文速览DeepSeek R1:如何通过纯RL训练大模型的推理能力以比肩甚至超越OpenAI o1(含Kimi K1.5的解读)》」,deepseek便爆火 爆火以后便应了“人红是非多”那句话,不但遭受各种大规模攻击,即便…

Kubernetes学习之包管理工具(Helm)

一、基础知识 1.如果我们需要开发微服务架构的应用,组成应用的服务可能很多,使用原始的组织和管理方式就会非常臃肿和繁琐以及较难管理,此时我们需要一个更高层次的工具将这些配置组织起来。 2.helm架构: chart:一个应用的信息集合…

MyBatis-Plus速成指南:通用枚举 多数据源

通用枚举: 概述: 表中有些字段值是固定的,例如性别(男或女),此时我们可以使用 MyBatis-Plus 的通用枚举来实现 数据库表添加字段: 创建通用枚举类型: Getter public enum SexEnum {MALE(1, "男"…

Android项目中使用Eclipse导出jar文件

2014年3月24日 天气晴朗 关于打包Android组件肯定是有用到的,比如开发了一个模块,为了更好的复用,我们可能会将它打包成jar文件方便其他项目引用。这个很好理解,也很简单。网上有一堆关于用Eclipse将Android项目打包成jar文件的&…

网络安全学习 day4

防火墙的安全策略 规则--策略 条件 --- 检查报文的依据,防火墙将报文中携带的信息与条件逐一进行对比, 以此来判断报文是否是 匹配的 。不同的匹配条件之间属于 “ 与 ” 关系;相同的匹配条件中不同的参数信息之间的关系为 “ 或 ” 关系。…

智慧园区综合管理系统如何实现多个维度的高效管理与安全风险控制

内容概要 在当前快速发展的城市环境中,智慧园区综合管理系统正在成为各类园区管理的重要工具,无论是工业园、产业园、物流园,还是写字楼与公寓,都在积极寻求如何提升管理效率和保障安全。通过快鲸智慧园区管理系统,用…

【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解

一、SIB33信令概述 在5G非地面网络(NTN)中,卫星的高速移动性和广域覆盖特性使得地面设备(UE)需要频繁切换卫星以维持连接。SIB32提供了UE预测当前服务的卫星覆盖信息,SystemInformationBlockType33&#x…

《LLM大语言模型深度探索与实践:构建智能应用的新范式,融合代理与数据库的高级整合》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

【Envi遥感图像处理】010:归一化植被指数NDVI计算方法

文章目录 一、NDVI简介二、NDVI计算方法1. NDVI工具2. 波段运算三、注意事项1. 计算结果为一片黑2. 计算结果超出范围一、NDVI简介 归一化植被指数,是反映农作物长势和营养信息的重要参数之一,应用于遥感影像。NDVI是通过植被在近红外波段(NIR)和红光波段(R)的反射率差异…

优选算法合集————双指针(专题二)

好久都没给大家带来算法专题啦,今天给大家带来滑动窗口专题的训练 题目一:长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …

基于微信小程序的私家车位共享系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

糖化之前,为什么要进行麦芽粉碎?

糖化的目的是将麦芽中的淀粉转化为可发酵性的糖分,而糖化之前,进行麦芽粉碎是确保糖化效果的关键步骤。本文天泰将阐述麦芽粉碎的重要性及其对酿造过程的影响。 一、麦芽粉碎的目的 增加酶的作用面积:麦芽中的淀粉和蛋白质等物质需要通过酶…

PAT甲级1052、Linked LIst Sorting

题目 A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the stru…

半导体器件与物理篇6 MESFET

金属-半导体接触 MESFET与MOSFET的相同点:它们的电压电流特性相似。都有源漏栅三极,强反型,漏极加正向电压,也会经历线性区、夹断点、饱和区三个阶段。 MESFET与MOSFET的不同点:在器件的栅电极部分,MESFE…

deepseek 本地化部署和小模型微调

安装ollama 因为本人gpu卡的机器系统是centos 7, 直接使用ollama会报 所以ollama使用镜像方式进行部署, 拉取镜像ollama/ollama 启动命令 docker run -d --privileged -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 查看ollama 是否启动…

socket实现HTTP请求,参考HttpURLConnection源码解析

背景 有台服务器,网卡绑定有2个ip地址,分别为: A:192.168.111.201 B:192.168.111.202 在这台服务器请求目标地址 C:192.168.111.203 时必须使用B作为源地址才能访问目标地址C,在这台服务器默认…

3、C#基于.net framework的应用开发实战编程 - 实现(三、三) - 编程手把手系列文章...

三、 实现; 三.三、编写应用程序; 此文主要是实现应用的主要编码工作。 1、 分层; 此例子主要分为UI、Helper、DAL等层。UI负责便签的界面显示;Helper主要是链接UI和数据库操作的中间层;DAL为对数据库的操…

Java BIO详解

一、简介 1.1 BIO概述 BIO(Blocking I/O),即同步阻塞IO(传统IO)。 BIO 全称是 Blocking IO,同步阻塞式IO,是JDK1.4之前的传统IO模型,就是传统的 java.io 包下面的代码实现。 服务…

Haproxy+keepalived高可用集群,haproxy宕机的解决方案

Haproxykeepalived高可用集群,允许keepalived宕机,允许后端真实服务器宕机,但是不允许haproxy宕机, 所以下面就是解决方案 keepalived配置高可用检测脚本 ,master和backup都要添加 配置脚本 # vim /etc/keepalived…

98,【6】 buuctf web [ISITDTU 2019]EasyPHP

进入靶场 代码 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;通常用于调试或展示代码&#xff0c;方便用户查看代码逻辑 highlight_file(__FILE__);// 从 GET 请求中获取名为 _ 的参数值&#xff0c;并赋值给变量 $_ // 符号用于抑制可能出现的错误信息&#xff…