基于ASO-BP原子探索优化BP神经网络实现数据预测Python实现

本文提出了一种基于ASO算法优化BP神经网络的数据预测方法。通过ASO算法对BP神经网络的权值和阈值进行优化,克服了BP神经网络易陷入局部最优解和对初始权值敏感的缺点。实验结果表明,优化后的BP神经网络在预测精度上得到了显著提升,为数据预测领域提供了一种新的有效方法。

一、ASO-BP算法概述

1.ASO原子探索算法

原子搜索算法(ASO)是一种受微观分子动力学启发的智能优化算法,于2019年提出。在ASO中,每个原子在搜索空间中的位置代表一个与原子质量相对应的解,较好的解表示较重的质量。种群中的所有原子会根据彼此之间的距离相互吸引或排斥,且较轻的原子会向较重的原子移动。通过计算Lennard-Jones势能,并利用加速度与速度随距离的关系来更新原子的位置,ASO算法能够有效地求解优化问题。

2.BP神经网络(BP)

BP神经网络是一种具有三层或三层以上的多层神经网络,包括输入层、隐含层和输出层。每一层都由若干个神经元组成,神经元之间通过加权和的方式传递信号,并经过激活函数进行非线性变换。BP神经网络的训练过程包括前向传播和反向传播两个阶段。在前向传播阶段,输入信号从输入层逐层传递到输出层;在反向传播阶段,根据输出误差调整各层之间的连接权重,使误差逐步减小。

3.ASO-BP神经网络回归预测方法

ASO-BP神经网络回归预测方法的基本思路如下:

(1)初始化:初始化BP神经网络的权重和偏置。初始化原子的位置(即神经网络的参数)。

(2)适应度函数:使用BP神经网络在训练集上进行训练,并计算验证集上的误差(如均方误差MSE)作为适应度值。

(3)速度和位置更新:根据原子之间的距离计算势能。根据势能和物理规律更新原子的速度和加速度。根据速度和加速度更新原子的位置,即更新BP神经网络的权值和阈值。

(4)迭代:重复上述步骤,直到达到最大迭代次数或满足其他停止条件。

(5)结果输出:使用最优原子的权重和阈值(即最优参数集)的BP神经网络进行预测。

二、实验步骤

ASO-BP神经网络回归预测步骤:

1.数据清洗:去除缺失值和异常值。

2.特征选择:根据相关性分析选择对预测结果影响显著的特征。

3.数据归一化:将特征值缩放到同一量纲,提高训练效率。

4.定义BP神经网络结构:确定输入层、隐藏层(数量、神经元数)、输出层的结构。

5.初始化:设置ASO参数,包括初始种群规模、最大进化代数、自变量个数(即BP神经网络的权值和阈值总数)、自变量上下限等。

6.评估适应度:使用训练集数据训练BP神经网络,并计算训练集和测试集的均方误差作为适应度值。适应度值越小,表示解的质量越好。

7.更新原子位置:根据原子之间的距离计算势能。根据势能和物理规律更新原子的速度和加速度。根据速度和加速度更新原子的位置,即更新BP神经网络的权值和阈值。

8.迭代优化重复步骤6和7,直到达到最大进化代数或满足其他停止条件。

9.模型评估:在训练完成后,评估模型在训练集和测试集上的性能,使用不同的指标(如R²、MAE、MBE、RMSE、MAPE)。

10.结果可视化:绘制训练集和测试集的预测值与真实值的对比图。

 

代码部分

import numpy as np
import pandas as pd
import torch
import torch.nn as nn
from sklearn.preprocessing import MinMaxScaler
import torch.optim as optim
import matplotlib
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False# 导入数据
data = pd.read_csv('数据集.csv').values# 划分训练集和测试集
np.random.seed(0)
temp = np.random.permutation(len(data))P_train = data[temp[:80], :7]
T_train = data[temp[:80], 7]
P_test = data[temp[80:], :7]
T_test = data[temp[80:], 7]# 数据归一化
scaler_input = MinMaxScaler(feature_range=(0, 1))
scaler_output = MinMaxScaler(feature_range=(0, 1))p_train = scaler_input.fit_transform(P_train)
p_test = scaler_input.transform(P_test)t_train = scaler_output.fit_transform(T_train.reshape(-1, 1)).ravel()
t_test = scaler_output.transform(T_test.reshape(-1, 1)).ravel()
# 转换为 PyTorch 张量
p_train = torch.tensor(p_train, dtype=torch.float32).to(device)
t_train = torch.tensor(t_train, dtype=torch.float32).view(-1, 1).to(device)
p_test = torch.tensor(p_test, dtype=torch.float32).to(device)
t_test = torch.tensor(t_test, dtype=torch.float32).view(-1, 1).to(device)# 初始化网络
class BPNetwork(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(BPNetwork, self).__init__()self.hidden = nn.Linear(input_size, hidden_size)self.relu = nn.ReLU()self.output = nn.Linear(hidden_size, output_size)def forward(self, x):x = self.relu(self.hidden(x))x = self.output(x)return xinput_size = p_train.shape[1]
hidden_size = 11
output_size = t_train.shape[1]bp_net = BPNetwork(input_size, hidden_size, output_size).to(device)# 损失函数
criterion = nn.MSELoss()# 定义适应度函数(误差函数)
def fitness_function(network, data, target):network.eval()with torch.no_grad():output = network(data)loss_fn = nn.MSELoss()loss = loss_fn(output, target)return loss.item()

四、实验与结果

1.数据准备

为了验证ASO优化BP神经网络的有效性,本文采用某数据集进行实验。下面所示本次采用的数据集(部分)。

 

2.结果分析

实验结果表明,经过ASO优化后的BP神经网络在预测精度上显著优于未经优化的BP神经网络。具体地,优化后的BP神经网络在测试集上的均方误差降低了约20%,表明ASO算法能够有效地提升BP神经网络的预测性能。

(1) 训练集预测值和真实值对比结果 

 

(2) 测试集预测值和真实值对比结果  

 

(3) 训练集线性回归图 

 

(4) 测试集线性回归图 

 

(5) 其他性能计算 

 

五、结论

本文提出了一种基于ASO算法优化BP神经网络的数据预测方法。通过ASO算法对BP神经网络的权值和阈值进行优化,克服了BP神经网络易陷入局部最优解和对初始权值敏感的缺点。实验结果表明,优化后的BP神经网络在预测精度上得到了显著提升,为数据预测领域提供了一种新的有效方法。

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

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

相关文章

Go 语言中的接口详解

Go 语言中的接口详解 接口是 Go 语言中实现多态性和松耦合设计的核心概念之一。通过接口,Go 提供了一种简洁而强大的方式来定义对象之间的行为规范,允许不同类型实现相同的接口方法,进而使得代码更加灵活和可扩展。 什么是接口?…

架构基础 -- Web框架之FastAPI

FastAPI:背景与使用案例介绍 FastAPI的背景 FastAPI是一个现代、快速(高性能)的Web框架,基于Python 3.7编写,利用Python的类型提示(type hints)来实现自动生成文档和高效的数据验证。由Sebast…

Java 入门指南:Java 并发编程 —— 线程安全问题与锁机制

线程安全的概念 线程安全可以简单理解为在多线程环境下,一个方法或实例在并发执行时能够保持数据的一致性和完整性,不会因为多个线程的交替执行而导致错误的结果。 线程不安全的原因 线程不安全通常由以下几个原因引起: 原子性问题&#x…

ncnn之yolov5(7.0版本)目标检测pnnx部署

一、pnxx介绍与使用 pnnx安装与使用参考: https://github.com/pnnx/pnnxhttps://github.com/Tencent/ncnn/wiki/use-ncnn-with-pytorch-or-onnxhttps://github.com/Tencent/ncnn/tree/master/tools/pnnx 支持python的首选pip,否则就源码编译。 pip3 …

【60天备战软考高级系统架构设计师——第四天:需求获取与初步分析】

软件开发的成功与否往往取决于需求分析的准确性和全面性。今天,我们将深入学习需求获取的各种方法及初步分析的策略,为构建成功的软件项目打下坚实基础。 需求获取方法 需求获取是软件工程中非常重要的阶段,它帮助开发团队深入了解用户的需…

美团8/31—24年秋招【技术】第四场

有10道选择题和3道编程题,选择题以数据结构和计算机网络的知识点为主,编程题只做出了前2道,第三道没时间了,这里记录一下解答过程。 第一题 题目描述 给定一字符串,统计字符串中意大写字母开头的子串的数量&#xf…

mysql实用系列:查询语句开启分页

在 Spring Boot 项目中使用 MyBatis 分页插件&#xff08;PageHelper&#xff09;的步骤如下&#xff1a; 添加依赖&#xff1a;在项目的 pom.xml 文件中添加 PageHelper 的依赖。 <dependency><groupId>com.github.pagehelper</groupId><artifactId>…

Leetcode面试经典150题-36-有效数独升级版-37.解数独

解法都在代码里&#xff0c;不懂就留言或者私信&#xff0c;比第一题稍微难点 public static void solveSudoku(char[][] board) {/**定义三个二维数组分别代表行、列、桶&#xff08;每9个格子&#xff09;*/boolean[][] rowExists new boolean[9][10];boolean[][] colExist…

穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

1.为什么要继承 2.什么是继承以及继承的方式 3.继承的一些语法 4.父类成员的访问 5.关键字super 6.关键字protected 7.关键字final 8.继承与组合 一&#xff1a;为什么要继承 ①代码重用&#xff1a;继承允许我们重用、扩展或修改父类的属性和方法&#xff0c;而无需重…

【linxu】虚拟环境中Python 版本错乱:深入探究 Linux 虚拟环境的识别问题

【linxu】虚拟环境中Python 版本错乱&#xff1a;深入探究 Linux 虚拟环境的识别问题 问题描述&#xff1a;在服务器上&#xff0c;我配置了一个虚拟环境&#xff0c;明确指定使用 Python 3.8 版本。然而&#xff0c;当我激活该环境并检查 Python 版本时&#xff0c;意外地发现…

Golang中的timer和ticker

Golang中的timer和ticker Timer func AppTimer() {// st : time.Now()// // 创建timer&#xff0c;定时2s// timer : time.NewTimer(2 * time.Second)// timer.Stop()// //<-timer.C// timer.Reset(3 * time.Second)// <-timer.C// fmt.Println(time.Since(st))// Afte…

21. Map接口中keySet()、values()和entrySet()方法的区别是什么?它们各自返回什么内容?

在Java中&#xff0c;Map接口提供了keySet()、values()和entrySet()方法&#xff0c;这些方法用于访问Map中的不同部分。下面详细介绍它们的区别以及它们各自返回的内容。 1. keySet() 方法 作用: keySet()方法返回Map中所有键&#xff08;Key&#xff09;的集合。 返回类型: …

OSI七层模型中的数据链路层

图片&#xff1a;数据帧的格式 这里面的一个关键点是&#xff0c;数据的源IP和目标IP在哪里&#xff1f; 就在图中的“数据”里面&#xff0c;这个“数据”也就是网络层的数据包&#xff0c;如果是TCP类型的数据包&#xff0c;数据包里面就包含TCP类型的首部信息&#xff0c;…

实测数据处理(RD算法处理)——SAR成像算法系列(十)

系列文章目录 《SAR学习笔记-SAR成像算法系列&#xff08;一&#xff09;》 《距离多普勒算法&#xff08;RDA&#xff09;-SAR成像算法系列&#xff08;三&#xff09;》 文章目录 一、算法流程 1.1、回波信号生成 1.2、 距离脉冲压缩 1.3、距离徙动校正 1.4、方位脉冲压缩 …

midwayjs 框架使用 rabbitmq 消息延迟

插件rabbitmq_delayed_message_exchange是RabbitMQ官方提供的一种用于实现延迟消息的解决方案。该插件将交换机类型扩展至x-delayed-message&#xff0c;这种类型的交换机能够将消息暂时挂起&#xff0c;直到设定的延迟时间到达&#xff0c;才将消息投递到绑定的队列中。这一特…

代理 IP 在工业物联网中的大作用

随着科技的飞速发展&#xff0c;工业物联网&#xff08;IIoT&#xff09;已经成为现代工业的重要组成部分&#xff0c;它通过将各种物理设备、传感器、控制系统等通过互联网连接起来&#xff0c;实现了工业生产的智能化、自动化和远程监控。而在这个庞大的网络体系中&#xff0…

掌握CHECK约束:确保数据准确性的关键技巧

掌握CHECK约束&#xff1a;确保数据准确性的关键技巧 在数据库设计和管理中&#xff0c;数据的准确性和完整性至关重要。CHECK约束是SQL中一种强大的工具&#xff0c;用于限制列中的数据值&#xff0c;确保它们满足特定的条件。本文将详细介绍如何使用CHECK约束&#xff0c;并…

湖南师范大学教育科学学报

期刊名称&#xff1a; 湖南师范大学教育科学学报 国内统一刊号(CN)&#xff1a; 42-94 国际标准刊号(ISSN)&#xff1a;BM1712 刊物设有两大特色专题“古典教育”和“教科书研究”&#xff0c;常设“教育基本理论研究”、“教育哲学研究”、“教师教育研究”、“高等教育研究”…

Nginx跨域问题解决

背景&#xff1a;云服务器上面部署了后端和前端&#xff0c;前端开发在本地启一个web访问页面&#xff0c;然后访问云服务的后端&#xff0c;然后出现问题 问题&#xff1a;Access to XMLHttpRequest at ‘http://192.168.10.100:8070/auth/login’ from origin ‘http://loca…

[E二叉树] lc104. 二叉树的最大深度(dfs+自顶向下)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;104. 二叉树的最大深度 题单&#xff1a; 链表、二叉树与一般树&#xff08;前后指针/快慢指针/DFS/BFS/直径/LCA&#xff09; 2.2 自顶向下 DFS 2. 题目解析 思路&#xff1a; 很基础的 dfs 题目哈&#x…