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

    • 用测试数据进行预测,并反归一化预测结果。
    • 计算预测误差。
相关推荐
盐真卿2 分钟前
python第八部分:高级特性(二)
java·开发语言
茉莉玫瑰花茶4 分钟前
C++ 17 详细特性解析(5)
开发语言·c++·算法
lly20240611 分钟前
《堆的 shift down》
开发语言
cpp_250116 分钟前
P10570 [JRKSJ R8] 网球
数据结构·c++·算法·题解
cpp_250123 分钟前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
黎雁·泠崖30 分钟前
【魔法森林冒险】2/14 抽象层设计:Figure/Person类(所有角色的基石)
java·开发语言
uesowys31 分钟前
Apache Spark算法开发指导-Factorization machines classifier
人工智能·算法
人工智能AI技术41 分钟前
预训练+微调:大模型的“九年义务教育+专项补课”
人工智能
aircrushin1 小时前
中国多模态大模型历史性突破:智源Emu3自回归统一范式技术深度解读
人工智能
Lsx_1 小时前
前端视角下认识 AI Agent 和 LangChain
前端·人工智能·agent