bp神经网络的基本原理和组成:
神经网络的基本代码如下:具体的过程也比较简单为此在这里也就不多多赘述
%% 此程序matlab编程实现的BP神经网络
% 清空环境变量
clear all
clc
%%第一步 读取数据
input=randi([1 20],2,200); %载入输入数据是1-20的2行200列数据,随机数
output=input(1,:)'+input(2,:)'; %载入输出数据,输出的数据是200行1列的数据,其结果是1行1列的的数据加上
% 第2行1列的输出的叠加,为两输入一输出
%% 第二步 设置训练数据和预测数据
input_train = input(:,1:190);%输入的数据是2行190列的数据
output_train =output(1:190,:)';%输出的数据是190行1列的数据
input_test = input(:,191:200);%测试的数据为2行191-200列的数据
output_test =output(191:200,:)';%输出的数据为191-200列的数据
%节点个数
%inputnum=2;%输入的节点个数
hiddennum=5;%隐含层节点数量经验公式p=sqrt(m+n)+a ,故分别取2~13进行试验
%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(1)
plot(output_test,'bo-')
hold on
plot(test_simu,'r*-')
hold on
plot(error,'square','MarkerFaceColor','b')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('值')
[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)])
app设计的基本思路:
接下来解释app的设计:其中主要的思想是通过,自定义隐含层、训练次数、学习速率、最小误差参数,然后按下计算按钮就可以生成结果图、以及误差统计数据。(也可以自己选择一些参数在这里仅使用这些参数作为自定义参数)
1.基本界面如下:
2.代码的实现:
下面展示一些 内联代码片
。
// A code block
var foo = 'bar';
%%%%%计算按钮的回调函数代码如下:
input_data=xlsread('input_data.xlsx');%读取表格中的数据,输入值
output_data=xlsread('output_data.xlsx');%读取表格中的数据,输出值(此时的表格中的数据需要放app运行的文件目录下才能读取)
%%第一步 读取数据
input_train = input_data(:,1:190);%输入的数据是2行190列的数据
output_train =output_data(1:190,:)';%输出的数据是190行1列的数据
input_test = input_data(:,191:200);%测试的数据为2行191-200列的数据
output_test =output_data(191:200,:)';%输出的数据为191-200列的数据
%节点个数
%inputnum=app.input.Value;%输入的节点个数
%%%%自定义隐含层数,并赋值给hiddennum
hiddennum=app.middle.Value;%隐含层节点数量经验公式p=sqrt(m+n)+a ,故分别取2~13进行试验,代码的含义是通过
%outputnum=app.output.Value;%输出的节点个数
%% 第三步 训练样本数据归一化
[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
net.trainParam.epochs=app.epochs.Value; % 训练次数,这里设置为1000次
%%%%%自定义学习速率赋值给 net.trainParam.lr
net.trainParam.lr=app.lr.Value; % 学习速率,这里设置为0.01
%%%%%自定义训练目标最小误差赋值给net.trainParam.goal
net.trainParam.goal=app.goal.Value; % 训练目标最小误差,这里设置为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_num=test_simu-output_test; %预测值和真实值的误差
%%第十步 真实值与预测值误差比较
%%%%%绘制图形在app.UIAxes图形显示控件上
plot(app.UIAxes,output_test,'bo-');
hold (app.UIAxes,'on');
plot(app.UIAxes,test_simu,'r*-');
hold (app.UIAxes,'on');
plot(app.UIAxes,error_num,'square','MarkerFaceColor','b');
legend(app.UIAxes,'期望值','预测值','误差');
[c,l]=size(output_test);
RMSE=sum(abs(error_num))/l;
MSE1=error_num*error_num'/l;
RMSE1=MSE1^(1/2);
rmse=string(RMSE);
mse1=string(MSE1);
rmse1=string(RMSE1);
%%%%%计算的统计值分别显示在三个文本中(需要强制转换成字符类型)如果使用数值直接赋值即可
app.EditField.Value=rmse;
app.EditField_2.Value=mse1;
app.EditField_3.Value=rmse1;
基本的appdesigner,在我的上一篇博客里,如果有什么疑问的话也可以以留言。