代码如下
n=1000;
error_n=[]; % 循环之前定义一个空矢量,由于需要运行n次,准备存储每次的预测结果, error_n为相对误差结果集合,另它为一个空矢量,也就是空矩阵。
Mean_error_n=[]; % MAEN_error_n 为总平均绝对误差集合,另它为一个空矢量,也就是空矩阵。
Y_czl4_end_sim_n=[] ; %C_wuranwu95_end_sim_n ,预测结果C_wuranwu的空白存储矩阵.
for i = 1:n
% 开始循环语句
%% 第2步 读取数据a
load #XL12389#YC4576#200D ;
X=P'; % 将行向量转变成一个矩阵。
size(X);
Y=T'; % 将列向量转变成行向量
size(Y);
%% 第3步 设置训练数据和预测数据
X1_23 = X(:,1:25) ;
Y1_23 = Y(:,1:25) ;
% 测试集——5个样本
X4_end=X(:,26:end);
Y4_end=Y(:,26:end);
%% 第4步 训练样本 归一化
%等式右侧为将矩阵X从0到1归一化。如果不加0,1.就是默认从-1到1进行归一化。
% 等式左侧意思为训练矩阵X,和结构体(就是一个参数)。ps 意思就是附录和备注差不多,用这个Ps后缀的函数记录参数。
%mapminmax函数备用案例解释 [C_wuranwu,ps] = mapminmax(x) % 映射 x 到 C_wuranwu,并得到 ps 参数。
[X1_23_1,X1_23_1_ps]=mapminmax(X1_23,0,1) ; % X1_94为归一化后的备用引入矩阵X(从1到94的数据),X1_94_1_ps为归一化时产生的参数,留给后面反归一化使用。
[Y1_23_1,Y1_23_1_ps]=mapminmax(Y1_23,0,1) ; % C_wuranwu1_94_1为归一化后的备用引入矩阵C_wuranwu(从1到94的数据),C_wuranwu1_94_1_ps为归一化时产生的参数,留给后面反归一化使用。
%% 第5步 构建BP神经网络
% 将归一化的训练数据(输入数据,输出数据),建立神经网络。取[5,2]为第一层节点数为5,两个隐含层。
% 其中隐含层节点数量和隐含层数量不同会对预测精度有影响。
% newff(A,B,n),其中A为输入矩阵,B为输出矩阵,s为隐含层个数。n=sqrt(m+n)+a。sqrt函数为开根号。m为输入节点个数,n为输出节点个数,a为1~10之间的调节常数。
hidden_num=5; %现在取隐含层节点数量为5,且只有一层隐藏层。8
net = newff(X1_23_1,Y1_23_1,hidden_num) ; %给算法引入归一化后的数据X(1-94)
V = net.iw{1,1}%输入层到中间层权值
theta1 = net.b{1}%中间层各神经元 阈值
W = net.lw{2,1}%中间层到输出层权值
theta2 = net.b{2}%输出层各神经元阈值
%% 第6步 网络参数配置( 训练次数,学习速率,训练目标最小误差等)
%% 参数设置
%% 参数设置
% 参考https://blog.csdn.net/m0_54742769/article/details/115999421
net.trainParam.epochs=50; % 最大训练次数默认1000,训练次数达到1000次后结束训练。总之就是要管够。
net.trainParam.lr=0.0001; % 学习速率,这里设置为0.01。
net.trainParam.goal=0.001; % 训练目标最小误差,这里设置为0.001= 1e-3(达到后将停止训练)
net.trainParam.max_fail =6; %调整validation checks,默认次数为6,若连续6次“训练误差”无法降低,结束训练or迭代。
%% 第7步 BP神经网络训练
net=train(net,X1_23_1,Y1_23_1); %开始训练,其中X1_94_1,C_wuranwu1_94_1,分别为前94个归一化的数据
%% 第8步 预测目标样本 归一化
X4_end_1=mapminmax('apply',X4_end,X1_23_1_ps); % X95_end为对样本数据中的95到最后的X数据进行归一化,赋值给X95_end_1,
% applC_wuranwu函数类似于利用上面得到的参数X1_94_1_ps同理可得归一化的后面几个用来预测的X矩阵(95_end_1)
%% 第9步 BP神经网络预测
% 其中sim函数的意思就是Simulink,simulation模拟仿真的意思,差不多就是预测.out,outcome结果的简称,C_wuranwu95_end_sim_1为预测结果
X4_end_sim_1=sim(net,X4_end_1) ; %用训练好的模型进行预测,可以得到归一化的结果,赋值给C_wuranwu95_end_sim_1。
%% 第10步 预测结果反归一化
% 其中reverse就是反归一化函数
X4_end_sim=mapminmax('reverse',X4_end_sim_1,Y1_23_1_ps) ; % 对预测的结果C_wuranwu95_end_sim_1进行反归一化。C_wuranwu1_94_1_ps,为前面归一化时生成的参数。
%% 第11步 真实值与预测值误差比较
% 求绝对平均误差
error=abs(X4_end_sim-Y4_end)./Y4_end ; % 求5个预测数据绝对误差分别是多少,abs求绝对值。
[q,w]=size(Y4_end) ; % 求输出 模拟预测数据向量 的矩阵维度【1行5列】
mean_error=sum(error)/w ; % 5个预测数据的平均绝对误差
%% 第12步 存储运算结果到空白矢量数组中
% a=[a;***]为固定格式。含义就是a=循环n次得到的数列***_s,前面需要预留空白的矩阵a=[].
error_n=[error_n;error]; % 把每次循环的数据,存储运算结果到空白矢量数组error_n中,n表示n次循环,error表示误差。
Mean_error_n=[Mean_error_n;mean_error]; % 存储运算结果到空白矢量数组Mean_error_n中
Y_czl4_end_sim_n=[Y_czl4_end_sim_n;X4_end_sim] % 存储运算结果到空白矢量数组C_wuranwu95_end_sim_n中
%% 求计算n次后的平均值
mean(error_n); % 求数列error_s平均值,n次运行结果的平均值
mean(Mean_error_n); % 求数列Mean_error_s平均值
mean(Y_czl4_end_sim_n); % 求数列C_wuranwu95_end_sim_s(模拟预测n次运行后,得到的C_wuranwu从95到最后的结果,的平均值)
end
%% 第13步,图像的绘制
figure(1) % 图名,制作一个窗口。
% bo-, b表示blue, o表示circle,圆点。 -表示线性实线。参考网址https://blog.csdn.net/weixin_39456594/article/details/115928959
% r*-, r表示red, *表示星状的点。 -表示线性实线。
plot(Y4_end,'bo-') % plot 画验证的实际数据图,b表示blue,o表示circle,圆圈。-表示线性实线。
hold on % hold on主要是用于添加新绘图的时候保留当前绘图
plot(mean(Y_czl4_end_sim_n),'r*-') % plot 画验证的预测数据图
hold on % hold on主要是用于添加新绘图的时候保留当前绘图
% 'square','MarkerFaceColor','b' 表示定义它们前面数据的属性,MarkerFaceColor为定义线的颜色,
plot(mean(error_n),'square','MarkerFaceColor','b') % MarkerFaceColor 意思是填充a线条颜色,为蓝色
legend('桩承载力实测值','桩承载力预测值','相对误差') % 曲线名称,监测值','预测值','相对误差,从左往右为图像中从上往下描述的曲线含义。
xlabel('休止龄期') %x轴坐标名称a
ylabel('桩承载力 ') %C_wuranwu轴坐标名称
%% 第14步,A输出 平均绝对误差,绝对误差a
disp(['-----------------------误差计算--------------------------'])
disp(['隐含层节点数为: ', num2str(hidden_num) ,' 时的误差结果如下:'])
disp(['在运算',num2str(n),'次后,86个预测数据绝对误差分别为:',num2str(mean(error_n))])
disp(['在运算',num2str(n),'次后,平均绝对误差为:',num2str(mean(Mean_error_n))])
mean(mean(Y_czl4_end_sim_n))
if ~(Mean_error_n<=0.10)
save('Mean_error_n_net.mat','net')
end
我训练了1000 个BP神经网络预测模型,想从中保存一个指定误差最小的,但每次保存的模型好像都是第1000个,请问该如何设置代码从1000个模型中保存误差最小的那个网络模型呢? 最后几行是我自己设置的保存模型的代码,并未达到我要的结果,求指教