BP神经网络之matlab实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44719615/article/details/102497625
S1 = 6;
d = v';
U = mapminmax(d,0,1);     %数据的归一化
p=U(1:3,1:45);
t=U(4,1:45);
P_test=U(1:3,46:50);
net = newff(minmax(p),[S1,1],{'tansig','purelin'},'trainlm');
net = init(net);
net.trainParam.show = 10;
net.trainParam.epochs = 5000;
net.trainParam.goal = 1.0e-3;
net.trainParam.lr = 0.01;
net.divideFcn = '';
[net,tr] = train(net,p,t);
s_bp = sim(net,P_test)    % BP神经网络的仿真结果
f = U(4,46:50);
g = T1(:,46:50);
s = [];
for a = 1:5
    s(a) = abs(f(a) -g(a))/abs(f(a))        %相对误差
end
for i = 1:100
    if (s(1)<0.05 & s(2)<0.05 & s(3)<0.05 & s(4)<0.05 & s(5)<0.05) 
        disp('s的值为');
        s
        g
        break
    else
        net = newff(minmax(p),[S1,1],{'tansig','purelin'},'trainlm');
        net = init(net);
        net.trainParam.show = 10;
        net.trainParam.epochs = 5000;
        net.trainParam.goal = 1.0e-3;
        net.trainParam.lr = 0.01;
        net.divideFcn = '';
        [net,tr] = train(net,p,t);
        s_bp = sim(net,P_test);   % BP神经网络的仿真结果
        f = U(4,46:50);
        g = T1(:,46:50);
        s = [];
        for a = 1:5
            s(a) = abs(f(a) -g(a))/abs(f(a));
        end
        s
    end
end

可得到神经网络拟合曲线图。

设计 BP 网络的相关函数

1)神经元变换函数:线性变换函数 purelin、对数 S 型变换 函数 logsin、双曲线正切 S 型变换函数 tansig

2)BP 网络生成函数 newff :它是用来生成BP 神经网络并 进行初始化 , 可以确定网络层数 、每层中的神经元数和变换 函数。 这个函数有六个输入参数, 分别是:输入向量的范围、 网络结构、各层变换函数、训练算法函数、学习函数和性能函 数。输出参数为所生成的 BP 神经网络名 net 。 其语法为:net =newff(PR, [ S1 , S2 …, SN1] , [ TF1, TF2 , …TFN1] , BTF, BLE, PF) 其中:PR是一个由每个输入向量的最大最小值构成的 Rx2 矩阵, R 为输入神经元数目。 Si 是第 i 层网络的神经元个数, 网络共有 N1 层。 TFi 是第 i 层网络神经元的变换函数, 缺省为 tansig. BTF 是 BP 训练算法函数, 缺省为 trainlm. BLF 是学习函数, 缺省为 learngdm. PF 是性能函数, 缺省为mse. newff 在确定网络结构后会自动调用初始化函数 init , 用 缺省参数来初始化网络中各个权值和阈值 , 产生一个可训练 的前馈网络, 即该函数的返回值 net。 在 MATLAB 中, 神经网 络 net 当做对象(object)处理, 其属性用结构来定义。

3)初始化函数 init :它是对网络的连接权值和阈值进行 初始化。 newff 在创建网络对象的同时, 自动调动初始化函 数, 根据缺省的参数对网络进行连接权值和阈值初始化。

4)学习函数:提供多种学习函数, 用来修正权值和阈值。 基本的学习函数有:learngd 、 learngdm

5)性能函数:它是用来计算网络的输出误差 。 为训练提 供判据, 包括:函数 mae , 计算网络的平均绝对误差;函数 mse, 计算网络的均方误差;函数 msereg , 计算均方误差和权/ 阈值的加权;函数 sse , 计算网络的均方误差和

6)训练函数 train : BP 网络的训练初始化后, 可对它进行训练。 在MATLAB 中训练网络有两类模式:逐变模式和批处理模式。 在逐变模 式中, 每输入一个学习样本就根据网络性能指标函数对连接 权值和阈值更新一次。 在批处理模式中, 所有的学习样本都 学习完成后, 连接权值和阈值才被更新一次。 使用批处理模 式不需要为每一层的连接权值和阈值设定训练函数, 而只需 为整个网络指定一个训练函数, 使用起来相对方便, 而且许 多改进的快速训练算法只能采用批处理模式。 训练网络的函数是 train 按设置的 net.trainFcn 和 net. trainParam 参数来训练网络, 采用批处理方式进行网络的权值 和阈值修正, 最终达到设定的网络性能指标的要求。

7)BP 训练算法函数:它是根据网络的输入、目标期望输 出, 对由函数 newff 生成的 BP 网络进行计算, 修正其权值和 阈值, 最终达到设定的网络性能指标的要求。 不同的训练算 法函数对应不同的训练算法, 如 traingd 对应最基本梯度下降 法;traingdm 带有动量项的梯度下降法;traingdx 带有采用动量项的自适应算 法;用共轭梯度 法进行训练 的函数有: traincgf(采用 Fletcher -Reeves 搜索技术)、traincgp(采用 Polak -Ribiers 搜索技术)、traincgb(采用 Powell -Beale 搜索技术); trainbfg 是基于拟牛顿法的训练函数;trainlm 是用 Levenberg - Marquardt 数值优化法来实现误差反传算法的。 各算法的快 慢及内存要求依问题的复杂程度、训练集大小、网络的大小 及误差要求的不同而有所不同。 一般来讲, 对于含有几百个 权重的网络, Levenberg -Marquardt 算法有最快的收敛速度。 该算法需要大的内存, 可通过增大参数 mem -reduc 的值来 减少内存的使用量。 需要注意的是:减少内存使用量实际是 通过将雅可比矩阵分解为一个个小的亚矩阵来实现的, 每次 只计算其中一个亚矩阵, 这势必增加计算时间, 所以, 如果有 足够的内存, 应该将 mem -reduc 参数设为 1, 即每次都计算 整个雅可比矩阵。 拟牛顿算法的速度仅次于 Levenberg - Marquardt 算法而比共轭梯度法的速度快, 内存的需要量也介 于这二者之间。 在共轭梯度法中, traincgb 需要的内存数量最 多, 但通常也能最快收敛。 总地来讲, 基于共轭梯度法、拟牛 顿算法和 Levenberg-Marquardt 法等数值优化算法的训练函 数的效率比基于启发式算法的 traingd 、traingdm、traingdx 的效 率高。 以上的训练算法函数均在网络生成函数 newff 中预先 设置。

8)仿真函数 sim:可以用来计算网络在给定输入下的输 出。

9)绘图函数 poltperf :可以用来计算网络性能曲线

扫描二维码关注公众号,回复: 7628739 查看本文章

参考文献:罗成汉. 基于MATLAB神经网络工具箱的BP网络实现[J]. 计算机仿真, 2004, 21(5):109-111.

猜你喜欢

转载自blog.csdn.net/weixin_44719615/article/details/102497625