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

news2024/11/22 18:35:06

目录

  • 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) + b1
    a1 = np.tanh(z1)
    z2 = np.dot(w2, a1) + b2
    a2 = 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) / m
    w1, 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_cost
    return 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 - Y
    dw2 = np.dot(dz2, a1.T) / m + (lambd / m) * w2
    db2 = 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) * w1
    db1 = 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) * dw1
    vdb1 = beta1 * vdb1 + (1 - beta1) * db1
    vdW2 = beta1 * vdW2 + (1 - beta1) * dw2
    vdb2 = beta1 * vdb2 + (1 - beta1) * db2
    sdW1 = 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 parameters

def predict(parameters, x_test, y_test):
    w1 = parameters['w1']
    b1 = parameters['b1']
    w2 = parameters['w2']
    b2 = parameters['b2']
    z1 = np.dot(w1, x_test) + b1
    a1 = np.tanh(z1)
    z2 = np.dot(w2, a1) + b2
    a2 = 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)) * 100
    print('准确率:%.2f%%' % accuracy)
    return output

def nn_model(X, Y, n_h, n_input, n_output, num_iterations=10000, print_cost=False):
    np.random.seed(3)
    n_x = n_input
    n_y = n_output
    parameters = 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_history

def 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.coloradmin.cn/o/1821889.html

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

相关文章

智能合约之路:Web3时代的商业革新之道

随着区块链技术的日益成熟和普及,智能合约作为其重要应用之一,正逐渐引领着我们进入一个全新的商业时代,即Web3时代。在这个时代,智能合约不仅改变着商业交易的方式,更为商业模式带来了颠覆性的革新。本文将深入探讨智…

18.9k star!一个高性能的嵌入式分析型数据库,主要用于数据分析和数据处理任务

大家好,今天给大家分享的是一个开源的面向列的关系数据库管理系统(RDBMS)。 DuckDB是一个嵌入式的分析型数据库,它提供了高性能的数据分析和数据处理能力。DuckDB的设计目标是为数据科学家、分析师和数据工程师提供一个快速、灵活且易于使用的数据分析工…

从路边摊到五星级酒店:六西格玛培训的价格与品质探秘!

当我们深入探讨市面上的六西格玛培训价格差异时,确实会发现不同机构之间存在着显著的差别。以张驰咨询和xx机构为例,两者在价格定位上形成了鲜明的对比,同时也展示了不同机构在教学理念和服务品质上的不同。 xx机构之所以能以亲民的价格吸引…

同三维T80005JEHVA 4K视频解码器

同三维T80005JEHVA视频解码器 可解1路4K30HDMI/VGA/CVBS1路3.5音频 可解电台音频网络流&#xff0c;可同时解4个网络流&#xff0c;分割输出 可预设十个流&#xff0c;任意切换1路流输出 <!--[endif]----><!--[if !vml]--> <!--![endif]----> 介绍&…

反贿赂管理体系认证:提升企业诚信与防范风险的双重利器

反贿赂管理体系认证在当今商业环境中发挥着至关重要的作用。这一认证不仅有助于提高企业的道德标准和社会责任感&#xff0c;还能有效防范商业风险&#xff0c;并提升内部管理水平和工作效率。 反贿赂管理体系认证要求企业制定和执行严格的反贿赂政策和程序&#xff0c;从而在…

优思学院|做质量没有前途?10年质量人想对大家说...

你是否也有过这样的困惑&#xff1f;做质量工作究竟有没有前途&#xff1f;是不是感觉每天都在重复一样的事情&#xff0c;看不到未来的希望&#xff1f; 今天&#xff0c;优思学院分享一个任职于五百强企业、有着10年经验的质量人、六西格玛黑带学生徐某的文章&#xff0c;和…

投资策略如何降低风险?WeTrade众汇一分钟分享

通过投资不同的公司、行业甚至国家&#xff0c;投资策略涉及多元化投资&#xff0c;投资者可以平衡潜在的收益与风险&#xff0c;这确实是降低风险的一种常见方法。下面WeTrade众汇分享一种更现代的投资策略&#xff0c;将指数中所有工具的资本化纳入考量&#xff0c;确保不遗漏…

cdh中的zookeeper怎么配置zoo.cfg

你手动改了zoo.cfg目录是不会生效的&#xff0c;因为是cdh在管控&#xff0c;所以只能通过cdh修改。 首先打开cdh。 xxx:7180 点击zookeeper 选配置&#xff0c;然后选高级 在右边找&#xff0c;有一个就是zoo.cfg&#xff0c;可以点击右边的感叹号。然后在里面编辑的就会直…

差分个人见解(一)

差分个人见解&#xff08;一&#xff09; 一维差分什么是差分构造差分数组差分数组的用处实战演练题目 一维差分 什么是差分 前缀和或许你已经了解了&#xff0c;差分其实就是前缀和的逆运算。 假设 a1 到 an 为 b1到 bn 的前缀和。 那么 b1 到 bn&#xff0c;分别就是 a1 到…

基于深度强化学习算法的火力-目标分配方法

源自&#xff1a;指挥控制与仿真 作者&#xff1a;李伟光 陈栋 注&#xff1a;若出现无法显示完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 摘 要 针对火力-目标分配问题解空间较大、离散、非线性等特点,提出了一种基于DQN的深度强化学习算法,通过…

算法02 递归算法及其相关问题

递归 在编程中&#xff0c;我们把函数直接或者间接调用自身的过程叫做递归。 递归处理问题的过程是&#xff1a;通常把一个大型的复杂问题&#xff0c;转变成一个与原问题类似的&#xff0c;规模更小的问题来进行求解。 递归的三大要素 函数的参数。在用递归解决问题时&…

大模型赛道有前景吗?

前言 随着人工智能技术的飞速发展&#xff0c;大模型作为新一代AI技术的核心驱动力&#xff0c;正在全球范围内掀起一场科技革命。在这个浪潮中&#xff0c;大模型赛道以其巨大的发展潜力、广泛的应用前景&#xff0c;成为了众多企业和投资者关注的焦点。本文将从多个角度探讨…

VirtualHere 允许通过网络远程使用 USB 设备,就像本地连接一样!

传统上&#xff0c;USB 设备需要直接插入计算机才能使用。有了 VirtualHere&#xff0c;就不再需要这样做&#xff0c;网络本身就变成了传输 USB 信号的电缆&#xff08;也称为 USB over IP、USB/IP、USB over WiFi、USB over Ethernet、USB 设备服务器&#xff09;。 此 USB …

振弦采集仪在水利工程中的应用与效果评估

振弦采集仪在水利工程中的应用与效果评估 河北稳控科技振弦采集仪是一种用于测量和监测结构振动的设备&#xff0c;广泛应用于水利工程中。它能够实时监测结构的振动情况&#xff0c;帮助工程师评估结构的安全性和稳定性。 在水利工程中&#xff0c;振弦采集仪主要用于以下几个…

JS 中的各种距离 scrollTop?clientHeight?

元素的各种距离 DOM 对象 属性描述offsetWidth只读&#xff0c;返回元素的宽度&#xff08;包括元素宽度、内边距和边框&#xff0c;不包括外边距&#xff09;offsetHeight只读&#xff0c;返回元素的高度&#xff08;包括元素高度、内边距和边框&#xff0c;不包括外边距&am…

VS2019中添加FFTW3库 + cmake工程

一、FFTW3官网 http://www.fftw.org/install/windows.html 二、我这里是选的64位的版本&#xff0c;可根据自己的需要选择对应的版本 三、解压得到 四、根据官网的说明&#xff0c;需进行编译生成.lib文件 4.1 在解压目录打开cmd 4.2 生成 .lib 文件 终端依次输入 lib /machine…

解决:安装MySQL 5.7 的时候报错:unknown variable ‘mysqlx_port=0.0‘

目录 1. 背景2. 解决步骤 1. 背景 吐槽1&#xff0c;没被收购之前可以随便下载&#xff0c;现在下载要注册登录吐槽2&#xff0c;5.7安装到初始化数据库的时候就会报错&#xff0c;而8.x的可以一镜到底&#xff0c;一开始以为是国区的特色问题&#xff0c;google了一圈&#x…

动力学仿真平台:让模型配置与仿真测试更高效!

背景概述 动力学仿真平台是一种基于计算机技术的模拟工具&#xff0c;旨在模拟和分析物理系统中的动力学行为。通过建立数学模型&#xff0c;并借助高效的数值计算方法来模拟复杂系统的运动规律&#xff0c;为科研、设计、工程等领域提供重要的决策支持。动力学仿真平台的重要性…

Python高效处理海量气溶胶数据;MODIS和CALIPSO气溶胶数据下载、处理与反演分析

目录 专题一 碳中和下气溶胶的研究意义 专题二 夯实Python语言基础及代码讲解 专题三 MODIS气溶胶数据处理与反演分析 专题四 CALIPSO气溶胶数据处理及反演分析 专题五 总结与扩展 更多应用 在当前全球气候变化和环境污染问题日益突出的背景下&#xff0c;气溶胶研究显得…

Codeforces Round 950 G. Yasya and the Mysterious Tree 【树上异或和差分、01Trie】

G. Yasya and the Mysterious Tree 题意 给定一颗 n n n 个节点的树&#xff0c;每条边有一个初始的权值 现在定义两种操作&#xff1a; ^ y \; y y&#xff0c;给所有的边的权值异或上 y y y? u x u \; x ux&#xff0c;在树上任选一个不等于 u u u 的点&#xff0c;在…