基于SVM的鸢尾花数据集回归分析

目录

  • 1. 作者介绍
  • 2. SVM支持向量机算法
    • 2.1 鸢尾花数据集
    • 2.2 鸢尾花数据集可视化
      • 2.2.1 散点图
      • 2.2.2 箱型图
      • 2.2.3 三维散点图(3D)
  • 3. SVM算法实现
    • 3.1 完整代码
    • 3.2 运行结果
    • 3.3 问题与分析

1. 作者介绍

张佳伦,男,西安工程大学电子信息学院,2022级研究生
研究方向:机器视觉与人工智能
电子邮件:1091418175@qq.com

陈梦丹,女,西安工程大学电子信息学院,2022级硕士研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:1169738496@qq.com

2. SVM支持向量机算法

支持向量机(Support Vector Machine, SVM),其决策边界是对学习样本求解的最大边距超平面。

图(1)为决策边界与支持向量。
在这里插入图片描述

图(2)为软间隔与硬间隔
在这里插入图片描述
SVM可以通过核技巧(kernel Trick)进行非线性分类,是常见的核学习(kernel learning)方法之一。
在这里插入图片描述
常见的核函数:

Rbf高斯核函数:
在这里插入图片描述
Sigmoid核函数:
在这里插入图片描述

2.1 鸢尾花数据集

在这里插入图片描述
利用.info()查看数据集的整体信息,可以查看到数据集的标签种类以及对应的标签名称与标签个数。

# 使用.info()查看数据的整体信息
iris_features.info()

在这里插入图片描述
利用.value_counts()查看数据集样本的种类,可以查看到数据集对应样本种类的编号和对应样本个数。
在这里插入图片描述

2.2 鸢尾花数据集可视化

2.2.1 散点图

合并标签和特征信息,将数据集的标签特征与样本种类结合起来进行二维的可视化分布。如鸢尾花数据集有四个特征标签以及三种样本种类,将三种样本种类分布,分别映射到对应的二维特征坐标中。且当坐标对应为同一纬度时,及可视各个样本在本纬度对应的分布数量。可以在各个纬度的二维组合下观察到每个样本的特征分布。

# 合并标签和特征信息
iris_all = iris_features.copy() ##进行浅拷贝,防止对于原始数据的修改
iris_all['target'] = iris_target
sns.pairplot(data=iris_all,diag_kind='hist', hue= 'target')  # 特征与标签组合的散点可视化
plt.show()

在这里插入图片描述

2.2.2 箱型图

箱线图是针对单个特征纬度的样本种类分布,通过箱线图即可方便的观察到数据集在某个单一特征下,样本种类的一维特征分布以及各个样本种类之间的可分离度。

for col in iris_features.columns:
    sns.boxplot(x='target', y=col, saturation=0.5,palette='pastel', data=iris_all)
    plt.title(col)
plt.show()

在这里插入图片描述

2.2.3 三维散点图(3D)

选取其三个特征绘制三维散点图。根据选中的三个纬度的特征即可对数据集中的样本种类进行三维建模。通过改变选中的三个特征,和根据箱线图的单一纬度特征的样本可分离度,可以在不同的特征纬度下对数据集进行3D建模,并得到分离度最高的3D建模结果。

# 选取其前三个特征绘制三维散点图
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')
iris_all_class0 = iris_all[iris_all['target']==0].values
iris_all_class1 = iris_all[iris_all['target']==1].values
iris_all_class2 = iris_all[iris_all['target']==2].values
# 'setosa'(0), 'versicolor'(1), 'virginica'(2)
ax.scatter(iris_all_class0[:,0], iris_all_class0[:,1], iris_all_class0[:,2],label='setosa')
ax.scatter(iris_all_class1[:,0], iris_all_class1[:,1], iris_all_class1[:,2],label='versicolor')
ax.scatter(iris_all_class2[:,0], iris_all_class2[:,1], iris_all_class2[:,2],label='virginica')
plt.legend()
plt.show()

在这里插入图片描述

3. SVM算法实现

3.1 完整代码

import numpy as np
import pandas as pd
import pylab
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
from sklearn.svm import SVC
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.axes._axes import _log as matplotlib_axes_logger
matplotlib_axes_logger.setLevel('ERROR')
from sklearn.datasets import load_iris

data = load_iris() # 得到数据特征
iris_target = data.target # 得到数据对应的标签
iris_features = pd.DataFrame(data=data.data, columns=data.feature_names) # 利用Pandas转化为DataFrame格式

iris_features.info()

pd.Series(iris_target).value_counts()

#### 数据可视化 ####
# 散点图
# 合并标签和特征信息
iris_all = iris_features.copy() ##进行浅拷贝,防止对于原始数据的修改
iris_all['target'] = iris_target
sns.pairplot(data=iris_all,diag_kind='hist', hue= 'target')  # 特征与标签组合的散点可视化
plt.show()

# 箱型图
for col in iris_features.columns:
    sns.boxplot(x='target', y=col, saturation=0.5,palette='pastel', data=iris_all)
    plt.title(col)
plt.show()

# 选取其前三个特征绘制三维散点图
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')
iris_all_class0 = iris_all[iris_all['target']==0].values
iris_all_class1 = iris_all[iris_all['target']==1].values
iris_all_class2 = iris_all[iris_all['target']==2].values
# 'setosa'(0), 'versicolor'(1), 'virginica'(2)
ax.scatter(iris_all_class0[:,0], iris_all_class0[:,1], iris_all_class0[:,2],label='setosa')
ax.scatter(iris_all_class1[:,0], iris_all_class1[:,1], iris_all_class1[:,2],label='versicolor')
ax.scatter(iris_all_class2[:,0], iris_all_class2[:,1], iris_all_class2[:,2],label='virginica')
plt.legend()
plt.show()

iris=datasets.load_iris()
a,b=0,2
X_reduced = iris.data[:,:4]
X = X_reduced[:,[a,b]]        #二维可视化,即只取两个属性
y = iris.target     #由上述程序结果可知取值为0,1,2
x_min,x_max = X[:,0].min()-.5, X[:,0].max()+.5   #x值的最小值和最大值分别是第一列最小值和最大值-5和+5
y_min,y_max = X[:,1].min()-.5, X[:,1].max()+.5   #y值的最小值和最大值分别是第二列最小值和最大值-5和+5
plt.figure(2,figsize=(8,6))
plt.clf
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.Set1,edgecolor='w')  #绘制散点图,c即color,cmap是将y不同的值画出不同颜色,edgecolor为白色
plt.xlabel(iris.feature_names[a])
plt.ylabel(iris.feature_names[b])
plt.xlim(x_min,x_max)    #x轴的作图范围
plt.ylim(y_min,y_max)    #x轴的作图范围
plt.xticks(())     #x轴的刻度内容的范围
plt.yticks(())    #y轴的刻度内容的范围

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=0)
sc = StandardScaler()
sc.fit(X_train)  #调用训练集训练
X_train_std = sc.transform(X_train)
X_test_std: object = sc.transform(X_test)

def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                           np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim = (xx2.min(), xx2.max())
    X_test, y_test = X[test_idx, :], y[test_idx]
    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=cl)
    if test_idx:
        X_test, y_test = X[test_idx, :], y[test_idx]
        plt.scatter(X_test[:, 0], X_test[:, 1],c='black', alpha=0.8, linewidths=1, marker='o', s=10, label='test set')
        
# 调整2*2图像大小比例
plt.figure(2,figsize=(10,8))

pylab.subplot(2, 2, 1)   # 子图像为2*2的第一个
X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))
svm = SVC(kernel='linear', random_state=0, C=1.0)  # 调用SVM核函数,’linear’核函数,以及两个超参数
svm.fit(X_train_std, y_train)   # 训练
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105,150))
plt.ylabel(iris.feature_names[b])
plt.title('Linear')

pylab.subplot(2, 2, 2)
X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))
svm = SVC(kernel='poly',random_state=0, degree=2, gamma=0.3, C=100)
# 调用SVM核函数,’poly’以及四个参数,多项式核函数专属的超参数d
svm.fit(X_train_std, y_train)  #训练
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105,150))
plt.title('poly')

pylab.subplot(2, 2, 3)
X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))
svm = SVC(kernel='rbf', random_state=0, gamma=0.9, C=1.5)
svm.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105,150))
plt.ylabel(iris.feature_names[b])
plt.xlabel(iris.feature_names[a])
plt.title('rbf')

pylab.subplot(2, 2, 4)
X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))
svm = SVC(kernel='sigmoid', random_state=0, gamma=0.3, C=50)
svm.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105,150))
plt.xlabel(iris.feature_names[a])
plt.title('sigmoid')

plt.show()

3.2 运行结果

在SVM分类中,将特征标签设置为变量,通过改变标签变量可以得到不同纬度的样本种类的二维特征分布,再通过四种不同的SVM核函数,对其进行分类比较,最后调整超参数得到最好的分类核函数和分类结果。

特征0:2二维特征分布图在这里插入图片描述相关参数设置:
Linear : c=1
Poly : degree=2,gamma=0.3,c=100
Rbf : gamma=0.9, c=1.5
Sigmoid : gamma=0.3, c=50.0

特征0:2 经四种不同的SVM核函数处理结果图
在这里插入图片描述
特征0:3 二维特征分布图
在这里插入图片描述
相关参数设置:
Linear : c=1
Poly : degree=3,gamma=0.7,c=10
Rbf : gamma=0.9, c=1.5
Sigmoid : gamma=0.2, c=2.5

特征0:3 经四种不同的SVM核函数处理结果图
在这里插入图片描述
特征0:1 二维特征分布图
在这里插入图片描述相关参数设置:
Linear : c=1
Poly : degree=2,gamma=0.8,c=10
Rbf : gamma=0.9, c=1.5
Sigmoid : gamma=0.3, c=1.0

特征0:1 经四种不同的SVM核函数处理结果图在这里插入图片描述
特征1:2 二维分布图
在这里插入图片描述
相关参数设置:
Linear : c=1
Poly : degree=3, gamma=0.7, c=5
Rbf : gamma=0.9, c=1.5
Sigmoid : gamma=0.2, c=2.5

特征1:2 经四种不同的SVM核函数处理结果图
在这里插入图片描述
特征1:3 二维特征分布图
在这里插入图片描述
相关参数设置:
Linear : c=1
Poly : degree=3, gamma=0.9, c=1.5
Rbf : gamma=0.9,c=10
Sigmoid : gamma=0.2,c=2.5

特征1:3 经四种不同的SVM核函数处理结果图
在这里插入图片描述
特征2:3 二维特征分布图
在这里插入图片描述
相关参数设置:
Linear : c=1
Poly : degree=3, gamma=0.9, c=3
Rbf : gamma=0.9,c=50
Sigmoid : gamma=0.5,c=5

特征2:3 经四种不同的SVM核函数处理结果图
在这里插入图片描述

3.3 问题与分析

(1)特征超出标签数字索引,应为[0,1,2,3]。
在这里插入图片描述
(2)图像排版中,pylab.subplot(2,2,2):第一个2为行数,第二个2为列数,第三个为子图的顺序故如上图程序应更为pylab.subplot(1,4,…)
在这里插入图片描述
(3)在选取核函数是应注意核函数的简化名称,不应写错(注意首字母大小写)
在这里插入图片描述
(4)在运行降维图像时,更改维度特征会报错,但图依然可以更改出来。为了消除报错,在每次运行完后更改维度特征时,需要重新启动Python核
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cuda | Cudnn安装及其配置

文章目录 👉引言💎一、Cuda安装1 选择Cuda版本2下载及运行安装程序3 测试 二、Cudnn安装1、进入官网下载对应cuda版本的cudnn2、下载好相应版本并进行解压安装3、解压完成后4、测试 👉引言💎 学习的最大理由是想摆脱平庸&#xf…

stable diffusion图片资源分享和模型推荐,好用的模型有哪些呢?

前言 这篇文章主要是分享我的图片和推荐一些好用的模型,模型不在多在于精,基于几个好的大模型适当下载一下LORA模型,就能画出非常好的图片,多话不说 图片分享 简单展示 详情请看:https://space.bilibili.com/109890…

Linux基础篇 Ubuntu 22.04的环境安装-02

目录 一、资料的获取 二、安装虚拟机 三、安装Ubuntu过程 四、注意事项 一、资料的获取 1.通过官方网站下载 Ubuntu系统下载 | Ubuntuhttps://cn.ubuntu.com/download2.下载桌面板即可 3.选择下载的版本 二、安装虚拟机 1.创建新的虚拟机 2.选择自定义安装 3.硬件兼容性选…

Es elasticsearch 十九 kibana 可视化配置图表 及功能 集群部署

目录 Es kibana 可视化 下载zip 解压 bin/kibana.bat 启动 管理索引管理 吧logstash 存进来的数据 按照 xxx-* 方式 保存索引模式 通过 discove 配置可视化界面 图表数据实时刷新 时序图配置 饼图配置 表格数据配置 添加仪表盘 图表样例 使用后模拟绘制方法好看些 …

pandas数据预处理

pandas数据预处理 pandas及其数据结构pandas简介Series数据结构及其创建DataFrame数据结构及其创建 利用pandas导入导出数据导入外部数据导入数据文件 导出外部数据导出数据文件 数据概览及预处理数据概览分析利用DataFrame的常用属性利用DataFrame的常用方法 数据清洗缺失值处…

什么是Odoo ERP:部署方式、业务集成、成本投入、发展与未来

ERP部署的类型 如何部署ERP 系统?通过多年的发展,ERP系统的部署方式更加多样化,包括公有云或私有云部署、本地部署或整合不同环境的混合部署场景,企业可根据自身条件与应用场景加以选择。下面介绍了每种部署模式的主要优势&#…

动态规划-硬币排成线

动态规划-硬币排成线 1 描述2 样例2.1 样例 1:2.2 样例 2:2.3 样例 3: 3 算法解题思路及实现3.1 算法解题分析3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件和边界情况3.1.4 计算顺序 3.2 算法实现3.2.1 动态规划常规实现3.2.2 动态规划滚动数组 该题是lintcode的第394题&#x…

在简历上写了“精通”后,我差点被面试官问到窒息....

前言 如果有真才实学,写个精通可以让面试官眼前一亮! 如果是瞎写?基本就要被狠狠地虐一把里! 最近在面试,我现在十分后悔在简历上写了“精通”二字… 先给大家看看我简历上的技能列表: 熟悉软件测试理…

基于相位共轭法的散射聚焦成像研究-Matlab代码

▒▒本文目录▒▒ 一、引言二、相位共轭法散射聚焦成像Matlab仿真三、参考文献四、Matlab程序开发与实验指导 一、引言 一直以来,研究人员致力于分析造成散射的原因、随机介质性质以及各种散射光的特征,并且研究透过散射介质成像。1990年,I.…

基于VMD-SSA-LSTM的多维时序光伏功率预测

目录 1 主要内容 变分模态分解(VMD) 麻雀搜索算法SSA 长短期记忆网络LSTM 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了预测的程序基于LSTM的负荷和可再生能源出力预测【核心部分复现】,该程序预测效果比较好,并且结构比较清晰&#x…

新能源汽车充电桩的建设及优化分析

安科瑞虞佳豪 新能源汽车充电桩在经历了几年的发展之后,总体情况是在持续走好的,并且充电桩的建设相较于以往有了很大的普及度和安全度,这对新能源汽车车主是一个好事,也鼓励了更多人选择买新能源汽车,但这并不是说新…

如何通过控制点或地物点生产地方坐标系的倾斜摄影三维模型数据?

如何通过控制点或地物点生产地方坐标系的倾斜摄影三维模型数据? 要生成地方坐标系的倾斜摄影三维模型数据,需要进行以下步骤: 1、收集影像数据 首先需要采集大量的航空影像和地面影像,以构建真实世界中的物体模型。这些影像可以…

一文让你明白软件测试该怎样入门?

我认为入门软件测试需要四个方面的知识or技能,它们是:业务知识、职业素养、基础知识、技术知识。 职业素养是一切的根基,因为人在职场就必须拥有必要的职业素养,软件测试工程师也不例外。基础知识和技术知识是两大支柱&#xff0…

使用外部工具横向移动

Smbexe、Psexec Psexec PsExec是一种轻巧的telnet代替品,可让您在其他系统上执行进程,并为控制台应用提供完整的交互性,无需手动安装客户端软件。 原理: 1、ipc$连接,释放Psexesvc.exe 2、OpenSCManager打开受害者…

不甘做小弟,JS时间对象又在搞事情!(上)

关注“大前端私房菜”微信公众号,回复暗号【面试宝典】即可免费领取107页前端面试题。 Date Date 是 js 的一个内置对象,也叫内置构造函数。提供了一堆的方法帮助我们更方便的操作时间 创建时间对象:new Date() 获取时间对象:ne…

Flask-蓝图

1、使用步骤&#xff1a; 创建蓝图 blue Blueprint("myblue01", __name__) 使用蓝图装饰视图函数 blue.route(/) def index():return index 将蓝图注册到app中 from appdemo_blueprint import blue app.register_blueprint(blue) 2、以包的形式使用蓝图 <…

Java版企业电子招标采购系统源代码Spring Boot + 二次开发 + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

2023年4月和5月随笔

1. 回头看 为了不耽误学系列更新&#xff0c;4月随笔合并到5月。 日更坚持了151天&#xff0c;精读完《SQL进阶教程》&#xff0c;学系统集成项目管理工程师&#xff08;中项&#xff09;系列更新完成。 4月和5月两月码字114991字&#xff0c;日均码字数1885字&#xff0c;累…

如何将完成的报告从 FastReport .NET 导出到 S3

FastReport .NET 报表生成器FastReport .NET是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;MVC和Windows窗体的全功能报告库。使用FastReport .NET&#xff0c;您可以创建独立于应用程序的.NET报告。 简单存储服务是一种用于存储大量数据的服务。该服务将存储的数据划分…

解决spark程序 Permission denied: user=<username>, access=WRITE...等常见hive权限报错

Permission Denied Permission Denied: 这是最常见的错误消息之一&#xff0c;表示当前用户没有足够的权限执行写入操作。报错信息可能类似于&#xff1a; org.apache.hadoop.security.AccessControlException: Permission denied: user<username>, accessWRITE, inode&…