基于BP神经网络的非线性函数拟合系统设计代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于BP神经网络的非线性函数拟合系统设计代码
data.m 数据集生成代码
clc %关闭所有窗口
clear %清除所有变量
close all %关闭所有界面
X1=-5:0.22:5; %x1的范围
X2=X1; %x2的范围
[x1,x2]=meshgrid(X1,X2); %x1,x2生成网格
y=x1.^2+x2.^2; %根据公式计算y
surf(x1,x2,y); %画曲面图
d=[x1(1:2000)' x2(1:2000)' y(1:2000)']; %获取前2000个数据
shading interp %平滑曲面
save('d.mat','d'); %保存数据
main.m BP神经网络的模型建立,训练,预测和评价
clc %关闭所有窗口
clear %清除所有变量
close all%关闭所有界面
%%
%数据导入
load('d.mat');
D=d;
%网络训练
y=D(:,3); %输出
x=D(:,1:2); %输入
[y,a1]=mapminmax(y',-1,1); %输出归一化
%
[x,a2]=mapminmax(x',-1,1); %输入归一化
data1=[x;y]; %数据
[trainsample,testsample] =dividerand(data1,19,1,0); %划分训练集和测试集
%创建BP神经网络
%创建网络
net=newff(trainsample(1:2,:),trainsample(3,:),25,{'logsig','tansig'},'trainlm'); %隐层2个,神经元个数是[9,9]
%设置训练次数
net.trainParam.epochs = 2000;
net.trainParam.lr=0.01; %学习率
%设置收敛误差
net.trainParam.goal=0.000001; %收敛误差
%训练网络
[net,tr]=train(net,trainsample(1:2,:),trainsample(3,:));
%在训练集和测试集上的表现
y_train_predict=sim(net,trainsample(1:2,:)); %训练结果
y_test_predict=sim(net,testsample(1:2,:)); %测试结果
predict=mapminmax('reverse',y_test_predict,a1); %预测输出反归一化
output_test=mapminmax('reverse',testsample(3,:),a1); %输出反归一化
error=predict-output_test; %计算误差
plot(output_test,'bo-') %画图:测试实际结果
hold on %多个曲线画在一张图像上
plot(predict,'r*-') %画图:预测记过
legend('期望值','预测值')
xlabel('数据组数'),ylabel('值'),title('测试集预测值和期望值的对比')
figure
plot(error,'bo-') %误差曲线
% axis([0,100,-0.4,0.4]) %横坐标范围[0 - 100],纵坐标范围[-0.4 - 0.4]
xlabel('数据组数'),ylabel('值'),title('测试集误差曲线')
[~,len]= size(output_test); %计算测试集的数量
MAE1= sum(abs(error./output_test))/len; %计算MAE指标
MSE1=error*error'/len; %计算MSE指标
RMSE1=MSE1^(1/2); %计算RSME指标
disp(['----------误差计算----------'])
disp(['平均绝对误差MAE为:',num2str(MAE1)]) %显示结果disp(['均方误差MSE为:',num2str(MSE1)])
disp(['均方根误差RMSE为: ',num2str(RMSE1)])。