当前位置: 首页 > news >正文

数学建模:BP神经网络(含python实现)

原理

  BP 神经网络,也称为多层感知机(Multilayer Perceptron,MLP),是一种常见的神经网络模型,用于解决各种机器学习问题,包括分类和回归。BP 代表“反向传播”(Backpropagation),这是该模型训练的关键算法。
  BP 神经网络由多个神经元组成,通常分为输入层、隐藏层和输出层。每个神经元都与前一层的每个神经元相连,并且具有权重,用于调整信号的传递和计算。BP 神经网络的原理基于前向传播和反向传播两个关键步骤。
  前向传播是在前向传播过程中,输入信号从输入层传递到隐藏层和输出层,每个神经元将其输入与权重相乘并应用激活函数来产生输出。这个过程一直持续到达输出层,生成网络的预测结果。输入层到隐藏层公式: z j = ∑ i = 1 n w j i ( 1 ) x i z_j=\sum_{i=1}^{n}w_{ji}^{(1)}x_i zj=i=1nwji(1)xi α j = f ( z j ) \alpha_j=f(z_j) αj=f(zj)  输入层到隐藏层公式: z k = ∑ j = 1 m w k i ( 2 ) α j z_k=\sum_{j=1}^{m}w_{ki}^{(2)}\alpha_j zk=j=1mwki(2)αj α k = f ( z k ) \alpha_k=f(z_k) αk=f(zk)  其中, z j z_j zj z k z_k zk分别表示隐藏层和输出层神经元的加权输入, α j \alpha_j αj α k \alpha_k αk表示它们的激活输出,𝑤是权重,𝑥是自变量,𝑓是激活函数。
  反向传播是在反向传播过程中,网络的输出与实际目标进行比较,以计算误差。然后,误差通过网络反向传播,根据链式规则,将误差分配给每个神经元,并根据误差调整权重,以减小误差。这个过程重复进行多次,直到误差收敛到满意的水平或达到预定的训练轮次。其公式如下: Δ w k j ( 2 ) = − η ∂ E ∂ w k j ( 2 ) \Delta w_{kj}^{(2)}=-\eta \frac{\partial E}{\partial w_{kj}^{(2)}} Δwkj(2)=ηwkj(2)E Δ w j i ( 1 ) = − η ∂ E ∂ w j i ( 1 ) \Delta w_{ji}^{(1)}=-\eta \frac{\partial E}{\partial w_{ji}^{(1)}} Δwji(1)=ηwji(1)E  其中,其中,𝜂是学习率,∂𝐸,∂𝑤表示误差关于权重的偏导数。误差计算中通常使用均方误差(Mean Squared Error,MSE)作为误差函数: E = 1 2 ∑ k = 1 p ( t k − α k ) 2 E=\frac12\sum_{k=1}^p(t_k-\alpha_k)^2 E=21k=1p(tkαk)2  其中, t k t_k tk是目标输入, α k \alpha_k αk是网络的实际输出。
  BP神经网络结构:在这里插入图片描述

代码

多层感知机实际上就是多层全连接网络构成的网络,一个示例代码:

import tensorflow as tf
from tensorflow import keras# 定义模型
model = keras.Sequential([keras.layers.Dense(64, activation='relu', input_shape=(X.shape[1],)),keras.layers.Dense(32, activation='sigmoid'),keras.layers.Dense(1, activation='sigmoid')
])
# model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# model.fit(X_train, Y_train, epochs=100, batch_size=32, validation_split=0.05)
# odel = keras.Sequential([
#     keras.layers.Dense(128, activation='relu', input_shape=(X.shape[1],)),
#     keras.layers.Dense(64, activation='sigmoid'),
#     keras.layers.Dense(32, activation='relu'),
#     keras.layers.Dense(16, activation='sigmoid'),
#     keras.layers.Dense(8, activation='relu'),
#     keras.layers.Dense(1, activation='sigmoid')
# ])model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 模型训练
history=model.fit(X_train, Y_train, epochs=60, batch_size=32, validation_split=0.5)

在这里插入图片描述

# 模型评估
test_loss, test_accuracy = model.evaluate(X_test, Y_test)
print(f'Test accuracy: {test_accuracy}')
# 使用表1的所有行进行水肿概率的预测
# all_predictions = model.predict(X2)
# all_predictions

在这里插入图片描述
可视化:

import pandas as pd
df = pd.DataFrame(all_predictions, columns=["Value"])# 保留4位小数
df["Value"] = df["Value"].round(4)# 将DataFrame保存为Excel文件
df.to_excel("output4.xlsx", index=False)import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# 训练过程中损失的历史记录
loss = history.history['loss']
val_loss = history.history['val_loss']# 训练过程中性能指标的历史记录
accuracy = history.history['accuracy']
val_accuracy = history.history['val_accuracy']# 绘制损失曲线
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(loss, label='训练集误差')
plt.plot(val_loss, label='验证集误差')
plt.xlabel('训练次数')
plt.ylabel('误差')
plt.legend()
plt.title('误差曲线')# 绘制性能指标曲线
plt.subplot(1, 2, 2)
plt.plot(accuracy, label='训练集准确率')
plt.plot(val_accuracy, label='验证集准确率')
plt.xlabel('训练次数')
plt.ylabel('准确率')
plt.legend()
plt.title('准确率曲线')
plt.savefig('神经网络训练过程图.png',dpi=300)
plt.show()

在这里插入图片描述

from sklearn.metrics import roc_curve, roc_auc_score
# 计算ROC曲线的参数
fpr, tpr, thresholds = roc_curve(Y, all_predictions)# 计算AUC-ROC
roc_auc = roc_auc_score(Y,all_predictions)# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='orange', label=f'AUC = {roc_auc:.2f}')
plt.plot([0, 1], [0, 1], color='blue',linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.xlabel('假正例率(FPR)')
plt.ylabel('真正例率(TPR)')
plt.title('BP神经网络ROC Curve')
plt.legend(loc='lower right')
plt.savefig('神经网络roc.png',dpi=300)
plt.show()

在这里插入图片描述

相关文章:

  • geoserver 热力图样式
  • 从kafka如何保证数据一致性看通常数据一致性设计
  • 利用LaTex批量将eps转pdf、png转eps、eps转png、eps转svg
  • 这才开工没几天收到Offer了,简历改的好,找工作没烦恼。
  • 基于ant的图片上传组件封装(复制即可使用)
  • 2个wordpress优化SEO主题模板
  • TypeScript基础知识点
  • 捕捉消费新趋势,脉纷纷让生活更便捷
  • 学习鸿蒙基础(4)
  • python加载模块
  • 【工具类】开源照片管理工具pthtoprism
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • 【Docker】初学者 Docker 基础操作指南:从拉取镜像到运行、停止、删除容器
  • 【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理
  • 可变形注意力(Deformable Attention)及其拓展
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 《Java编程思想》读书笔记-对象导论
  • happypack两次报错的问题
  • Mybatis初体验
  • nfs客户端进程变D,延伸linux的lock
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • node和express搭建代理服务器(源码)
  • orm2 中文文档 3.1 模型属性
  • 测试如何在敏捷团队中工作?
  • 当SetTimeout遇到了字符串
  • 番外篇1:在Windows环境下安装JDK
  • 基于webpack 的 vue 多页架构
  • 前端之Sass/Scss实战笔记
  • 如何使用 JavaScript 解析 URL
  • 一个完整Java Web项目背后的密码
  • 责任链模式的两种实现
  • 正则表达式
  • 走向全栈之MongoDB的使用
  • 容器镜像
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (C语言)逆序输出字符串
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (汇总)os模块以及shutil模块对文件的操作
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (万字长文)Spring的核心知识尽揽其中
  • (一)WLAN定义和基本架构转
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • ***检测工具之RKHunter AIDE
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET 设计模式初探
  • .NET/C# 使用反射注册事件
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NetCore项目nginx发布
  • .Net程序帮助文档制作
  • .Net接口调试与案例
  • .NET中统一的存储过程调用方法(收藏)