AI开发:支持向量机(SVM)鸢尾花模型入门教程- Python 机器学习

最近接触了一些数据分析的任务,越来越多地听到支持向量机(SVM), 之前我们也一起学习过 AI开发:支持向量机(SVM)入门教程- Python 机器学习

今天我们再由浅入深的地来重温和学习这个AI算法,以便我们进一步掌握如何熟悉和使用这一AI大杀器。

SVM用在哪里

 --文本分类

  • 垃圾邮件过滤:通过分析电子邮件的内容和特征,SVM可以将邮件分类为垃圾邮件和非垃圾邮件。
  • 情感分析:根据社交媒体评论、产品评论等文本数据,SVM可以识别出文本的情感倾向(如正面、负面或中立)。

--图像识别

  • 手写数字识别:SVM常用于手写数字识别,如MNIST数据集,用来分类不同的数字。
  • 面部识别:通过提取面部特征,SVM可以识别不同人的面部信息,广泛应用于安全监控和身份验证。

--生物信息学

  • 癌症诊断:SVM用于基因表达数据分类,可以帮助诊断不同类型的癌症。
  • 蛋白质结构预测:SVM被用来预测蛋白质的折叠结构,帮助生物医药研究。

--金融预测

  • 信用评分:SVM可以根据客户的财务历史和信用数据,对其信用进行分类,预测是否有违约风险。
  • 股票市场预测:通过分析历史市场数据,SVM可以预测股票价格的走势,进行买卖决策。

 --医学诊断

  • 疾病分类:SVM被广泛应用于诊断疾病,例如通过分析医学影像或患者的生理数据,帮助医生判断病人是否患有某种疾病。
  • 心电图分析:SVM用于心电图数据的分类,帮助识别异常心脏节律。

--语音识别

  • SVM可以将语音信号进行分类,应用于语音识别系统、语音命令控制等领域。

--图像分类和目标检测

  • 遥感图像分类:SVM可以用于分析卫星或无人机拍摄的图像,进行地面物体的分类(如城市、森林、农田等)。
  • 自动驾驶:SVM被用来分类路面上的物体,如行人、汽车、交通标志等,帮助自动驾驶系统做出决策。

 --欺诈检测

  • 信用卡欺诈:通过分析历史交易数据,SVM可以识别出可能是欺诈行为的交易。

 --推荐系统

  • SVM被用来在基于用户的行为(如浏览、点击等)来预测用户可能感兴趣的物品或服务,从而进行个性化推荐。

现在!让我们通过一个简单又有趣的例子来学习支持向量机(SVM)吧! 

SVM是什么?

支持向量机(SVM)是一种强大的机器学习算法,特别适用于分类问题。想象一下,你在画一张二维平面图,有两种不同的水果,苹果和橙子,你的任务就是画出一条线,把这两类水果分开。这条线就叫做 决策边界。SVM就是用来找出这条最好的“分割线”的。

这里有人可能要问,假设苹果和橙子是混合的,如何划线?

当苹果和橙子混在一起时,SVM可以通过核函数将数据映射到高维空间,找到一个最优的分隔超平面来进行分类。这使得SVM不仅能够处理线性可分的情况,也能够处理非线性可分的复杂问题。

举个例子:

假设我们有两个特征:水果的重量直径。通过这两个特征,我们可以把苹果和橙子分开。SVM会通过以下方式帮助我们:

  1. 找到一条决策边界线,这条线尽量让苹果和橙子不重叠。
  2. 找到离决策边界最近的“支持向量”(就是那些离线最近的点),这些点对决策边界的确定至关重要。

代码示例

我们用Python来实现这个过程。首先,我们需要安装scikit-learn库,这是一个非常常用的机器学习库。

如果你还没有安装,可以通过以下命令安装:

pip install scikit-learn

接下来,我们用一个简单的例子来演示如何使用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# 创建一个简单的数据集
# 这里我们使用sklearn自带的鸢尾花数据集(Iris),用于分类。
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)# 创建一个SVM分类器
clf = SVC(kernel='linear')  # 选择线性核函数(Linear Kernel)# 训练模型
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.title('SVM Linear Kernel Decision Boundary')
plt.xlabel('Feature 1 (Sepal Length)')
plt.ylabel('Feature 2 (Sepal Width)')
plt.show()# 预测并评估模型
y_pred = clf.predict(X_test)
accuracy = np.mean(y_pred == y_test)
print(f"模型在测试集上的准确率: {accuracy:.2f}")

一下子看不懂没关系,我们一步步来讲解和学习理解

代码分解与讲解

我们一步一步地来分析并详细解释这段代码。这个代码演示了如何使用 支持向量机(SVM)Iris 数据集上进行分类。我们用 线性核函数 来构建模型并绘制决策边界。

1. 导入必要的库
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
  • numpy:用于数值计算,提供了数组、矩阵等功能。
  • matplotlib.pyplot:用于绘图和可视化。
  • sklearn.datasets:提供了多种内置数据集,这里我们用的是load_iris()函数加载鸢尾花(Iris)数据集。
  • sklearn.svm.SVC:SVM分类器(支持向量机分类器),我们将用它来训练分类模型。
  • sklearn.model_selection.train_test_split:用于划分训练集和测试集。
2. 加载Iris数据集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 我们只取前两个特征:花萼长度和花萼宽度
y = iris.target
  • datasets.load_iris():加载鸢尾花数据集,它包含150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),分成三类(Iris-setosa, Iris-versicolor, Iris-virginica)。
  • X = iris.data[:, :2]:我们只使用前两个特征(花萼长度和花萼宽度),这样数据就变成了二维数据,方便在平面上进行可视化。
    所以在二维平面上,我们就可以通过一条线来区分两类数据了!
  • y = iris.target:获取目标变量(标签),即样本的类别标签,0代表Iris-setosa,1代表Iris-versicolor,2代表Iris-virginica。
3. 选择两个类别并筛选数据
X = X[y != 2]  # 只取类别0和1
y = y[y != 2]
  • X = X[y != 2]:我们只取类别0和类别1的数据(即鸢尾花的前两类),剔除类别2(Iris-virginica)。
  • y = y[y != 2]:相应地,更新目标变量,去掉类别2。
4. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  • train_test_split:用于将数据集分为训练集和测试集。训练集用于训练模型,测试集用于评估模型。
  • test_size=0.3:设置测试集占数据的30%,剩余的70%用于训练。
  • random_state=42:设置随机种子,确保每次运行时数据集的划分都是一致的,便于调试。
5. 创建SVM分类器
clf = SVC(kernel='linear')  # 选择线性核函数(Linear Kernel)
  • SVC(kernel='linear'):创建一个线性核的支持向量机分类器。kernel='linear'表示我们使用线性核函数来拟合数据。对于线性可分的数据,线性核会找到一个平面将数据分开。
6. 训练模型
clf.fit(X_train, y_train)
  • fit(X_train, y_train):使用训练集数据训练SVM模型。X_train是特征数据,y_train是目标标签。
7. 可视化数据点和决策边界
plt.figure(figsize=(8, 6))# 绘制训练数据点
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='coolwarm', s=50, edgecolors='k')
  • plt.figure(figsize=(8, 6)):创建一个大小为8x6英寸的图形窗口。
  • plt.scatter:绘制散点图。X_train[:, 0]X_train[:, 1]分别表示数据集中的两个特征(花萼长度和花萼宽度)。c=y_train根据目标变量的值(0或1)给数据点上色,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.gca():获取当前坐标轴对象(ax),以便绘制决策边界。
  • ax.get_xlim()ax.get_ylim():获取当前坐标轴的最小和最大x、y值,以确定绘制网格的范围。
  • np.meshgrid():创建一个二维网格,xxyy分别是网格的x坐标和y坐标。
  • clf.decision_function():计算决策函数的值,即分类模型对于每个网格点的输出。np.c_[xx.ravel(), yy.ravel()]将网格点的x和y坐标合并成一个二维数组。
  • plt.contour():绘制等高线图,levels=[0]表示绘制决策边界(决策函数值为0的地方),linewidths=2指定线宽,colors='black'指定决策边界的颜色。
# 显示图形
plt.title('SVM Linear Kernel Decision Boundary')
plt.xlabel('Feature 1 (Sepal Length)')
plt.ylabel('Feature 2 (Sepal Width)')
plt.show()
  • plt.title()plt.xlabel()plt.ylabel():为图形添加标题和轴标签。
  • plt.show():显示图形。
8. 预测并评估模型
y_pred = clf.predict(X_test)
accuracy = np.mean(y_pred == y_test)
print(f"模型在测试集上的准确率: {accuracy:.2f}")
  • clf.predict(X_test):使用训练好的SVM模型对测试集进行预测。
  • np.mean(y_pred == y_test):计算预测结果与真实结果(y_test)之间的准确率。y_pred == y_test是一个布尔数组,表示每个预测是否正确,np.mean()计算布尔数组的平均值,即正确预测的比例。
  • print():输出模型在测试集上的准确率。

调试建议

  1. 检查数据:确保输入数据(X_trainy_trainX_testy_test)的形状和类型是否正确。

    • 可以使用 print(X_train.shape)print(y_train.shape) 查看数据的维度。
  2. 查看SVM模型参数:可以尝试调整SVM模型的参数,比如C(正则化参数)和gamma(核函数的参数),看看如何影响模型表现。

    • 例如:clf = SVC(kernel='linear', C=1, gamma='scale')
  3. 可视化调试:通过 plt.scatter()plt.contour() 可以查看数据分布和决策边界是否符合预期。

  4. 查看支持向量:可以通过 clf.support_ 查看哪些数据点是支持向量,进一步分析模型是如何构建决策边界的。

如果有任何进一步的问题或调试困难,请告诉我!

输出结果

  • 模型会输出测试集的准确率,这表示SVM模型对新数据的分类效果。
  • 图形展示了不同颜色的数据点,分别代表不同的类别(苹果和橙子),以及SVM计算出的决策边界。

结果分析

  • 你会看到,SVM通过训练数据学习出了一条线,这条线尽量让不同类别的数据点分开,离线最近的点(也就是支持向量)对决策边界的确定起了决定性作用。

通过这种方式,SVM可以帮助我们解决分类问题,找到最优的分类边界。如果你对核函数(比如线性核、多项式核、RBF核)感兴趣,可以进一步去学习如何使用不同的核函数来处理更复杂的非线性问题。

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

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

相关文章

Pytorch实战|猴痘病识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms im…

使用pyinstaller打包pyqt的程序,运行后提示ModuleNotFoundError: No module named ‘Ui_main‘

环境:windowpython3.9pyqt6 使用pyqt UI编辑器生成了main.ui ,main.ui编译成了Ui_main.py main.py 使用当前目录下的Ui_main.py。 打包过程没报错,运行报错。 错误如下: 解决方法:pyinstaller -Fw main.py --paths. 使…

Vue2 router相关记录

vue-router 安装与配置 vue2 得用vue-router3 npm i vue-router3vue3 得用vue-router4 建立一个文件夹router index.js import About from "/components/About.vue"; import Home from "/components/Home.vue";const router new VueRouter({routes: …

基于linux下实现的ping程序(C语言)

linux下实现的ping程序 一、设计目的 PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。 课程设…

2024年12月16日Github流行趋势

项目名称:PDFMathTranslate 项目维护者:Byaidu reycn hellofinch Wybxc YadominJinta项目介绍:基于 AI 完整保留排版的 PDF 文档全文双语翻译,支持 Google/DeepL/Ollama/OpenAI 等服务,提供 CLI/GUI/Docker。项目star数…

国标GB28181协议平台Liveweb:搭建建筑工地无线视频联网监控系统方案

随着科技高速发展,视频信号经过数字压缩,通过互联网宽带或者移动4G网络传递,可实现远程视频监控功能。将这一功能运用于施工现场安全管理,势必会大大提高管理效率,提升监管层次。而这些,通过Liveweb监控系统…

Ansible playbook 详解与实战操作

一、概述 playbook 与 ad-hoc 相比,是一种完全不同的运用 ansible 的方式,类似与 saltstack 的 state 状态文件。ad-hoc 无法持久使用,playbook 可以持久使用。 playbook 是由一个或多个 play 组成的列表,play 的主要功能在于将事先归并为一…

电脑玩《刺客信条》时中,遇到找不到d3dx9_42.dll的问题是什么原因?缺失d3dx9_42.dll应该怎么解决呢?下面一起来看看吧!

电脑玩《刺客信条》时,找不到d3dx9_42.dll的原因及解决办法 对于许多热爱《刺客信条》这款游戏的玩家来说,在游戏中遇到找不到d3dx9_42.dll的问题无疑是非常令人头疼的。这一错误不仅会导致游戏无法启动,还可能引发运行过程中的图形错误、卡…

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞(CVE-2017-12629) Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…

Mysql索引类型总结

按照数据结构维度划分: BTree 索引:MySQL 里默认和最常用的索引类型。只有叶子节点存储 value,非叶子节点只有指针和 key。存储引擎 MyISAM 和 InnoDB 实现 BTree 索引都是使用 BTree,但二者实现方式不一样(前面已经介…

中间件 redis安装

redis官网地址:Redis - The Real-time Data Platform 环境 CentOS Linux release 7.9.2009 (Core) java version "17.0.12" 2024-07-16 LTS 1、通过压缩包安装redis 1,远程下载redis压缩包,或去官网下载:Downloads …

台球助教平台系统开发APP和小程序信息收藏功能需求解析(第十二章)

以下是开发台球助教系统客户端(APP,小程序,H5)几端的信息收藏功能的详细需求和功能说明,内容比较详细,可以说是一个教科书式的详细说明了,这套需求说明不仅仅用在我们的台球助教系统程序上&…

freertos入门---堆的概念

freertos入门—堆的概念 堆就是一块空闲的内存。下面举个例子更好的理解堆的概念:   堆是一块空闲的内存,我们可以定义一个数组char heap_buf[1024],可以看到该数组就是一个空闲的内存,我们只需要在它上面实现内存的分配和释放那…

操作系统(17)文件和文件系统

一、文件 定义:文件是数据的有序集合,是用户存储信息于辅存的基本逻辑单位。文件可以是字符流构成的无结构文件,也可以是包含相似记录的结构化文件。 类型: 按性质和用途:系统文件(由系统软件构成的文件&a…

ASP.NET|日常开发中读写TXT文本详解

ASP.NET|日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET|日常开发中…

notepad++快捷键-多行编辑中如何使所有行的光标都向后移动一个单词的长度(每行单词长度不一定一致)

问题:在使用notepad进行多行编辑(多行光标移动一个单词长度)时(将下图由左边变为右边),在使用Ctrl左键拖拽选中多行后,想要将每行的光标向后移动一个单词的长度(每行的单词长度不一样…

【IC】Hybrid Bonding技术

从纳米到埃米,芯片制造商正在竭尽全力缩小电路的尺寸。但面对算力需求的激增,一项涉及更大尺寸(数百或数千纳米)的技术——混合键合(Hybrid Bonding)——将在未来五年内扮演重要角色。近日,IEEE…

洛谷 B3643 图的存储 C语言

题目:https://www.luogu.com.cn/problem/B3643 题目描述 给定一个 n 个顶点 m 条边的无向图。请以邻接矩阵和邻接表的形式输出这一张图。 输入格式 第一行输入两个正整数 n 和 m,表示图的顶点数和边数。 第二行开始,往后 m 行&#xff0…

MATLAB里面,try-catch-end系列语言的含义与用法(含例程)

在 MATLAB 中,try-catch-end 语句用于处理可能会引发错误的代码。它允许你在“尝试”部分执行代码,如果代码执行过程中发生错误,将转到“捕获”部分执行相应的处理。这种错误处理机制可以提高程序的健壮性,避免因小错误导致整个程…

Python练习之列表的使用

(搭配主页知识点) 【练习要求】 针对知识点列表定义、追加、列表元素读取、查找安排的本实例。要求实现:有一个列表,内容是:[21,25,21,23,22,20],记录的是一批学生的年龄请通过列表的功能(方法),对其进行…