基于BP神经网络对鸢尾花数据集分类

目录

  • 1. 作者介绍
  • 2. 关于理论方面的知识介绍
    • 2.1 BP神经网络原理
    • 2.2 BP神经网络结构
  • 3. 关于实验过程的介绍,完整实验代码,测试结果
    • 3.1 鸢尾花数据集介绍
    • 3.2 代码演示
    • 3.3 结果演示
  • 4. 问题与分析

1. 作者介绍

侯硕,男,西安工程大学电子信息学院,2023级研究生
研究方向:机器视觉与人工智能
电子邮件:1302088912@qq.com

徐达,男,西安工程大学电子信息学院,2023级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:1374455905@qq.com

2. 关于理论方面的知识介绍

2.1 BP神经网络原理

BP神经网络是一种基于误差反向传播算法的人工神经网络,是应用最广泛的神经网络。可以用来解决分类、回归、模式识别、数据挖掘等多种问题。
它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。BP神经网络由输入层、隐含层和输出层组成,其中隐含层可以包含多个神经元。
在这里插入图片描述

2.2 BP神经网络结构

BP神经网络的训练过程包括前向传播和反向传播两个步骤。
前向传播是将输入数据传递到网络的输入层,每个输入变量对应一个输入神经元,
输入数据经过输入层的加权和非线性变换,传递到网络下一层,直到数据传递到网络的输出层,计算出网络的输出结果。将输出结果与实际标签进行比较,计算误差。
反向传播是将输出结果与实际标签之间的误差传递回网络,计算误差值。根据误差值和链式法则,从输出层向输入层逐层计算每个神经元的梯度,根据得到的梯度信息,调整每个神经元的权重和偏置,以降低误差值,并提高网络的精度。
通过一次正向传播和一次反向传播,我们就可以将网络的参数更新一次,不断地更新网络的参数,最终使网络能够逼近真实的关系。

3. 关于实验过程的介绍,完整实验代码,测试结果

3.1 鸢尾花数据集介绍

鸢尾花数据集: 包含 3 类分别为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica),共 150 条数据,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,通常可以通过这4个特征预测鸢尾花卉属于哪一品种。

from sklearn.datasets import load_iris
iris_dataset = load_iris()

输入上述两行代码就可以下载鸢尾花数据集
在这里插入图片描述
上述表中150是数据集中数据的总条数;4是特征值的类别数,即花萼长度、花萼宽度、花瓣长度、花瓣宽度;setosa、versicolor、virginica:三种鸢尾花名。
从第二行开始各列数据的意义:第一列为花萼长度值;第二列为花萼宽度值;第三列为花瓣长度值;第四列为花瓣宽度值;第五列对应是种类。
在这里插入图片描述
需要安装上述软件库

3.2 代码演示

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号无法显示的问题
from pandas.plotting import radviz# 初始化参数
def initialize_parameters(n_x, n_h, n_y):np.random.seed(2)w1 = np.random.randn(n_h, n_x) * np.sqrt(2 / n_x)w2 = np.random.randn(n_y, n_h) * np.sqrt(2 / n_h)b1 = np.zeros((n_h, 1))b2 = np.zeros((n_y, 1))parameters = {'w1': w1, 'b1': b1, 'w2': w2, 'b2': b2}return parameters# 将X和参数进行前向传播计算,得到预测值和缓存的中间结果
def forward_propagation(X, parameters):w1, b1, w2, b2 = parameters['w1'], parameters['b1'], parameters['w2'], parameters['b2']z1 = np.dot(w1, X) + b1a1 = np.tanh(z1)z2 = np.dot(w2, a1) + b2a2 = 1 / (1 + np.exp(-z2))cache = {'z1': z1, 'a1': a1, 'z2': z2, 'a2': a2}return a2, cache# 计算代价函数
def compute_cost(a2, Y, parameters, lambd=0.3):m = Y.shape[1]log_probs = np.multiply(np.log(a2), Y) + np.multiply((1 - Y), np.log(1 - a2))cross_entropy_cost = - np.sum(log_probs) / mw1, w2 = parameters['w1'], parameters['w2']l2_regularization_cost = (lambd / (2 * m)) * (np.sum(np.square(w1)) + np.sum(np.square(w2)))cost = cross_entropy_cost + l2_regularization_costreturn cost# 反向传播(计算神经网络的梯度值)
def backward_propagation(parameters, cache, X, Y, lambd=0.3):m = Y.shape[1]w1, w2, a1, a2 = parameters['w1'], parameters['w2'], cache['a1'], cache['a2']dz2 = a2 - Ydw2 = np.dot(dz2, a1.T) / m + (lambd / m) * w2db2 = np.mean(dz2, axis=1, keepdims=True)dz1 = np.dot(w2.T, dz2) * (1 - np.power(a1, 2))dw1 = np.dot(dz1, X.T) / m + (lambd / m) * w1db1 = np.mean(dz1, axis=1, keepdims=True)grads = {'dw1': dw1, 'db1': db1, 'dw2': dw2, 'db2': db2}return grads#更新参数
def update_parameters_with_adam(parameters, grads, learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8):w1, b1, w2, b2 = parameters.values()dw1, db1, dw2, db2 = grads.values()vdW1, vdW2 = np.zeros_like(w1), np.zeros_like(w2)sdW1, sdW2 = np.zeros_like(w1), np.zeros_like(w2)vdb1, vdb2 = np.zeros_like(b1), np.zeros_like(b2)sdb1, sdb2 = np.zeros_like(b1), np.zeros_like(b2)vdW1 = beta1 * vdW1 + (1 - beta1) * dw1vdb1 = beta1 * vdb1 + (1 - beta1) * db1vdW2 = beta1 * vdW2 + (1 - beta1) * dw2vdb2 = beta1 * vdb2 + (1 - beta1) * db2sdW1 = beta2 * sdW1 + (1 - beta2) * np.square(dw1)sdb1 = beta2 * sdb1 + (1 - beta2) * np.square(db1)sdW2 = beta2 * sdW2 + (1 - beta2) * np.square(dw2)sdb2 = beta2 * sdb2 + (1 - beta2) * np.square(db2)w1 -= (learning_rate * vdW1) / (np.sqrt(sdW1) + epsilon)b1 -= (learning_rate * vdb1) / (np.sqrt(sdb1) + epsilon)w2 -= (learning_rate * vdW2) / (np.sqrt(sdW2) + epsilon)b2 -= (learning_rate * vdb2) / (np.sqrt(sdb2) + epsilon)parameters = {'w1': w1, 'b1': b1, 'w2': w2, 'b2': b2}return parametersdef predict(parameters, x_test, y_test):w1 = parameters['w1']b1 = parameters['b1']w2 = parameters['w2']b2 = parameters['b2']z1 = np.dot(w1, x_test) + b1a1 = np.tanh(z1)z2 = np.dot(w2, a1) + b2a2 = 1 / (1 + np.exp(-z2))output = np.where(a2 > 0.5, 1, 0)print('预测结果:')print(output)print("\n")print('真实结果:')print(y_test)accuracy = np.mean(np.all(output == y_test, axis=0)) * 100print('准确率:%.2f%%' % accuracy)return outputdef nn_model(X, Y, n_h, n_input, n_output, num_iterations=10000, print_cost=False):np.random.seed(3)n_x = n_inputn_y = n_outputparameters = initialize_parameters(n_x, n_h, n_y)cost_history = []for i in range(1, num_iterations + 1):a2, cache = forward_propagation(X, parameters)cost = compute_cost(a2, Y, parameters)grads = backward_propagation(parameters, cache, X, Y)parameters = update_parameters_with_adam(parameters, grads)if i % 100 == 0:cost_history.append(cost)if print_cost and i % 1000 == 0:print('迭代第%i次     代价函数:%f' % (i, cost))print("-----------------------------------------------")return parameters, print_cost, cost_historydef plot_cost_history(cost_history):plt.figure('代价函数')plt.plot(cost_history)plt.title('Cost Function')plt.xlabel('Iterations (per 100)')plt.ylabel('Cost')plt.show()def result_visualization(x_test, y_test, result):cols = y_test.shape[1]y = []pre = []labels = ['setosa', 'versicolor', 'virginica']y = [labels[np.argmax(y_test[:, i])] for i in range(y_test.shape[1])]pre = [labels[np.argmax(result[:, i])] if np.max(result[:, i]) > 0.5 else 'unknown' for i in range(result.shape[1])]y = pd.Series(y)pre = pd.Series(pre)real = np.concatenate((x_test.T, np.array(y).reshape(-1, 1)), axis=1)prediction = np.concatenate((x_test.T, np.array(pre).reshape(-1, 1)), axis=1)df_real = pd.DataFrame(real, columns=['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width', 'Species'])df_prediction = pd.DataFrame(prediction, columns=['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width', 'Species'])df_real[['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width']] = df_real[['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width']].astype(float)df_prediction[['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width']] = df_prediction[['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width']].astype(float)fig, axes = plt.subplots(1, 2, figsize=(14, 6))radviz(df_real, 'Species', color=['blue', 'green', 'red'], ax=axes[0])radviz(df_prediction, 'Species', color=['blue', 'green', 'red'], ax=axes[1])fig.suptitle('Real Results vs. Predictions')axes[0].title.set_text('Real Results')axes[1].title.set_text('Predictions')plt.show()# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target.reshape(-1, 1)# One-hot编码
encoder = OneHotEncoder(sparse_output=False)
y_one_hot = encoder.fit_transform(y)# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y_one_hot, test_size=0.2, random_state=42)# 转置数据集以适应神经网络的输入格式
X_train = X_train.T
X_test = X_test.T
y_train = y_train.T
y_test = y_test.T# 设置神经网络参数
n_input = X_train.shape[0]
n_output = y_train.shape[0]
n_h = 10  # 隐藏层单元数
num_iterations = 10000  # 迭代次数# 训练神经网络
parameters, print_cost, cost_history = nn_model(X_train, y_train, n_h, n_input, n_output, num_iterations, print_cost=True)# 预测并评估结果
result = predict(parameters, X_test, y_test)# 绘制代价函数变化
plot_cost_history(cost_history)# 结果可视化
result_visualization(X_test, y_test, result)

3.3 结果演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 问题与分析

在这里插入图片描述
升级该库使用命令 pip install --upgrade scikit-learn
在这里插入图片描述
或者使用旧版本参数 spare=False
在这里插入图片描述

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

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

相关文章

【动态规划算法题记录】70. 爬楼梯——递归/动态规划

题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 题目分析 递归法(超出时间限制) 递归参数与返回值 void reversal(int i, int k) 每次我们处理第i个台阶到第k个…

白酒:茅台镇白酒的品牌故事与传奇色彩

茅台镇,这个位于中国贵州省遵义市仁怀市的小镇,因为出产的白酒品质卓着,被誉为“世界名酒之乡”。在这片神奇的土地上,云仓酒庄以其豪迈白酒,书写了一段段品牌故事与传奇色彩。 云仓酒庄豪迈,酿造于茅台镇的…

Vue23-过滤器

一、效果图 二、好用的时间戳三方工具 该三方工具比较大 推荐使用 dayjs的用法: 三、过滤器的使用 3-1、计算属性实现 3-2、methods函数实现 3-3、过滤器filters属性实现 过滤器的本质就是函数!!! 1、过滤器-未传参 默认将管道…

TIM—通用定时器高级定时器

通用/高级定时器的功能 在基本定时器功能的基础上新增功能: 通用定时器有4个独立通道,且每个通道都可以用于下面功能。 (1)输入捕获:测量输入信号的周期和占空比等。 (2)输出比较:产…

自动化办公03 用xlrd和xlwt库操作excel.xls文件(老版本)

目录 一、读操作 二、写操作 三、设置单元格格式 0.综合案例 1.设置行高和列宽 2.设置字体样式 3.设置边框样式 4.设置对齐方式 5.设置背景颜色 6.合并单元格 四、 xlutils修改Excel⽂件内容 1.安装 2.使用 一、读操作 import xlrd# 1. 打开excel文件 wb xlrd.op…

Flarum 安装和使用教程

随着开源社区的日益繁荣,人们对社区品质的要求也越来越高。传统的 BBS 论坛模式已经难以满足现代用户对美观、便捷、互动性的需求。搭建一个现代化的高品质社区,成为许多网站管理者的迫切需求和共同挑战。 今天就给大家安利一款现代化的、优雅的开源论坛…

立创·天空星开发板-GD32F407VE-Timer

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子,记录学习笔记。 立创天空星开发板-GD32F407VE-Timer 定时器基本定时器示例 定时器 定时器是嵌入式系统中常用的一种外设,它可以产生一定的时间间隔、延时、定时等功能,广泛应用于…

网络安全等级保护基本要求 第1部分:安全通用要求

基本要求 第三级 安全物理环境 物理位置选择 a) 机房场地应选择在具有防震、防风和防雨等能力的建筑内; b) 机房场地应避免设在建筑物的顶层或地下室,否则应加强防水和防潮措施 物理访问控制 a) 机房出入口应配置电子门禁系统,控制、鉴…

Java项目:100 springboot共享汽车管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本共享汽车管理系统有管理员和用户。 管理员功能有个人中心,用户管理,投放地区管理,汽车信息管理,汽车…

用 KV 缓存量化解锁长文本生成

很高兴和大家分享 Hugging Face 的一项新功能: KV 缓存量化 ,它能够把你的语言模型的速度提升到一个新水平。 太长不看版: KV 缓存量化可在最小化对生成质量的影响的条件下,减少 LLM 在长文本生成场景下的内存使用量,从而在内存效率和生成速度…

基于STM32和人工智能的智能交通管理系统

目录 引言环境准备智能交通管理系统基础代码实现:实现智能交通管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景:智能交通管理与优化问题解决方案与优化收尾与总结 1. 引言 随着城市化进程的加快&#xff0…

算法第六天:力扣第977题有序数组的平方

一、977.有序数组的平方的链接与题目描述 977. 有序数组的平方的链接如下所示:https://leetcode.cn/problems/squares-of-a-sorted-array/description/https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组…

【C++】STL中stack和queue(适配器版)的模拟实现

前言:在此之前我们讲到了stack和queue还有deque的常见的使用方法,并且也在数据结构的时候用C语言去实现过栈和队列,今天我们将进一步的用C去模拟实现stack和queue 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 …

vue 之 vuex

目录 vuex 是什么 Vuex管理哪些状态呢? Vuex 页面刷新数据丢失怎么解决 1. 使用浏览器的本地存储 2. 使用 Vuex 持久化插件 3. 使用后端存储 注意事项 Vuex 为什么要分模块并且加命名空间 vuex 是什么 vuex 是专门为 vue 提供的全局状态管理系统&#xff0c…

【应用案例】如何解决无人驾驶车辆的动力转向问题

埃尔朗根-纽伦堡大学名称为高能赛车运动队(High-Octane Motorsports e.V.)的学生方程式车队都设计、构建和制造具有创新意义且独特的赛车。然后,他们将参加三种不同类别的大学生方程式比赛;该项赛事中的参赛队伍来自于世界各地。 电动、无人驾驶和燃油车…

Windows 11 24H2版首发体验!附详细更新升级安装教程

Windows 11 24H2 版首发体验!这是微软2024年的大版本更新,新增超多新功能,以下会给你细细道来。这个版本目前小编亲测,使用非常流畅,没有什么明显问题。系统是已经集成了VB6/VC2005/VC2008/VC2010/VC2012/VC2013/VC201…

Dorkish:一款针对OSINT和网络侦查任务的Chrome扩展

关于Dorkish Dorkish是一款功能强大的Chrome扩展工具,该工具可以为广大研究人员在执行OSINT和网络侦查任务期间提供强大帮助。 一般来说,广大研究人员在执行网络侦查或进行OSINT信息收集任务过程中,通常会使用到Google Dorking和Shodan&…

2024年高考:计算机相关专业还值得选择吗?

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 行业竞争现状 市场饱和与新兴技术的影响 如何保持竞争力 专业与个人的匹配度判断 专业核心课程与技术能力 个人兴趣与职业…

使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压(附源码)

目录 1、使用场景 2、压缩包的创建 3、压缩包的解压 4、CloseZipZ和CloseZipU两接口的区别 5、开源zip.cpp和unzip.cpp文件的下载 VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排…

【C语音 || 数据结构】二叉树--堆

文章目录 前言堆1.1 二叉树的概念1.2 满二叉树和完美二叉树1.3 堆的概念1.4 堆的性质1.4 堆的实现1.4.1堆的向上调整算法1.4.1堆的向下调整算法1.4.1堆的接口实现1.4.1.1堆的初始化1.4.1.2堆的销毁1.4.1.3堆的插入1.4.1.4堆的删除1.4.1.4堆的判空1.4.1.4 获取堆的数据个数 前言…