首页 > 编程语言 >BP神经网络及其Python和MATLAB实现预测

BP神经网络及其Python和MATLAB实现预测

时间:2024-07-29 13:25:39浏览次数:10  
标签:训练 Python 神经网络 train BP MATLAB test

BP神经网络及其Python和MATLAB实现预测

引言

BP神经网络(Back Propagation Neural Network),即反向传播神经网络,是一种通过反向传播算法进行监督学习的多层前馈网络。这种网络能够通过不断地调整和改变神经元的连接权重,达到对特定任务的学习和优化。由于其高度的灵活性和适应性,BP神经网络在模式识别、函数逼近、优化问题等多个领域有着广泛的应用。本文将详细介绍BP神经网络的基本原理,并通过Python和MATLAB的示例代码展示其在时间序列预测中的应用。

BP神经网络的基本原理

BP神经网络主要由输入层、隐藏层和输出层组成。输入层接收外部信号和数据,隐藏层进行信息处理,输出层产生预测结果。在训练过程中,网络通过前向传播计算输出值,并通过反向传播算法调整权重和偏置,以减小输出误差。

1. 前向传播

在前向传播过程中,输入数据通过输入层进入网络,经过隐藏层处理,最后由输出层输出预测结果。每个神经元接收来自前一层神经元的加权输入,并通过激活函数计算输出。输出层的输出即为网络的预测值。

2. 反向传播

反向传播是BP神经网络的核心算法,用于根据输出误差调整网络的权重和偏置。首先,计算输出层的误差,然后利用误差反向传播到隐藏层,再逐层向前传播,直到输入层。在反向传播过程中,使用梯度下降等优化算法来更新权重和偏置,以减小误差。

Python实现BP神经网络预测

在Python中,我们可以使用Keras库来构建和训练BP神经网络。Keras是一个高层神经网络API,它可以运行在TensorFlow、CNTK或Theano之上,以简化神经网络的构建、训练和评估过程。

示例代码

以下是一个使用Keras库构建简单BP神经网络进行时间序列预测的示例代码。

import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split

# 随机生成模拟数据
np.random.seed(42)
input_dim = 1
output_dim = 1
X = np.random.rand(1000, input_dim)
y = 3 * X ** 2 + 0.5 * np.sin(2 * np.pi * X)

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

# 创建Sequential模型
model = Sequential()
model.add(Dense(64, activation='relu', input_shape=(input_dim,)))
model.add(Dense(32, activation='relu'))
model.add(Dense(output_dim, activation='linear'))

# 编译模型
model.compile(loss='mean_squared_error', optimizer='adam')

# 训练模型
history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_split=0.2)

# 使用模型进行预测
predictions = model.predict(X_test)

# 可视化预测结果与实际值对比
plt.figure(figsize=(10, 6))
plt.scatter(range(1, len(y_test) + 1), y_test, color='blue', linewidth=1, label='Actual Values')
plt.plot(range(1, len(y_test) + 1), predictions, color='red', linewidth=1, label='Predictions')
plt.xlabel('Input Feature')
plt.ylabel('Output Feature')
plt.legend()
plt.title('Actual vs Predicted Values')
plt.savefig('plot.png')

# 计算并打印RMSE
from sklearn.metrics import mean_squared_error
rmse = np.sqrt(mean_squared_error(y_test, predictions))
print(f"Root Mean Squared Error (RMSE): {rmse:.2f}")

在这个示例中,我们首先生成了一些非线性相关的数据,并将其划分为训练集和测试集。然后,我们构建了一个包含两个隐藏层的BP神经网络,并使用均方误差作为损失函数和Adam优化器来训练模型。最后,我们使用训练好的模型对测试集进行预测,并可视化预测结果与实际值的对比。

MATLAB实现BP神经网络预测

MATLAB是一个广泛应用于数学、工程和科学计算的商业数学软件,内置了大量用于神经网络设计的工具箱,使得在MATLAB中实现BP神经网络变得相对容易。

示例代码

以下是一个使用MATLAB的Neural Network Toolbox来构建和训练BP神经网络进行时间序列预测的示例代码。

% 清理环境
clear; clc; close all;

% 随机生成模拟数据
rng(42); % 设置随机数生成器种子
input_dim = 1;
output_dim = 1;
X = rand(1000, input_dim);
y = 3 * X.^2 + 0.5 * sin(2 * pi * X);

% 划分训练集和测试集
cv = cvpartition(size(X, 1), 'HoldOut', 0.2);
idxTrain = training(cv);
idxTest = test(cv);
X_train = X(idxTrain, :);
y_train = y(idxTrain);
X_test = X(idxTest, :);
y_test = y(idxTest);

% 创建BP神经网络
net = feedforwardnet(10); % 创建一个具有10个神经元的隐藏层的网络

% 配置训练参数
net.trainFcn = 'trainlm'; % 使用Levenberg-Marquardt优化算法
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

% 训练网络
[net, tr] = train(net, X_train', y_train'); % 注意MATLAB要求输入是列向量

% 使用训练好的网络进行预测
y_pred = net(X_test');

% 可视化预测结果与实际值对比
figure;
plot(y_test, 'bo-', 'DisplayName', 'Actual Values');
hold on;
plot(y_pred, 'r*-', 'DisplayName', 'Predictions');
legend show;
xlabel('Sample Index');
ylabel('Output Value');
title('Actual vs Predicted Values');
grid on;

% 计算并打印RMSE
rmse = sqrt(mean((y_pred - y_test).^2));
fprintf('Root Mean Squared Error (RMSE): %.2f\n', rmse);

在这个MATLAB示例中,我们首先使用rng函数设置了随机数生成器的种子,以确保每次运行代码时生成的数据相同。然后,我们生成了一些模拟数据,并将其划分为训练集和测试集。接着,我们使用feedforwardnet函数创建了一个具有单个隐藏层的BP神经网络,该隐藏层包含10个神经元。之后,我们设置了网络的训练函数为Levenberg-Marquardt优化算法,并配置了训练参数。

在训练网络时,我们使用了train函数,并注意到MATLAB要求输入数据是列向量,因此我们对X_trainy_train进行了转置。训练完成后,我们使用训练好的网络对测试集进行了预测,并将预测结果与实际值进行了可视化对比。最后,我们计算了预测结果的均方根误差(RMSE),并将其打印到控制台。

通过这个MATLAB示例,我们可以看到使用MATLAB的Neural Network Toolbox来构建和训练BP神经网络进行时间序列预测是相对直观和简单的。这个工具箱提供了丰富的函数和工具来支持神经网络的设计、训练和评估,使得用户可以轻松地实现复杂的神经网络模型。

标签:训练,Python,神经网络,train,BP,MATLAB,test
From: https://blog.csdn.net/hai40587/article/details/140747034

相关文章

  • 为什么Python要对引用非容器类型的类型实现循环GC
    检查文档:支持循环垃圾收集Python对检测和收集涉及循环引用的垃圾的支持需要对象类型的支持,这些对象类型是其他对象的“容器”,这些对象也可能是容器不存储对其他对象的引用或仅存储对原子类型(例如数字或字符串)的引用的类型不需要为垃圾收集提供任何显......
  • 如何在 Visual Studio Code 中降级终端中的 python?
    我有一段代码需要运行,但它仅与tensorflow1.3、1.4和1.5兼容。我想我需要降级python才能运行它,但是终端有python3.10我尝试创建虚拟环境失败,但终端仍然说它正在使用python3.10,所以我仍然无法运行代码有什么我可以做的吗?是对的,创建虚拟环境是运行不同Python版本代......
  • python-小李帮老师改错(赛氪OJ)
    [题目描述]老师给小理发了一封电子邮件,任务如下。写一个程序,给你 n 个数,输出 X。X=num1p1​​+num2p2​​+⋯+numnpn​​。                 num1​,num2​,⋯⋯,numn​ 都是整数,p1​,p2​,⋯⋯pn​ 都是一位数。但是出现了一些玄学错误,......
  • 保护从 py2exe python 生成的二进制文件
    我的项目需要将我的python文件转换为py2exe。公平地说,我的py2exe正在工作。假设我的二进制文件名为“test.exe”。我知道我的test.exe包含我的python文件的所有pyc文件。我想要做的是,保护我的text.exe,这样我的源代码就不会被看到,换句话说,我不希望它被反编译回来,我该怎......
  • python 将数字前面的字符替换为数字后面的新字符
    我有一些字符串看起来像:*.rem.1.gz和*.rem.2.gz我想将其替换为*.1.trim.gz和*.2.trim.gz1号文件和2号文件相互配对,我想创建一个单独的字符串来同时包含这两个文件。importosallfiles=os.listdirpair=[x.replace("rem.(\d+)","(\d+).trim")forxinall......
  • 使用python打开UNC文件
    如何使用python通过路径打开网络计算机上的文件?我当前正在使用os.startfile但随后出现错误winerror2:无法打开文件。文件路径是正确的,我可以通过win+R打开该文件。感谢您提供的任何帮助。importwin32wnetimportosdefopen_unc_path(unc_path,usern......
  • MatLab学习笔记
    目录前言:入门:基础知识点:常用命令行:特殊变量:数学运算函数:向量:创建:索引:修改与删除:矩阵:创建:行列索引:线性索引:修改与删除:拼接与重复:重构与重排:reshape:按照线性索引将矩阵重构sort:sortrows:flip、fliplr、flipud:rot90:前言:MatLab与Python对比:MatLab:数值计算、微分方程求解、仿真等......
  • Python环境:深入理解与构建实践
    Python环境:深入理解与构建实践在当今的软件开发领域中,Python以其简洁的语法、丰富的库支持和广泛的应用场景,成为了众多开发者、数据科学家、机器学习工程师及自动化测试人员的首选语言。然而,要高效地使用Python进行项目开发,深入理解并合理构建Python环境是至关重要的。本文......
  • 界面自动化测试录制工具,让python selenium自动化测试脚本开发更加方便
    自动化测试中,QTP和seleniumIDE都支持浏览器录制与回放功能,简单的来说就像一个记录操作步骤的机器人,可以按照记录的步骤重新执行一遍,这就是脚本录制。个人觉得传统录制工具有些弊端,加上要定制支持我自己的自动化框架(python单机版自动化测试框架源代码),所以自己用javascript写了一个......
  • Python 面试常问问题及应用场景解析
    引言随着Python在数据科学、Web开发、自动化脚本、机器学习等领域中的广泛应用,越来越多的公司开始寻找具备Python技能的人才。因此,在Python面试中,面试官通常会通过一系列问题来评估应聘者的编程基础、问题解决能力和对Python特性的理解程度。本文将涵盖Python面试中最常见的......