【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. 测试神经网络

    • 用测试数据进行预测,并反归一化预测结果。
    • 计算预测误差。
相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou2 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
小陈phd2 小时前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
Guofu_Liao3 小时前
大语言模型---LoRA简介;LoRA的优势;LoRA训练步骤;总结
人工智能·语言模型·自然语言处理·矩阵·llama
----云烟----4 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024064 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it4 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康4 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式