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

粒子群算法PSO优化BP神经网络(PSO-BP)回归预测——Python和MATLAB实现

下面是一个使用Python实现的粒子群算法(PSO)优化反向传播神经网络(BP)的示例代码。

以下是具体的代码实现:

```python
import numpy as np
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def sigmoid_derivative(x):
    return x * (1 - x)

# Feedforward Neural Network
class BP_Network:
    def __init__(self, input_size, hidden_size, output_size):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size

        # 权重和偏置初始化
        self.W1 = np.random.randn(input_size, hidden_size)
        self.b1 = np.random.randn(hidden_size)
        self.W2 = np.random.randn(hidden_size, output_size)
        self.b2 = np.random.randn(output_size)

    def predict(self, X):
        self.hidden_activation = sigmoid(np.dot(X, self.W1) + self.b1)
        self.output = np.dot(self.hidden_activation, self.W2) + self.b2
        return self.output

    def train(self, X, y, epochs, learning_rate):
        for _ in range(epochs):
            # Forward pass
            self.hidden_activation = sigmoid(np.dot(X, self.W1) + self.b1)
            output = np.dot(self.hidden_activation, self.W2) + self.b2
            
            # 计算误差
            error = y - output
            
            # Backward pass
            d_output = error  # 对输出层的误差
            d_hidden = d_output.dot(self.W2.T) * sigmoid_derivative(self.hidden_activation)

            # 更新权重和偏置
            self.W2 += self.hidden_activation.T.dot(d_output) * learning_rate
            self.b2 += np.sum(d_output, axis=0) * learning_rate
            self.W1 += X.T.dot(d_hidden) * learning_rate
            self.b1 += np.sum(d_hidden, axis=0) * learning_rate

# 粒子类
class Particle:
    def __init__(self, input_size, hidden_size, output_size):
        self.network = BP_Network(input_size, hidden_size, output_size)
        self.position = np.concatenate([self.network.W1.flatten(), self.network.b1, self.network.W2.flatten(), self.network.b2])
        self.velocity = np.random.rand(len(self.position)) * 0.1
        self.best_position = np.copy(self.position)
        self.best_score = float('inf')

    def evaluate(self, X, y):
        self.network.W1 = self.position[:self.network.input_size * self.network.hidden_size].reshape(self.network.input_size, self.network.hidden_size)
        self.network.b1 = self.position[self.network.input_size * self.network.hidden_size:self.network.input_size * self.network.hidden_size + self.network.hidden_size]
        self.network.W2 = self.position[self.network.input_size * self.network.hidden_size + self.network.hidden_size:-self.network.output_size].reshape(self.network.hidden_size, self.network.output_size)
        self.network.b2 = self.position[-self.network.output_size:]

        predictions = self.network.predict(X)
        error = np.mean((y - predictions) ** 2)
        return error

# 粒子群算法
def pso(X_train, y_train, num_particles=30, epochs=100, hidden_size=10):
    input_size = X_train.shape[1]
    output_size = y_train.shape[1]
    
    particles = [Particle(input_size, hidden_size, output_size) for _ in range(num_particles)]
    global_best_position = np.zeros(len(particles[0].position))
    global_best_score = float('inf')

    for iteration in range(epochs):
        for particle in particles:
            score = particle.evaluate(X_train, y_train)

            # 更新个人最佳
            if score < particle.best_score:
                particle.best_score = score
                particle.best_position = np.copy(particle.position)

            # 更新全局最佳
            if score < global_best_score:
                global_best_score = score
                global_best_position = np.copy(particle.position)

        # 更新速度和位置
        w = 0.5
        c1 = 1.0
        c2 = 1.0

        for particle in particles:
            r1 = np.random.rand(len(particle.position))
            r2 = np.random.rand(len(particle.position))
            particle.velocity = (w * particle.velocity +
                                 c1 * r1 * (particle.best_position - particle.position) +
                                 c2 * r2 * (global_best_position - particle.position))
            particle.position += particle.velocity

        print(f'Iteration {iteration + 1}, Global Best Score: {global_best_score}')

    return global_best_position

# 生成数据
X, y = make_regression(n_samples=1000, n_features=10, noise=0.1)
y = y.reshape(-1, 1)  # 确保输出为二维数组

# 数据归一化
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# PSO 优化 BP 神经网络
best_params = pso(X_train, y_train, num_particles=30, epochs=100, hidden_size=10)

# 从最佳参数中构建最终模型
best_network = BP_Network(input_size=X_train.shape[1], hidden_size=10, output_size=1)
best_network.W1 = best_params[:best_network.input_size * best_network.hidden_size].reshape(best_network.input_size, best_network.hidden_size)
best_network.b1 = best_params[best_network.input_size * best_network.hidden_size:best_network.input_size * best_network.hidden_size + best_network.hidden_size]
best_network.W2 = best_params[best_network.input_size * best_network.hidden_size + best_network.hidden_size:-1].reshape(best_network.hidden_size, 1)
best_network.b2 = best_params[-1:]

# 在测试集上预测
y_test_pred = best_network.predict(X_test)

# 计算均方误差
test_mse = np.mean((y_test - y_test_pred) ** 2)
print(f'Test MSE: {test_mse}')
```

### 代码解释

1. **数据生成与预处理**:使用`make_regression`生成模拟回归数据,归一化输入数据。
2. **BP网络实现**:定义了一个简单的前馈神经网络类,并实现了训练和预测功能。
3. **粒子类实现**:定义了粒子类,该类的每个实例都有自己的神经网络,位置(参数)、速度、最佳位置和最佳评分。
4. **PSO算法**:实现了PSO算法,通过评估每个粒子的表现来更新其位置和速度,并根据最佳表现更新全局最佳位置。
5. **模型训练与测试**:使用PSO优化BP神经网络后,预测测试集并计算均方误差。

### 注意事项

- 本示例中的神经网络和PSO实现是基本的,可以根据需求调整超参数和模型结构。
- 若处理更复杂的问题,建议考虑使用深度学习库如`TensorFlow`或`PyTorch`,并结合现有的优化算法库。
 

在MATLAB中,可以使用内置的神经网络工具箱来实现BP神经网络进行预测。以下是一个使用MATLAB创建和训练BP神经网络的示例代码。

### 1. 准备数据

首先,我们需要准备一些示例数据。这里我们将生成一些随机数据作为示例。

### 2. 创建和训练模型

以下是完整的MATLAB代码示例:

```matlab
% 生成示例数据
X = rand(1000, 20);  % 1000个样本,20个特征
y = rand(1000, 1);    % 1000个样本,1个目标

% 将数据分为训练集和测试集
trainRatio = 70/100;  % 70%用于训练
valRatio = 15/100;    % 15%用于验证
testRatio = 15/100;   % 15%用于测试

% 划分数据
[trainX, valX, testX, trainY, valY, testY] = ...
    dividerand(X, y, trainRatio, valRatio, testRatio);

% 创建一个前馈神经网络
hiddenLayerSize = 10;  % 隐藏层神经元数量
net = fitnet(hiddenLayerSize);

% 设置训练参数
net.performParam.regularization = 0.01;  % 正则化参数
net.trainParam.epochs = 1000;             % 最大训练周期
net.trainParam.goal = 1e-5;                % 停止条件

% 训练网络
[net, tr] = train(net, trainX', trainY');

% 使用验证集和测试集评估模型性能
valPredictions = net(valX');
testPredictions = net(testX');

% 计算均方误差
valMSE = perform(net, valY', valPredictions);
testMSE = perform(net, testY', testPredictions);

fprintf('Validation MSE: %.4f\n', valMSE);
fprintf('Test MSE: %.4f\n', testMSE);

% 绘制训练过程
figure;
plotperform(tr);
```

### 代码解释

1. **数据生成**:使用`rand`函数生成随机的特征和目标数据。
2. **数据划分**:使用`dividerand`函数将数据划分为训练集、验证集和测试集。
3. **网络创建**:使用`fitnet`创建一个前馈神经网络,指定隐藏层中神经元的数量。
4. **训练参数设置**:可以设置正则化参数、最大训练周期和停止条件等。
5. **模型训练**:使用`train`函数来训练网络。
6. **预测与评估**:对验证集和测试集进行预测,并计算均方误差MSE。
7. **结果可视化**:使用`plotperform`函数绘制训练过程中的性能曲线。

相关文章:

粒子群算法PSO优化BP神经网络(PSO-BP)回归预测——Python和MATLAB实现

下面是一个使用Python实现的粒子群算法&#xff08;PSO&#xff09;优化反向传播神经网络&#xff08;BP&#xff09;的示例代码。 以下是具体的代码实现&#xff1a; python import numpy as np from sklearn.datasets import make_regression from sklearn.model_selection…...

React-router路由配置及跳转

1、V6对比V5的修改内容 1、API: useNavigate 代替了useHistory 。 2、废弃了Route组件的exact属性。 3、组件 <Routes>代替了<Switch> 4、组件NavLink中移除了 activeStyle activeClassName 属性。 2、安装依赖react-router-dom npm install react-router-dom…...

vue3【实战】可编辑的脱敏信息

<script lang"ts" setup> import { ref, onMounted } from "vue"; let real_name ref("朝阳");let name ref("");onMounted(() > {name.value des_name(real_name.value); });function focusing() {name.value real_name…...

S71200 - 笔记

1 S71200 0 ProfiNet - 2 PLC编程 01.如何零基础快速上手S7-1200_哔哩哔哩_bilibili 西门子S7-1200PLC编程设计学习视频&#xff0c;从入门开始讲解_哔哩哔哩_bilibili...

linux系统查历史cpu使用数据(使用sar 查询cpu和网络占用最近1个月历史数据)。

一 sar 指令介绍 在 Linux 系统中&#xff0c;sar 是 System Activity Reporter 的缩写&#xff0c;是一个用于收集、报告和保存系统活动信息的工具。它是 sysstat 软件包的一部分&#xff0c;提供了丰富的系统性能数据&#xff0c;包括 CPU、内存、网络、磁盘等使用情况&am…...

Edge浏览器加载ActiveX控件

背景介绍 新版Edge浏览器也是采用Chromium内核&#xff0c;虽然没有谷歌浏览器市场占有率高&#xff0c;但是依托微软操作系统的优势&#xff0c;Edge浏览器还是发展很强劲&#xff0c;占据着市场第二的位置。随着微软停止服务IE浏览器&#xff0c;曾经风光无限的IE浏览器页退出…...

BUG与测试用例设计

一.软件测试的生命周期 需求分析→测试计划→测试设计,测试开发→测试执行→测试评估→上线→运行维护 二.BUG 1.bug的概念 (1)当且仅当规格说明(需求文档)是存在的并且正确,程序与规格说明之间的不匹配才是错误. (2)当需求规格说明书没有提到的功能,判断标准以最终用户为准…...

怎么在使用select2时,覆盖layui的下拉框样式

目录 1.覆盖下拉框样式代码 2.自定义样式 3.样式使用 1.覆盖下拉框样式代码 .layui-form-select .layui-select-title {border: none !important; /* 去除边框 */background-color: transparent !important; /* 去除背景色 */display: none;/* 其他你想要覆盖的样式 */} 2.自…...

MacOSM1 配置Miniconda环境,并设置自启动

文章目录 设置环境变量设置自启动参考 设置环境变量 cd vim .zshrc输入一下内容 # 配置Conda CONDA_HOME/Users/hanliqiang/miniconda3 PATH$CONDA_HOME/bin:$PATH生效配置 source .zshrc设置自启动 conda init zsh.zshrc 文件中将会出现以下内容 # >>> conda i…...

poi库简单使用(java如何实现动态替换模板Word内容)

目录 Blue留言&#xff1a; Blue的推荐&#xff1a; 什么是poi库&#xff1f; 实现动态替换 第一步&#xff1a;依赖 第二步&#xff1a;实现word模板中替换文字 模板word&#xff1a; 通过以下代码&#xff1a;&#xff08;自己建一个类&#xff0c;随意取名&#xf…...

机器人开源调度系统OpenTcs6二开-车辆表定义

前面已经知道opentcs 需要车辆的模型结构数据&#xff0c;将里面的数据结构化&#xff0c;已表的形式生成&#xff0c;再找一个开源的基础框架项目对车辆进行增删改的管理 表结构&#xff1a; CREATE TABLE Vehicle (id INT AUTO_INCREMENT PRIMARY KEY COMMENT 唯一标识符,n…...

麦歌恩MT6521-第三代汽车磁性角度传感器芯片

磁性编码芯片 -在线编程角度位置IC 描述&#xff1a; MT6521是麦歌恩微电子推出的新一代基于水平霍尔及聚磁片(IMC)技术原理的磁性角度和位置检测传感器芯片。该芯片内部包含了两对互成90放置的水平霍尔阵列及聚磁片&#xff0c;能够根据不同的型号配置来实现对XY&#xff0…...

【数据结构】堆,优先级队列

目录 堆堆的性质大根堆的模拟实现接口实现构造方法建堆入堆判满删除判空获取堆顶元素 Java中的PriorityQueue实现的接口构造方法常用方法PriorityQueue注意事项 练习 堆 如果有一个集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&#xff0c;kn-1}&#xff0c;把它的…...

2024 暑假友谊赛 2

Tree Queries - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路:LCA好题&#xff0c;也有看见用时间戳写的&#xff0c;不是很明白. 用LCA非常好写。 要想到,给出k个节点&#xff0c;要确定一条路径&#xff0c;使得给出的k个点要么在路径上&#xff0c;要么和路径中某点的…...

c++ 线程

在 C 中&#xff0c;std::thread 构造函数可以用于将参数传递给线程。这里是一个基本的示例&#xff0c;展示了如何使用 std::thread 来传递参数&#xff1a; #include <iostream> #include <thread>// 定义一个被线程调用的函数 void threadFunc(int arg1, doubl…...

【SpringBoot】URL映射之consumes和produces匹配、params和header匹配

4.2.3 consumes和produces匹配 //处理request Content-Type为"application/json"类型的请求 RequestMapping(value"/Content",methodRequestMethod.POST,consumes"application/json") public String Consumes(RequestBody Map param){ return…...

vscode配置django环境并创建django项目(全图文操作)

文章目录 创建项目工作路径下载python插件&#xff1a;创建虚拟环境1. 命令方式创建2. 图文方式创建 在虚拟环境中安装Django创建Django项目安装Django插件选择虚拟环境 创建项目工作路径 输入 code . 下载python插件&#xff1a; 创建虚拟环境 1. 命令方式创建 切换在工作目…...

(一)延时任务篇——延时任务的几种实现方式概述

前言 延时任务是我们在项目开发中经常遇到的场景&#xff0c;例如订单超时30分钟自动取消&#xff0c;邮件5分钟后通知等等&#xff0c;对于这样的应用场景&#xff0c;我们又该如何应对呢&#xff0c;尤其是在微服务环境下&#xff0c;如何保证我们的延迟任务并发问题以及数据…...

每天五分钟计算机视觉:目标检测模型从RCNN到Fast R-CNN的进化

本文重点 前面的课程中,我们学习了RCNN算法,但是RCNN算法有些慢,然后又有了基于RCNN的Fast-RCNN,Fast R-CNN是一种深度学习模型,主要用于目标检测任务,尤其在图像中物体的识别和定位方面表现出色。它是R-CNN系列算法的一个重要改进版本,旨在解决R-CNN中计算量大、速度慢…...

环境变量配置文件中两种路径添加方式

环境变量配置文件中两种路径添加方式 文章目录 环境变量配置文件中两种路径添加方式代码示例区别和作用 代码示例 export HBASE_HOME/opt/software/hbase-2.3.5 export PATH$PATH:$HBASE_HOME/binexport SPARK_HOME/opt/software/spark-3.1.2 export PATH$SPARK_HOME/bin:$PAT…...

【CTF | pwn篇】从栈溢出到ROP:ctfshow pwn实战技巧精讲

1. 栈溢出基础&#xff1a;从零开始理解漏洞利用 栈溢出是PWN领域最经典的漏洞类型之一&#xff0c;也是CTF比赛中出现频率最高的题型。我们先从一个最简单的例子开始&#xff0c;看看如何利用栈溢出漏洞控制程序执行流程。 1.1 栈的结构与函数调用 当程序调用函数时&#xff0…...

Qwen3Guard-Gen-8B真实案例:如何用AI模型自动拦截不当言论

Qwen3Guard-Gen-8B真实案例&#xff1a;如何用AI模型自动拦截不当言论 1. 引言&#xff1a;内容安全的新挑战 在数字内容爆炸式增长的今天&#xff0c;各类平台都面临着内容审核的巨大压力。传统的关键词过滤和规则匹配系统已经难以应对日益复杂的网络环境&#xff0c;特别是…...

解锁Dify工作流新潜能:四种并行模式实战解析

1. 为什么需要工作流并行化&#xff1f; 第一次用Dify构建工作流时&#xff0c;我就被它的可视化编排能力惊艳到了。但实际跑了几次发现&#xff0c;当处理复杂任务时&#xff0c;串行执行就像在高速公路上开拖拉机——明明有八车道却只开放一条。比如做新闻情感分析时&#xf…...

阿里通义Z-Image-Turbo WebUI图像生成模型:从安装到生成,一站式教程

阿里通义Z-Image-Turbo WebUI图像生成模型&#xff1a;从安装到生成&#xff0c;一站式教程 1. 引言 在当今数字内容创作蓬勃发展的时代&#xff0c;AI图像生成技术正以前所未有的速度改变着我们的创作方式。阿里通义实验室推出的Z-Image-Turbo模型&#xff0c;凭借其出色的图…...

DeepSeek-V3量化神优化:w4a8精度反超官方2.29%

DeepSeek-V3量化神优化&#xff1a;w4a8精度反超官方2.29% 【免费下载链接】DeepSeek-V3-0324-w4a8-mtp-QuaRot-per-channel 项目地址: https://ai.gitcode.com/Eco-Tech/DeepSeek-V3-0324-w4a8-mtp-QuaRot-per-channel 导语&#xff1a;国内大模型量化技术再获突破&am…...

文脉定序系统压力测试与性能监控方案

文脉定序系统压力测试与性能监控方案 最近不少朋友在部署完文脉定序系统后&#xff0c;都会来问我同一个问题&#xff1a;“服务上线了&#xff0c;心里还是没底&#xff0c;怎么知道它能扛住多少用户同时访问&#xff1f;平时运行稳不稳定&#xff1f;” 这确实是个很实际的问…...

YALMIP求解器报错看不懂?从verbose到debug,教你快速定位并解决优化问题

YALMIP求解器报错看不懂&#xff1f;从verbose到debug&#xff0c;教你快速定位并解决优化问题 当你满怀期待地运行YALMIP优化代码&#xff0c;却看到命令行突然跳出一片红色报错信息时&#xff0c;那种挫败感每个优化工程师都深有体会。"No feasible solution found"…...

如何用AnythingLLM打造你的智能文档聊天机器人:5大核心功能全解析

如何用AnythingLLM打造你的智能文档聊天机器人&#xff1a;5大核心功能全解析 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&…...

【vue2+onlyoffice】从零搭建文档预览与协同编辑环境

1. OnlyOffice基础认知与版本选择 第一次接触OnlyOffice时&#xff0c;我盯着官网琳琅满目的版本说明发了半小时呆。这就像去买车&#xff0c;销售给你介绍基础版、豪华版、旗舰版&#xff0c;每个版本都说着"更适合企业需求"的套话。经过三个项目的实战验证&#xf…...

【2026 Python并发新纪元】:从asyncio到subinterpreters再到Rust-Python混合调度——全栈工程师必须掌握的4层无锁架构

第一章&#xff1a;Python无锁GIL环境的范式革命传统CPython解释器受全局解释器锁&#xff08;GIL&#xff09;制约&#xff0c;即使在多核CPU上也无法实现真正的并行字节码执行。近年来&#xff0c;随着PyPy的STM分支、RustPython的无GIL设计&#xff0c;以及CPython官方在PEP…...