%%设置训练数据和预测数据
input_train=input2(1:52,:)';%编号1-52数据作为测试组(x值)
output_train=output2(1:52,:)';%编号1-52数据作为测试组(y值)
input_test=input2(33:52,:)';%编号33-52数据作为检验组(x值)
output_test=output2(33:52,:)';%编号33-52数据作为检验组(y值)
%%节点个数
inputnum=17;%输入层节点个数
hiddennum=14;%隐含层节点个数
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;%训练次数为10000
net.trainParam.lr=0.01;%学习速率为0.0025
net.trainParam.goal=0.000001;%训练目标最小误差为0.000001
%%bp神经网络训练
net=train(net,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;
error1=mapminmax(error,0,1);%对误差进行归一化
%%真实值与预测值误差比较
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(error1,'square','MarkerFaceColor','b')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('样本值')
title('预测值与实际值对比图')
[c,l]=size(output_test);
MAE1=sum(abs(error1))/l;
MSE1=error1*error1'/l;
RMSE1=MSE1^(1/2);
disp(['----------------误差计算------------------'])
disp(['隐含层节点数为',num2str(hiddennum),'时的误差如下'])
disp(['平均绝对误差MAE为',num2str(MAE1)])
disp(['均方误差MSE为',num2str(MSE1)])
disp(['均方根误差RMSE1为',num2str(RMSE1)])
%%disp('-------- 网络训练后的权重 ---------------')
w21 = net.iw{1,1}; % 第1层(输入层)到第2层(隐层)的权值
b2 = net.b{1}; % 第2层(隐层)的阈值
w32 = net.lw{2,1}; % 第2层(输入层)到第3层(输出层)的权值
b3 = net.b{2}; % 第3层(输出层)的阈值
丝毫不懂代码——BP神经网络(matlab)
于 2023-04-02 16:23:19 首次发布
该文段展示了一个利用BP神经网络进行训练和预测的过程。首先,数据被划分为训练集和测试集,然后进行归一化处理。接着,建立了具有tansig和purelin传递函数的神经网络模型,并配置了训练参数。训练完成后,对测试数据进行归一化并进行预测,最后分析了预测误差,包括MAE、MSE和RMSE的计算。
摘要由CSDN通过智能技术生成