使用BP神经网络对鸢尾花数据集分类

2024-03-21 11:50

本文主要是介绍使用BP神经网络对鸢尾花数据集分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        最近认识的一位大佬搭建的人工智能学习网站,内容通俗易懂,风趣幽默,感兴趣的可以去看看:床长人工智能教程

 废话不多说,请看正文!

使用BP神经网络对鸢尾花数据集分类

from sklearn.datasets import load_iris
from pandas import DataFrame
import pandas as pdx_data = load_iris().data  # 返回iris数据集所有输入特征
y_data = load_iris().target  # 返回iris数据集所有标签
print("x_data from datasets:", x_data)
print("y_data from datasets", y_data)x_data = DataFrame(x_data, columns=['花萼长', '花萼宽', '花瓣长', '花瓣宽'])
pd.set_option('display.unicode.east_asian_width', True)  # 设置列名对齐
print(x_data)x_data['类别'] = y_data  # 新加一列,列标签‘类别’,数据为y_data
print("x_data add a column: \n", x_data)from sklearn.datasets import load_iris
from pandas import DataFrame
import pandas as pd
import numpy as np
import tensorflow as tf
from matplotlib import pyplot as pltimport os
import PySide2dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path# 定义超参数和画图用的两个存数据的空列表
lr = 0.1
train_loss_results = []  # 将每轮的loss记录在此列表中,为后续画loss曲线提供数据
test_acc = []  # 将每轮的acc记录在此列表中,为后续画acc曲线提供数据
epoch = 300
loss_all = 0  # 每轮分为4个step(因为一共有120个训练数据,每个batch有32个样本,所以epoch迭代一次120个数据需要4个batch),loss_all记录四个step生成的4个loss的和# ____________________________数据准备______________________________
# 1.数据集的读入
x_data = load_iris().data  # 返回iris数据集所有输入特征
y_data = load_iris().target  # 返回iris数据集所有标签
# print("x_data from datasets:", x_data)
# print("y_data from datasets", y_data)# 2.数据集乱序
np.random.seed(116)  # 使用相同的种子seed,使得乱序后的数据特征和标签仍然可以对齐
np.random.shuffle(x_data)  # 打乱数据集
np.random.seed(116)
np.random.shuffle(y_data)
tf.random.set_seed(116)# 3.数据集分出永不相见的训练集和测试集
x_train = x_data[:-30]  # 前120个数据作为训练集
y_train = y_data[:-30]  # 前120个标签作为训练集标签
x_test = x_data[-30:]  # 后30个数据集作为测试集
y_test = y_data[-30:]# 转换x的数据类型,否则后面矩阵相乘时会因为数据类型不一致报错
x_train = tf.cast(x_train, tf.float32)
x_test = tf.cast(x_test, tf.float32)# 配成【输入特征, 标签】对,每次喂入一小撮(batch)(把数据集分为批次,每批次32组数据)
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)# ____________________________定义神经网络______________________________
w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))  # 4表示输入的4的特征,3表示3分类
b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))  # 3表示3分类# ____________________________训练部分:嵌套循环迭代_______________________
for epoch in range(epoch):  # 数据集级别迭代for step, (x_train, y_train) in enumerate(train_db):  # batch级别迭代with tf.GradientTape() as tape:  # 在with结构中计算前向传播y以及计算总损失lossy = tf.matmul(x_train, w1) + b1  # 神经网络乘加运算y = tf.nn.softmax(y)  # 使输出y符合概率分布(此操作后与独热码同量级,可以相减求loss)y_ = tf.one_hot(y_train, depth=3)  # 将标签值转换为独热码格式,方便计算loss和accloss = tf.reduce_mean(tf.square(y_ - y))  # 采用均值方差损失函数MSEloss_all += loss.numpy()  # 将每个step计算出loss累加,为后续求loss平均值提供数据# 计算loss对各个参数的梯度grads = tape.gradient(loss, [w1, b1])  # 损失函数loss分别对参数w1和b1计算偏导数# 实现梯度更新 w1 = w1 - lr * w1_grad    b = b - lr * b_gradw1.assign_sub(lr * grads[0])  # 参数w1自更新b1.assign_sub(lr * grads[1])  # 参数b1自更新# 求出每个epoch的平均损失print("Epoch {}, loss:{}".format(epoch, loss_all / 4))train_loss_results.append(loss_all / 4)  # 将4个step的loss求平均记录在此变量中loss_all = 0  # loss_all归零为记录下一个epoch的loss做准备# ____________________________测试部分:识别准确率______________________________total_correct, total_number = 0, 0for x_test, y_test in test_db:y = tf.matmul(x_test, w1) + b1  # y为预测结果y = tf.nn.softmax(y)  # y符合概率分布pred = tf.argmax(y, axis=1)  # 返回y中最大值的索引,即预测的分类pred = tf.cast(pred, dtype=y_test.dtype)  # 调整数据类型与标签一致,即为把pred预测值转换为y_test数据类型correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)  # 如果真实值与预测值相同,就正确correct = tf.reduce_sum(correct)  # 将每个batch的correct加起来total_correct += int(correct)  # 将所有batch中的correct数加起来total_number += x_test.shape[0]# 总的准确率等于total_correct / total_numberacc = total_correct / total_numbertest_acc.append(acc)print("test_acc", acc)print("__________________________")# ____________________________acc / loss 可视化___________________________
# 绘制loss曲线
plt.title("Loss Curve")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.plot(train_loss_results, label="$Loss$")  # 逐点画出test_acc值并连线
plt.legend()
plt.show()#  绘制Accuracy曲线
plt.title("Acc Curve")
plt.xlabel("Epoch")import graphviz
plt.ylabel("Acc")
plt.plot(test_acc, label="$Accuracy$")  # 逐点画出test_acc值并连线
plt.legend()
plt.show()

结果:

这篇关于使用BP神经网络对鸢尾花数据集分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832563

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者