实验报告 课程名称 实验名称 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中)。 五、实验代码及代码分析
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. 理解神经网络在预测和拟合问题中的应用,这些实验展示了神经网络在不同领域中的应用,如函数拟合、时间序列预测和模式识别。我能够看到神经网络在这些问题上的潜力和灵活性,以及其在解决复杂问题和非线性关系建模方面的优势。 总的来说,这些实验让我更加深入地了解和掌握了神经网络的基本原理、建模过程和应用技巧,为我以后学习神经网络打下了好的基础。 | ||||||||||||||
教师评价 | 优 | 良 |
| 中 | 及格 | 不及格 | 教师签名 | 日期 |