用matlab函数实现BP神经网络验证实验

实验报告

课程名称          实验名称   BP神经网络验证实验     实验日期       

班级             姓名           学号         

  

一、实验目的

1.学习BP神经网络算法。

2.理解神经网络算法的应用。

3.实践体会三个示例的仿真实验中的matlab函数。

二、实验环境

Windows 11 , matlab2020

三、实验原理

BP(Backpropagation)神经网络是一种常用的前馈型神经网络,它的实验原理主要包括以下几个步骤:

1. 数据预处理:首先,准备输入数据和相应的目标输出数据。对于监督学习问题,输入数据是一组特征向量,而目标输出数据是对应的标签或预期的输出值。为了提高训练效果,通常需要对输入数据进行归一化或标准化处理。

2. 网络结构定义:确定神经网络的结构,包括输入层、隐含层(可以有多个)和输出层的节点数目,以及激活函数的选择。网络的结构决定了网络的拟合能力和表达能力。

3. 权值初始化:初始化网络的连接权值和偏置项。通常,可以随机初始化权值和偏置项,或者使用一些预定义的初始化方法。

4. 前向传播:通过将输入数据从输入层传递到输出层,计算网络的输出。对于每个样本,将输入数据通过网络的各个层,并使用激活函数对每个层的输出进行非线性变换。

5. 计算误差:将网络的输出与目标输出进行比较,计算预测误差。常见的误差函数包括均方误差(MSE)和交叉熵误差等。

6. 反向传播:根据误差信号,通过反向传播算法计算梯度并更新网络的权值和偏置项。反向传播基于链式法则,将误差信号从输出层向后传递到隐含层和输入层,以计算每个连接权值的梯度,并使用梯度下降等优化算法进行权值的调整。

7. 重复训练:重复执行前向传播和反向传播的过程,直到达到停止训练的条件,如达到最大训练轮数、误差小于某个阈值等。

8. 测试和应用:使用训练好的神经网络对新的输入数据进行预测或分类。将输入数据通过前向传播,获得网络的输出结果。

9. 评估和调优:评估神经网络的性能,并根据需要进行调优。可以使用交叉验证、测试集验证等方法来评估模型的泛化能力和准确性。

通过不断迭代训练过程,BP神经网络逐渐调整权值和偏置项,以提高对输入数据的拟合能力和预测准确性。

四、实验内容

1. (简答题)

BP神经网络验证实验,参考附件文件

(1)     关于MATLAB函数说明

(2)     包含三个实例的代码及结果图

(3)  验证实验,完成三个实例的仿真(至少完成两个),提交源代码(可以拷贝到Word中,或者提交.m代码文件)和实验结果图(拷贝到word中)。

五、实验代码及代码分析

  1. 拟合附加白噪声的正弦样本数据

clear all;

close all;

clc;

P = [-1:0.05:1];

T = sin(2*pi*P)+0.1*randn(size(P));

figure

plot(P,T,'+');

hold on;

plot(P,sin(2.*pi*P),':');

net = newff(minmax(P),[20,1],{'tansig','purelin'});

net.trainFcn = 'trainbr';

net.trainParam.show = 50;

net.trainParam.lr = 0.05;

net.trainParam.epochs = 500;

net.trainParam.goal = 1e-3;

[net,tr] = train(net,P,T);

A = sim(net , P);

E = T -A ;

MSE = mse(E);

plot(P,A,P,T,'+',P,sin(2*pi*P),':');

legend('样本点','标准正弦曲线','拟合正弦曲线');

代码的分析解释:

`clear all;`, `close all;`, `clc;`:这些命令用于清空MATLAB的工作空间、关闭所有打开的图形窗口,并清空命令窗口。

`P = [-1:0.05:1];`:定义输入样本数据P,这里创建了一个从-1到1的向量,步长为0.05,用于表示输入的取值范围。

`T = sin(2*pi*P)+0.1*randn(size(P));`:根据输入样本数据P生成目标输出数据T。这里使用正弦函数生成一个理想的正弦曲线,然后加上附加的高斯白噪声。

`figure`:创建一个新的图形窗口。

`plot(P,T,'+');`:绘制输入样本点P和对应的目标输出数据T,用加号表示。

 `hold on;`:保持图形窗口的绘图状态,用于在同一图形窗口中绘制多个曲线。

`plot(P,sin(2.*pi*P),':');`:绘制标准的正弦曲线,用冒号表示。

`net = newff(minmax(P),[20,1],{'tansig','purelin'});`:创建一个新的前馈神经网络(feedforward neural network),该网络具有输入层、一个包含20个节点的隐含层和一个输出层。激活函数分别使用双曲正切函数(tansig)和线性函数(purelin)。

`net.trainFcn = 'trainbr';`:指定神经网络的训练函数为'BFGS-Quasi-Newton'算法,即逆拟牛顿法。

`net.trainParam.show = 50;`:设置每隔50个训练迭代显示一次训练进度。

`net.trainParam.lr = 0.05;`:设置学习率为0.05,控制权值更新的步长。

`net.trainParam.epochs = 500;`:设置最大训练轮数为500。

`net.trainParam.goal = 1e-3;`:设置训练的目标误差为1e-3。

`[net,tr] = train(net,P,T);`:使用输入样本数据P和目标输出数据T对神经网络进行训练,并返回训练后的网络net和训练记录tr。

`A = sim(net , P);`:使用训练好的神经网络对输入样本数据P进行模拟,得到网络的输出结果A。

`E = T -A ;`:计算模拟输出A与目标输出数据T之间的误差。

`MSE = mse(E);`:计算误差的均方误差(MSE)。

`plot(P,A,P,T,'+',P,sin(2*pi*P),':');`:在图形窗口中绘制拟合后的正弦曲线,包括输入样本点、网络输出A、目标输出数据T和标准正弦曲线。

`legend('样本点','标准正弦曲线','拟合正弦曲线');`:添加图例,用于标识图中的不同曲线。

2.某药品的月度销售情况预测

clear all;

close all;

clc;

p=[2056 2395 2600 2298 1634 1600 1873 1478 1900

   2395 2600 2298 1634 1600 1873 1478 1900 1500

   2600 2298 1634 1600 1873 1478 1900 1500 2046];

t=[2298 1634 1600 1873 1478 1900 1500 2046 1556];

pmax=max (max(p));

pmin = min (min (p));

 P = (p-pmin)./(pmax-pmin);

tmax =max(t);

tmin=min(t);

T=(t-tmin)./(tmax-tmin);

net=newff(minmax(P),[5,1],{'tansig','logsig'},'traingdx')

net.trainParam.show=50;

net.trainParam.lr=0.05;

net.trainParam.epochs=1000;

net.trainParam.goal=1e-3;

[net,tr]=train(net,P,T);

A = sim(net,P);

a=A.*(tmax-tmin)+tmin;

x=4:12;

figure

plot(x,t,'+');

hold on;

plot(x,a,'or');

hold off

xlabel('月份')

ylabel('销量')

legend('实际销量','预测销量');

代码的分析解释:

`clear all;`, `close all;`, `clc;`:这些命令用于清空MATLAB的工作空间、关闭所有打开的图形窗口,并清空命令窗口。

`p=[2056 2395 2600 2298 1634 1600 1873 1478 1900

   2395 2600 2298 1634 1600 1873 1478 1900 1500

   2600 2298 1634 1600 1873 1478 1900 1500 2046];`:定义输入样本数据p,这里是一个包含多个月份销售数据的矩阵,每列代表一个月份。

`t=[2298 1634 1600 1873 1478 1900 1500 2046 1556];`:定义目标输出数据t,这里是一个包含实际销售数据的向量,与输入样本数据p对应。

`pmax=max (max(p));`:计算输入样本数据p的最大值。

`pmin = min (min (p));`:计算输入样本数据p的最小值。

`P = (p-pmin)./(pmax-pmin);`:对输入样本数据进行归一化处理,将数据范围映射到[0,1]之间。

`tmax =max(t);`:计算目标输出数据t的最大值。

`tmin=min(t);`:计算目标输出数据t的最小值。

`T=(t-tmin)./(tmax-tmin);`:对目标输出数据进行归一化处理,将数据范围映射到[0,1]之间。

`net=newff(minmax(P),[5,1],{'tansig','logsig'},'traingdx')`:创建一个新的前馈神经网络(feedforward neural network),该网络具有输入层、一个包含5个节点的隐含层和一个输出层。激活函数分别使用双曲正切函数(tansig)和逻辑sigmoid函数(logsig)。

`net.trainParam.show=50;`:设置每隔50个训练迭代显示一次训练进度。

`net.trainParam.lr=0.05;`:设置学习率为0.05,控制权值更新的步长。

`net.trainParam.epochs=1000;`:设置最大训练轮数为1000。

`net.trainParam.goal=1e-3;`:设置训练的目标误差为1e-3。

`[net,tr]=train(net,P,T);`:使用输入样本数据P和目标输出数据T对神经网络进行训练,并返回训练后的网络net和训练记录tr。

`A = sim(net,P);`:使用训练好的网络对输入样本数据进行模拟,得到网络的输出结果A。

`a=A.*(tmax-tmin)+tmin;`:对网络的输出结果进行反归一化处理,将结果映射回原始的销售数据范围。

`x=4:12;`:定义绘图的横坐标范围,代表月份。

`figure`:创建一个新的图形窗口。

`plot(x,t,'+');`:在图形窗口中绘制实际销量数据,用加号表示。

`hold on;`:保持当前图形窗口,不清除已有的图形。

`plot(x,a,'or');`:在图形窗口中绘制预测销量数据,用红色圆圈表示。

`hold off;`:关闭图形窗口的保持状态。

`xlabel('月份')`:设置x轴标签为"月份"。

`ylabel('销量')`:设置y轴标签为"销量"。

`legend('实际销量','预测销量');`:添加图例,用于标识图中的不同数据。

3.某地区公路运力数据预测

clear all;

close all;

clc;

sqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09...

    39.13 39.99 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];

sqjdcs =[0.6 0.75 0.85 0.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2...

2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1];

sqglmj = [0.09 0.11 0.11 0.14 0.20 0.23 0.23 0.32 0.32 0.34 0.36...

0.36 0.38 0.49 0.56 0.59 0.59 0.67 0.69 0.79];

glkyl = [5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 ...

21024 19490 20433 22598 25107 33442 36836 40548 42927 43462];

glhyl = [1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 ...

11203 10524 11115 13320 16762 18673 20724 20803 21804];

p = [sqrs;sqjdcs; sqglmj];

t = [glkyl ; glhyl];

[P,minp,maxp,T, mint, maxt]= premnmx(p,t);

net = newff(minmax(P),[8,2],{'tansig','purelin'},'traingdx');

net.trainParam .show =50;

net.trainParam.lr = 0.035;

net.trainParam . epochs = 2000;

net.trainParam. goal = 1e-3;

[net,tr]=train (net,P,T);

A=sim (net, P);

a = postmnmx(A,mint, maxt);

inputWeights = net.IW(1,1);

inputbias = net.b{1};

layerWeights = net.LW{2,1};

layerbias = net.b{2};

x= 1990:2009;

newk =a(1,:);

newh =a (2,:);

figure

plot(x, newk, ' r-o',x, glkyl, 'b--+')

legend('网络输出客运量','实际客运量');

xlabel('年份');ylabel('客运量/万人');

figure

plot (x, newh, 'r-o',x, glhyl, 'b--+')

legend ('网络输出货运量','实际货运量');

xlabel('年份');ylabel('货运量/万吨');

pnew =[73.39 75.55;3.9 4.1;0.98 1.02];

SamNum = size(pnew, 2);

pnewn = tramnmx (pnew , minp,maxp);

HiddenOut =tansig(inputWeights * pnewn + repmat(inputbias,1,SamNum));

anewn = purelin(layerWeights * HiddenOut + repmat(layerbias,1,SamNum));

anewn = postmnmx(anewn , mint , maxt);

代码的分析解释:

 `clear all;`, `close all;`, `clc;`:这些命令用于清空MATLAB的工作空间、关闭所有打开的图形窗口,并清空命令窗口。

`sqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09...

    39.13 39.99 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];`:定义输入特征数据sqrs,表示一组特征值。

`sqjdcs =[0.6 0.75 0.85 0.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2...

2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1];`:定义输入特征数据sqjdcs,表示一组特征值。

 `sqglmj = [0.09 0.11 0.11 0.14 0.20 0.23 0.23 0.32 0.32 0.34 0.36...

0.36 0.38 0.49 0.56 0.59 0.59 0.67 0.69 0.79];`:定义输入特征数据sqglmj,表示一组特征值。

`glkyl = [5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 ...

21024 19490 20433 22598 25107 33442 36836 40548 42927 43462];`:定义目标输出数据glkyl,表示一组目标值。

`glhyl = [1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 ...

11203 10524 11115 13320 16762 18673 20724 20803 21804];`:定义目标输出数据glhyl,表示一组目标值。

 `p = [sqrs;sqjdcs; sqglmj];`:将输入特征数据合并为一个矩阵p,每行代表一个特征。

 `t = [glkyl ; glhyl];`:将目标输出数据合并为一个矩阵t,每行代表一个目标。

`[P,minp,maxp,T, mint, maxt]= premnmx(p,t);`:对输入特征数据和目标输出数据进行最小-最大归一化处理,得到归一化后的数据P和相应的最小值、最大值。

`net = newff(minmax(P),[8,2],{'tansig','purelin'},'traingdx');`:创建一个新的前馈神经网络net,定义了网络的结构和激活函数类型。

`net.trainParam .show =50;

net.trainParam.lr = 0.035;

net.trainParam . epochs = 2000;

net.trainParam. goal = 1e-3;`:设置网络的训练参数,包括显示间隔、学习率、训练迭代次数和训练目标。

 `[net,tr]=train (net,P,T);`:使用训练数据P和目标数据T对神经网络进行训练,并返回训练后的网络net和训练记录tr。

`A=sim (net, P);`:使用训练好的网络对输入样本数据进行模拟,得到网络的输出结果A。

 `a = postmnmx(A,mint, maxt);`:对网络的输出结果进行反归一化处理,将结果映射回原始的目标数据范围。

`inputWeights = net.IW(1,1);`:获取输入层到隐藏层的权重矩阵。

`inputbias = net.b{1};`:获取隐藏层的偏置向量。

 `layerWeights = net.LW{2,1};`:获取隐藏层到输出层的权重矩阵。

 `layerbias = net.b{2};`:获取输出层的偏置向量。

`x= 1990:2009;`:定义绘图的横坐标范围,代表年份。

`newk =a(1,:);`:从反归一化后的输出结果中提取客运量数据。

`newh =a (2,:);`:从反归一化后的输出结果中提取货运量数据。

 `figure`:创建一个新的图形窗口。

`plot(x, newk, ' r-o',x, glkyl, 'b--+')`:在图形窗口中绘制网络输出的客运量和实际客运量的折线图,红色圆圈表示网络输出,蓝色加号表示实际数据。

`legend('网络输出客运量','实际客运量');`:添加图例,用于标识图中的不同数据。

 `xlabel('年份');ylabel('客运量/万人');`:设置x轴标签为"年份",y轴标签为"客运量/万人"。

`figure`:创建一个新的图形窗口。

 `plot (x, newh, 'r-o',x, glhyl, 'b--+')`:在图形窗口中绘制网络输出的货运量和实际货运量的折线图,红色圆圈表示网络输出,蓝色加号表示实际数据。

`legend ('网络输出货运量','实际货运量');`:添加图例,用于标识图中的不同数据。

`xlabel('年份');ylabel('货运量/万吨');`:设置x轴标签为"年份",y轴标签为"货运量/万吨"。

`pnew =[73.39 75.55;3.9 4.1;0.98 1.02];`:定义新的输入特征数据,用于进行预测。

`SamNum = size(pnew, 2);`:获取预测数据的样本数量。

`pnewn = tramnmx (pnew , minp,maxp);`:对新的输入特征数据进行最小-最大归一化处理。

`HiddenOut =tansig(inputWeights * pnewn + repmat(inputbias,1,SamNum));`:计算新数据在隐藏层的输出结果,使用了激活函数tansig。

`anewn = purelin(layerWeights * HiddenOut + repmat(layerbias,1,SamNum));`:计算新数据在输出层的输出结果,使用了线性激活函数purelin。

`anewn = postmnmx(anewn , mint , maxt);`:对预测结果进行反归一化处理,将结果映射回原始的目标数据范围。

最后,可以根据需要将预测结果进行进一步的处理或显示。

六、实验结果

1.拟合附加白噪声的正弦样本数据

2.某药品的月度销售情况预测

3.某地区公路运力数据预测

七、实验体会

通过这三个仿真实验,我获得了以下的收获和体会:

1. 熟悉了神经网络的建模和训练过程,这些实验使我更加熟悉了神经网络的建模步骤,包括数据准备、网络结构的选择、训练参数的设置以及训练和预测过程的实施。我了解了如何使用不同的激活函数、训练算法和参数调整策略来优化神经网络的性能。

2. 理解了数据预处理的重要性,这些实验中对数据进行了归一化处理,将数据转换到一个统一的范围,以提高神经网络的训练效果和泛化能力。归一化可以使得不同特征之间的数值范围相似,避免了某些特征对网络训练的主导影响,提高了网络的稳定性和收敛速度。

3. 观察和分析实验结果,通过对实验结果的观察和分析,我能够评估神经网络的性能和拟合能力。通过比较网络输出和实际数据,我可以了解网络的预测能力和误差情况。这帮助我判断网络是否达到了预期的训练目标,并进一步优化网络结构和参数设置。

4. 理解神经网络在预测和拟合问题中的应用,这些实验展示了神经网络在不同领域中的应用,如函数拟合、时间序列预测和模式识别。我能够看到神经网络在这些问题上的潜力和灵活性,以及其在解决复杂问题和非线性关系建模方面的优势。

总的来说,这些实验让我更加深入地了解和掌握了神经网络的基本原理、建模过程和应用技巧,为我以后学习神经网络打下了好的基础。

教师评价   

  

及格

不及格

教师签名

日期

  • 25
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaojiwazi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值