基于GA-PSO-BP混合神经网络的多输入多输出数据预测-Python代码实现

news2024/9/20 22:57:24

       在机器学习中,多输入多输出(MIMO)问题常见于复杂系统建模、控制和预测。本文将介绍一种基于 GA-PSO-BP 混合算法的 MIMO 数据预测方法。我们结合遗传算法(GA)和粒子群优化算法(PSO)对 BP 神经网络的权重进行优化,从而提高预测模型的准确性。本文以 Python 和 PyTorch 为开发工具,并通过一个例子展示如何实现该算法。

一、GA-PSO-BP算法概述

       1.GA遗传算法

       遗传算法(Genetic Algorithm,简称GA)是一种基于自然选择和遗传学原理的优化搜索方法,其灵感来源于生物进化过程。该方法由美国计算机科学家John H. Holland在20世纪60年代提出,并于1975年在其著作《自然和人工系统中的适应》中详细阐述。遗传算法通过模拟自然界的进化机制,如选择、交叉(杂交)和变异等操作,来迭代更新问题的解,从而搜索到最优解或近似最优解。

      2.PSO粒子群算法

       粒子群算法(Particle Swarm Optimization,简称PSO)是一种基于群体行为的优化算法,由J. Kennedy和R. C. Eberhart在近年来提出。该算法模仿了鸟群觅食过程中的社会行为,通过粒子之间的交流和经验共享来实现全局优化。

       3.BP神经网络(BP)

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

       4.GA-PSO-BP算法

       GA-PSO 混合算法结合了 GA 的全局搜索能力和 PSO 的局部搜索能力。以下是该算法的核心步骤:

      (1)GA 选择与交叉:遗传算法先根据适应度函数选择优质个体,并进行交叉操作生成新的后代。

      (2)GA 变异:通过随机变异操作保持种群多样性。

      (3)PSO 速度更新:通过 PSO 的速度更新公式,结合个体最优解和全局最优解调整种群的粒子位置。

      (4)BP 训练:混合算法得到的最优权重用于初始化 BP 网络,并进一步通过 Adam 优化器进行细调。

二、实验步骤

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

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

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

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

       4.确定BP神经网络结构:首先,根据问题的需求确定BP神经网络的输入层、隐藏层和输出层的节点数,以及隐藏层的层数。

       5.初始化BP神经网络参数:随机初始化BP神经网络的权重和偏置。

       6.定义适应度函数:使用训练数据集训练BP神经网络,并计算网络输出与实际输出之间的误差(如均方误差MSE)作为适应度函数。适应度值越小,表示神经网络的预测性能越好。

       7.GA-PSO-BP算法主函数:初始化种群数量和粒子群的速度和位置,接着执行遗传算法部分有选择、交叉和变异,然后就是粒子群算法部分有更新粒子群的位置和速度,以及寻找全局最优解。

       8.迭代:重复执行适应度评估、分类和位置更新的过程,直到达到最大迭代次数或满足其他停止条件。

       9.输出最优BP神经网络:在优化过程结束后,选择适应度值最小的值(即最优的BP神经网络权重和偏置)作为最终的网络参数。

      10.测试与评估:使用测试数据集评估优化后的BP神经网络的预测性能,并与其他优化算法进行比较。

代码部分

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import torch
import torch.nn as nn
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
import random
import torch.optim as optim
import matplotlib

# 设置设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# Matplotlib 中文字体设置
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[:575], 28:31]
T_train = data[temp[:575], :28]
P_test = data[temp[575:], 28:31]
T_test = data[temp[575:], :28]

# 数据归一化
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)
t_test = scaler_output.transform(T_test)

# 转换为 PyTorch 张量
p_train = torch.tensor(p_train, dtype=torch.float32).to(device)
t_train = torch.tensor(t_train, dtype=torch.float32).to(device)
p_test = torch.tensor(p_test, dtype=torch.float32).to(device)
t_test = torch.tensor(t_test, dtype=torch.float32).to(device)

# 定义BP神经网络
class BPNetwork(nn.Module):
    def __init__(self):
        super(BPNetwork, self).__init__()
        self.fc1 = nn.Linear(3, 15)  # 输入3个特征
        self.fc2 = nn.Linear(15, 30)
        self.fc3 = nn.Linear(30, 60)
        self.fc4 = nn.Linear(60, 120)
        self.fc5 = nn.Linear(120, 60)
        self.fc6 = nn.Linear(60, 30)  # 输出28个特征
        self.fc7 = nn.Linear(30, 28)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = torch.relu(self.fc3(x))
        x = torch.relu(self.fc4(x))
        x = torch.relu(self.fc5(x))
        x = torch.relu(self.fc6(x))
        x = self.fc7(x)
        return x

# 初始化BP网络
bp_net = BPNetwork().to(device)
criterion = nn.MSELoss()

四、实验与结果

       1.数据准备

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

 

       2.结果分析

        通过计算训练集和测试集的预测误差来评价模型的性能,包括 RMSE(均方根误差)、R²(判定系数)、MAE(平均绝对误差)和MBE(平均偏差误差)。

      (1)损失值计算 

 

      (2)其他性能参数计算 

 

五、结论

       本文介绍了基于 GA-PSO-BP 混合算法的多输入多输出数据预测方法。该算法结合了 GA 和 PSO 的优点,通过多层 BP 网络实现了对复杂数据的高精度预测。实验结果表明,混合优化算法能够有效提升 BP 网络的预测精度。未来我们将继续优化网络结构和参数,以进一步提高模型的泛化能力。

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

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

相关文章

【Linux】多路转接select

一、select介绍 1.1 初始select 系统提供的select函数来实现多路复用输入/输出模型。 select系统调用是用来让我们的程序监视多个文件描述符的状态变化的程序会停止在select这里等待,直到被监视的文件描述符有一个或者多个发生了状态改变 IO 等 拷贝&#xff0…

JavaDS —— LRUCache

概念 LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。…

SpringBoot实现房产销售系统全解析

第二章关键技术的研究 2.1相关技术 房产销售系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言,易于学习,实用且面向用户。全球超过35%的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统,因为它的…

灌区信息化发展趋势展望

灌区信息化作为现代农业发展的重要组成部分,正逐渐成为提升水资源管理效率、保障粮食安全与促进农业可持续发展的关键途径。随着信息技术的飞速进步和智能化技术的广泛应用,灌区信息化的未来发展趋势展现出多维度、深层次的变革与创新,其发展…

C语言 13 指针

指针可以说是整个 C 语言中最难以理解的部分了。 什么是指针 还记得在前面谈到的通过函数交换两个变量的值吗&#xff1f; #include <stdio.h>void swap(int, int);int main() {int a 10, b 20;swap(a, b);printf("a %d, b %d", a, b); }void swap(int …

SSH 弱密钥交换算法 通过禁用CBC模式解决SSH服务器CBC加密模式漏洞(CVE-2008-5161)

自查方法 查看当前支持的加密算法 man sshd_config |grep -A 40 -w KexAlgorithms 修复方法 Linux平台 修改sshd_config配置文件&#xff0c;删除不安全的加密算法 重启服务 systemctl restart sshd 3.查看修改后的配置文件 sshd -T | grep -w kexalgorithms SSH 弱密…

【Python基础】Python迭代器与生成器(两种强大工具)

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、迭代器2.1 创建迭代器2.2 自定义迭代器2.3 处理大型文件 三、生成器四、生成器表达式五、实际应用…

【数据结构初阶】队列接口实现及用队列实现栈超详解

文章目录 1. 概念1. 1 队列底层结构选型1. 2 队列定义 2. 接口实现2. 1 初始化2. 2 判空2. 3 入队列2. 4 出队列2. 5 队尾元素和队头元素和队列元素个数2. 6 销毁2. 7 接口的意义 3. 经典OJ题3. 1 用队列实现栈3. 1. 1 栈的定义3. 1. 2 栈的初始化3. 1. 3 入栈3. 1. 4 出栈3. 1…

计算机视觉(二)—— MDPI特刊推荐

特刊征稿 01 期刊名称&#xff1a; Applied Computer Vision and Pattern Recognition: 2nd Volume 截止时间&#xff1a; 摘要提交截止日期&#xff1a;2024年10月30日 投稿截止日期&#xff1a;2024年12月30日 目标及范围&#xff1a; 包括但不限于以下领域&#xff1a…

C++:线程库

C&#xff1a;线程库 threadthreadthis_threadchrono 引用拷贝问题 mutexmutextimed_mutexrecursive_mutexlock_guardunique_lock atomicatomicCAS condition_variablecondition_variable thread 操作线程需要头文件<thread>&#xff0c;头文件包含线程相关操作&#xf…

上班炒股会被开除吗?公司是如何发现员工上班炒股?一文告诉你答案!

随着互联网金融的发展&#xff0c;股票交易变得越来越便捷&#xff0c;不少上班族选择利用工作之余的时间来进行股票投资。 然而&#xff0c;这种行为是否合规&#xff1f;公司又是如何发现并处理这种情况的呢&#xff1f;本文将为您解答这些问题。 一、上班炒股是否合规&…

JAVA毕业设计175—基于Java+Springboot+vue3的医院预约挂号管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的医院预约挂号管理系统(源代码数据库)175 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、医生、管理员三种角色 1、用户&#x…

交换机最常用的网络变压器分为DIP和SM

华强盛电子导读&#xff1a;交换机通用网络变压器插件48PIN最为常见 您好&#xff01;今天我要给您介绍一款真正能为您的工业生产带来变革的产品——华强盛工业滤波器。在如今这个高度数字化的工业时代&#xff0c;可靠的网络连接至关重要&#xff0c;而华强盛工业网络变压器就…

Smartbi体验中心新增系列Demo,用户体验更丰富

为进一步提升用户体验&#xff0c;让大家更直观地了解Smartbi产品在数据分析方面的功能优势&#xff0c;Smartbi体验中心近期新增了一系列Demo。这些更新旨在优化产品操作流程&#xff0c;并为用户提供更多真实场景下的应用参考。接下来&#xff0c;我们一起简要浏览此次体验中…

KEIL仿真时弹窗 “Cannot access target.”

现象 仿真时&#xff0c;点击暂停就会弹出下图窗口。 Cannot access target. Shutting down debug session. 解决方法 开启STM32的Debug&#xff0c;如下图。

基于WIFI的开关控制器设计与实现

本设计基于STC89C52RC单片机设计的WiFi开关器系统&#xff0c;旨在通过软硬件设计实现按键和手机APP远程同步控制4个继电器驱动3个LED灯、1个风扇&#xff0c;并且具备时间显示、开关状态显示、定时驱动&#xff0c;时间设定及保存等功能。该设计在硬件方面采用STC89C52单片机作…

软考中项(第三版) 项目成本管理总结

前言 系统集成项目管理工程师考试&#xff08;简称软考中项&#xff09;&#xff0c;其中案例分析也是很大一部分考试内容&#xff0c;目前正在学习中&#xff0c;现总结一些可能会考到的知识点供大家参考。 1.1、项目成本管理总线索 1、项目成本失控的原因 &#xff08;1&a…

python库安装失败问题

pip install XXXX 报错信息如下 D:\Dev>pip install D:\Dev\robotlib-0.0.33.tar.gz DEPRECATION: Loading egg at d:\app\dev\python\lib\site-packages\fs11a3_package-1.3-py3.11.egg is deprecated. pip 24.3 will enforce this behaviour change. A possible replace…

【机器学习】使用Numpy实现神经网络训练全流程

文章目录 网络搭建前向传播反向传播损失计算完整代码 曾经在面试一家大模型公司时遇到的面试真题&#xff0c;当时费力写了一个小时才写出来&#xff0c;自然面试也挂了。后来复盘&#xff0c;发现反向传播掌握程度还是太差&#xff0c;甚至连梯度链式传播法则都没有弄明白。 网…

solidity-19-fallback

接收ETH receive和fallback receive和callback是solidity中两个特殊的回调函数&#xff0c;一个处理接收ETH,一个处理不存在的函数调用。本质上就是吧fallback拆成了两个回调函数。我暂时不知道什么是fallback fallback调用不存在的函数时会被调用也就是这个函数是不是等价于…