【Matlab】-- BP反向传播算法


文章目录

文章目录

  • [00 写在前面](#00 写在前面)
  • [01 BP算法介绍](#01 BP算法介绍)
  • [02 基于Matlab的BP算法](#02 基于Matlab的BP算法)
  • [03 代码解释](#03 代码解释)

00 写在前面

BP算法可以结合鲸鱼算法、飞蛾扑火算法、粒子群算法、灰狼算法、蝙蝠算法等等各种优化算法一起,进行回归预测或者分类预测。

01 BP算法介绍

BP(Backpropagation,反向传播)算法是一种用于训练人工神经网络的监督学习算法。它是基于梯度下降法,通过反向传播误差来调整网络的权值和阈值,以最小化输出误差。BP算法是神经网络领域最经典和广泛使用的算法之一。

02 基于Matlab的BP算法

matlab 复制代码
%% 输入
% x:一个个体的初始权值和阈值
% P_train:训练样本输入
% T_train:训练样本输出
% hiddennum:隐含层神经元数
% P_test:测试样本输入
% T_test:测试样本期望输出
%% 输出
% err:预测样本的预测误差的范数

function [err,T_sim]=BpFunction1(x,P_train,T_train,hiddennum,P_test,T_test)
inputnum=size(P_train,2);                             % 输入层神经元个数
% hiddennum=2*inputnum+1;                           % 隐含层神经元个数
outputnum=size(T_train,2);                                % 输出层神经元个数

%% 数据归一化
[p_train,ps_train]=mapminmax(P_train',0,1);
p_test=mapminmax('apply',P_test',ps_train);
[t_train,ps_output]=mapminmax(T_train',0,1);

%% 开始构建BP网络
net=newff(p_train,t_train,hiddennum);               %隐含层为hiddennum个神经元
%设定参数网络参数
net.trainParam.epochs=1000;
net.trainParam.goal=1e-3;
net.trainParam.lr=0.01;
net.trainParam.showwindow=false;                    %高版MATLAB使用 不显示图形框

%% BP神经网络初始权值和阈值
w1num=inputnum*hiddennum;                                           %输入层到隐层的权值个数
w2num=outputnum*hiddennum;                                          %隐含层到输出层的权值个数
% x=2*rand(1,w1num+hiddennum+w2num+outputnum)-1;                      %随即生成权值
W1=x(1:w1num);                                                      %初始输入层到隐含层的权值
B1=x(w1num+1:w1num+hiddennum);                                      %隐层神经元阈值
W2=x(w1num+hiddennum+1:w1num+hiddennum+w2num);                      %隐含层到输出层的权值
B2=x(w1num+hiddennum+w2num+1:w1num+hiddennum+w2num+outputnum);      %输出层阈值
net.iw{1,1}=reshape(W1,hiddennum,inputnum);                         %为神经网络的输入层到隐含层权值赋值
net.lw{2,1}=reshape(W2,outputnum,hiddennum);                        %为神经网络的隐含层到输出层权值赋值
net.b{1}=reshape(B1,hiddennum,1);                                   %为神经网络的隐层神经元阈值赋值
net.b{2}=reshape(B2,outputnum,1);                                   %为神经网络的输出层阈值赋值

%% 开始训练
net = train(net,p_train,t_train);

%% 测试网络
t_sim = sim(net,p_test);
T_sim = mapminmax('reverse',t_sim,ps_output);   %反归一化
T_sim=T_sim';
err=norm(T_sim-T_test);                         %预测结果与测试结果差的范数,范数越小说明预测得越准确,如果范数为0,说明预测得完全准确

03 代码解释

输入参数

  • x:一个包含神经网络初始权值和阈值的向量。
  • P_train:训练样本的输入数据。
  • T_train:训练样本的输出数据。
  • hiddennum:隐含层神经元的个数。
  • P_test:测试样本的输入数据。
  • T_test:测试样本的期望输出。

输出参数

  • err:预测误差的范数。
  • T_sim:测试样本的预测输出。

步骤

  1. 初始化参数

    • 计算输入层和输出层神经元的个数。
  2. 数据归一化

    • 使用 mapminmax 对训练和测试数据进行归一化处理。
  3. 创建神经网络

    • 使用 newff 创建一个BP神经网络,设置隐含层神经元个数。
  4. 设置网络训练参数

    • 设定最大训练次数,训练目标误差和学习率。
  5. 初始化权值和阈值

    • 从输入参数 x 中提取初始权值和阈值,并赋值给网络。
  6. 训练神经网络

    • 使用训练数据训练网络。
  7. 测试神经网络

    • 用测试数据进行预测,并反归一化预测结果。
    • 计算预测误差。
相关推荐
PingCAP12 分钟前
TiDB 亮相宜昌“医院‘云数智’技术实践研讨及成果展示交流会”,探讨国产化 + AI 背景下的数据库新趋势
数据库·人工智能·tidb
文弱_书生12 分钟前
再谈图像处理中的傅里叶变换
图像处理·人工智能·傅里叶变换
wuqingshun31415914 分钟前
蓝桥杯 切割
数据结构·c++·算法·职场和发展·蓝桥杯
钡铼技术物联网关15 分钟前
ARM边缘计算时代:BLIoTLink如何打通设备互联任督二脉
arm开发·人工智能·边缘计算
艾妮艾妮17 分钟前
C语言常见3种排序
java·c语言·开发语言·c++·算法·c#·排序算法
百度Geek说18 分钟前
前沿多模态模型开发与应用实战3:DeepSeek-VL2多模态理解大模型算法解析与功能抢先体验
算法
小王努力学编程19 分钟前
动态规划学习——回文子串系列问题【C++】
c++·学习·算法·leetcode·动态规划
小李独爱秋21 分钟前
机器学习开发全流程详解:从数据到部署的完整指南
人工智能·机器学习
A_ugust__23 分钟前
vue3项目使用 python +flask 打包成桌面应用
开发语言·python·flask
Dovis(誓平步青云)24 分钟前
深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本
人工智能·深度学习·机器学习·数据挖掘·服务发现·智慧城市