1.0 红外光传感器检测数据融合
- 由于红外光在介质中的传播速度受到温度等环境因素影响,为获得较准确的测量结果需要对红外测距系统的测量数据进行处理。
- 为确定某一红外测距传感器系统的数据处理算法,利用该测距系统进行如下实验:在不同温度下将目标放置不同的距离分别进行测距,每一温度下对同一目标连续测量5次,测量的实验数据见附表所示。
- 请利用BP神经网络完成该系统的数据处理。
注:为说明问题上述数据扩大了温度对结果的影响。
2.0 网络结构设计:
- 由于输入向量有2个元素、输出向量有1个元素,所以网络输入层的神经元有2个,输出层神经元数目为1。
- 神经网络是误差后身传播神经网络,其隐含层结构的层数与各层的节点数直接影响网络性能的优劣。若隐层数较多,网络所表达的映射就越复杂,不仅增大计算量,而且易导致数据失真;若各隐含层的节点数较多,会使其学习时间过长,误差也不一定最小,若节点数较少,会导致网络容错性较差,局部极小就多。因此,隐含层是网络结构设计的重要问题。
3.0 网络结构设计:
- 隐含层数设计:
- 隐含层的层数应大于1层,可由下式试算:
其中,N为隐层层数;J为输出层神经元个数;I为输入层神经元个数;K为标准样本个数。本例取1层隐层。
隐含层神经元个数设计:
隐含层节点个数设计相对于隐含层数的设计比较复杂,一般有基于最小二乘设计法、基于黄金分割设计法等。本例取:M=2n+1,其中n输入层神经元的个数。
作用函数设计:
隐层作用函数取正切S型传递函数tansig函数,即:
输出层作用函数取对数S型传递函数logsig函数,即:
- 学习算法设计:
traingdm是带动量的梯度下降法、trainlm是指L-M优化算法、trainscg是指量化共辄梯度法等,本例选择trainlm学习算法。
- 输入/输出向量设计:
根据已知条件,可将目标距离的理论值作为对测量温度和测量值的一个映射(二元函数)。由此,可以确定网络的输入为2维向量,且该网络为单输出神经网络。
- 训练样本和测试样本设计:
题给数据共30组,可在同类(共六类)数据组中各挑选一个样本,从而得到六个测试样本,构成测试样本集。剩余24组数据可作为训练样本集。
- matlab代码编写
%% 此程序为matlab编程实现的BP神经网络 % 清空环境变量 clear;clc;close all %% 第一步 读取数据,输入2维输出1维 input=[20 20 20 20 45 45 45 45 20 20 20 20 45 45 45 45 20 20 20 20 45 45 45 45 20 45 20 45 20 45 756.575 770.997 765.326 762.908 778.058 768.418 767.072 753.332 869.189 837.808 846.641 850.121 886.931 896.766 855.983 844.269 975.678 936.677 953.530 936.952 969.696 966.840 967.399 991.950 762.734 754.777 871.750 878.671 972.731 960.165]; output=[750 750 750 750 750 750 750 750 850 850 850 850 850 850 850 850 950 950 950 950 950 950 950 950 750 750 850 850 950 950]; %% 第二步 设置训练数据和预测数据 input_train = input(:,1:24); output_train =output(:,1:24); input_test = input(:,25:30); output_test =output(:,25:30); %节点个数 inputnum=2; % 输入层节点数量 hiddennum=5;% 隐含层节点数量 outputnum=1; % 输出层节点数量 %% 第三本 训练样本数据归一化 [inputn,inputps]=mapminmax(input_train);%归一化到[-1,1]之间,inputps用来作下一次同样的归一化 [outputn,outputps]=mapminmax(output_train); %% 第四步 构建BP神经网络 net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练 W1= net. iw{1, 1};%输入层到中间层的权值 B1 = net.b{1};%中间各层神经元阈值 W2 = net.lw{2,1};%中间层到输出层的权值 B2 = net. b{2};%输出层各神经元阈值 %% 第五步 网络参数配置( 训练次数,学习速率,训练目标最小误差等) net.trainParam.epochs=1000; % 训练次数,这里设置为1000次 net.trainParam.lr=0.01; % 学习速率,这里设置为0.01 net.trainParam.goal=0.00001; % 训练目标最小误差,这里设置为0.00001 %% 第六步 BP神经网络训练 net=train(net,inputn,outputn);%开始训练,其中inputn,outputn分别为输入输出样本 %% 第七步 测试样本归一化 inputn_test=mapminmax('apply',input_test,inputps);% 对样本数据进行归一化 %% 第八步 BP神经网络预测 an=sim(net,inputn_test); %用训练好的模型进行仿真 %% 第九步 预测结果反归一化与误差计算 test_simu=mapminmax('reverse',an,outputps); %把仿真得到的数据还原为原始的数量级 error=test_simu-output_test; %预测值和真实值的误差 %%第十步 真实值与预测值误差比较 figure('units','normalized','position',[0.119 0.2 0.38 0.5]) plot(output_test,'bo-') hold on plot(test_simu,'r*-') hold on plot(error,'square','MarkerFaceColor','b') legend('期望值','预测值','误差') xlabel('数据组数') ylabel('样本值') title('BP神经网络测试集的预测值与实际值对比图') [c,l]=size(output_test); MAE1=sum(abs(error))/l; MSE1=error*error'/l; RMSE1=MSE1^(1/2); disp(['-----------------------误差计算--------------------------']) disp(['隐含层节点数为',num2str(hiddennum),'时的误差结果如下:']) disp(['平均绝对误差MAE为:',num2str(MAE1)]) disp(['均方误差MSE为: ',num2str(MSE1)]) disp(['均方根误差RMSE为: ',num2str(RMSE1)])
4. BP代码运行结果
4.1 预测值和真实值的误差计算(MAE、MSE、MRSE)
4.2 BP网络训练的性能分析图像
- 预测值和真实值、误差的分析图像
- 训练集、验证集、测试集和总体的均方误差随训练次数的变化图像
注:小圆圈位置代表终止的训练次数(即代数)处的均方误差
- BP神经网络各阶段的训练图像
- 各个样本集和总体的相关性分析图像
5.0 总结
通过以上内容我们对两输出一输入BP神经网络设计有了初步了解,大家可以根据自己的需要设计合适的多输出多输入的传感器检测数据融合。
在以后的博文中我们将学会用NodeMCU和arduino物联网交互使用,从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。
——————————