%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
%% 导入数据
res = xlsread('data.xlsx');
%% 划分训练集和测试集
temp = randperm(600);
P_train = res(temp(1: 500), 1 : 10)';
T_train = res(temp(1: 500), 11: 13)';
M = size(P_train, 2);
P_test = res(temp(501: end), 1 : 10)';
T_test = res(temp(501: end), 11: 13)';
N = size(P_test, 2);
%% 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);
[t_train, ps_output] = mapminmax(T_train,0,1);
t_test = mapminmax('apply',T_test,ps_output);
%% 节点个数
inputnum = size(p_train, 1); % 输入层节点数
hiddennum = 15; % 隐藏层节点数
outputnum = size(t_train, 1); % 输出层节点数
%% 构建网络
net = newff(p_train, t_train, hiddennum);
%% 设置训练参数
net.trainParam.epochs = 50; % 训练次数
net.trainParam.goal = 1e-4; % 目标误差
net.trainParam.lr = 0.01; % 学习率
net.trainParam.showWindow = 0; % 关闭窗口
%% 参数设置
fun = @getObjValue; % 目标函数
dim = inputnum * hiddennum + hiddennum * outputnum + ...
hiddennum + outputnum; % 优化参数个数
lb = -1 * ones(1, dim); % 优化参数目标下限
ub = 1 * ones(1, dim); % 优化参数目标上限
pop = 20; % 数量
Max_iteration = 20; % 最大迭代次数
%% 优化算法
[Best_score,Best_pos,curve] = RIME(pop, Max_iteration, lb, ub, dim, fun);
%% 把最优初始阀值权值赋予网络预测
w1 = Best_pos(1 : inputnum * hiddennum);
B1 = Best_pos(inputnum * hiddennum + 1 : inputnum * hiddennum + hiddennum);
w2 = Best_pos(inputnum * hiddennum + hiddennum + 1 : inputnum * hiddennum + hiddennum + hiddennum*outputnum);
B2 = Best_pos(inputnum * hiddennum + hiddennum + hiddennum * outputnum + 1 : ...
inputnum * hiddennum + hiddennum + hiddennum * outputnum + outputnum);
net.Iw{1, 1} = reshape(w1, hiddennum, inputnum);
net.Lw{2, 1} = reshape(w2, outputnum, hiddennum);
net.b{1} = reshape(B1, hiddennum, 1);
net.b{2} = B2';
%% 网络训练
net.trainParam.showWindow = 1; % 打开窗口
net = train(net, p_train, t_train);
%% BP网络预测
t_sim1 = sim(net, p_train);
t_sim2 = sim(net, p_test);
%% 数据反归一化
T_sim1 = mapminmax('reverse',t_sim1,ps_output);
T_sim2 = mapminmax('reverse',t_sim2,ps_output);
%% 优化曲线
figure
plot(curve, 'linewidth',1.5);
title('RIME')
xlabel('The number of iterations')
ylabel('Fitness')
grid on;
for i = 1: 3
%% 均方根误差
error1(i, :) = sqrt(sum((T_sim1(i, :) - T_train(i, :)).^2) ./ M);
error2(i, :) = sqrt(sum((T_sim2(i, :) - T_test (i, :)).^2) ./ N);
%% 绘图
figure
subplot(2, 1, 1)
plot(1: M, T_train(i, :),'-+','Color',[255 0 0]./255,'linewidth',1,'Markersize',3,'MarkerFaceColor',[255 0 0]./255)
hold on
plot(1: M, T_sim1(i, :),'o','Color',[0 0 255]./255,'linewidth',1,'Markersize',3,'MarkerFaceColor',[0 0 255]./255)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {['输出', num2str(i),'训练集预测结果对比']; ['RMSE=' num2str(error1(i, :))]};
title(string)
xlim([1, M])
set(gca,'FontSize',12)
set(gca,'TickDir','out');
set(gca,'LineWidth',0.8);
drawnow
subplot(2, 1, 2)
plot(1: N, T_test(i, :),'-+','Color',[255 0 0]./255,'linewidth',1,'Markersize',3,'MarkerFaceColor',[255 0 0]./255)
hold on
plot(1: N, T_sim2(i, :),'o','Color',[0 0 255]./255,'linewidth',1,'Markersize',3,'MarkerFaceColor',[0 0 255]./255)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {['输出', num2str(i),'测试集预测结果对比'];['RMSE=' num2str(error2(i, :))]};
title(string)
xlim([1, N])
set(gca,'FontSize',12)
set(gca,'TickDir','out');
set(gca,'LineWidth',0.8);
drawnow
%% 分割线
disp('**************************')
disp(['下列是输出', num2str(i)])
disp('**************************')
%% 相关指标计算
% 决定系数 R2
R1(i, :) = 1 - norm(T_train(i, :) - T_sim1(i, :))^2 / norm(T_train(i, :) - mean(T_train(i, :)))^2;
R2(i, :) = 1 - norm(T_test (i, :) - T_sim2(i, :))^2 / norm(T_test (i, :) - mean(T_test (i, :)))^2;
disp(['训练集数据的R2为:', num2str(R1(i, :))])
disp(['测试集数据的R2为:', num2str(R2(i, :))])
% 平均绝对误差 MAE
mae1(i, :) = sum(abs(T_sim1(i, :) - T_train(i, :))) ./ M ;
mae2(i, :) = sum(abs(T_sim2(i, :) - T_test (i, :))) ./ N ;
disp(['训练集数据的MAE为:', num2str(mae1(i, :))])
disp(['测试集数据的MAE为:', num2str(mae2(i, :))])
% 平均相对误差 MBE
mbe1(i, :) = sum(T_sim1(i, :) - T_train(i, :)) ./ M ;
mbe2(i, :) = sum(T_sim2(i, :) - T_test (i, :)) ./ N ;
disp(['训练集数据的MBE为:', num2str(mbe1(i, :))])
disp(['测试集数据的MBE为:', num2str(mbe2(i, :))])
end
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于霜冰优化算法[23年算法]-BP神经网络RIME-BP多输出回归预测(多输入多输出) matlab代码 程序已经调试好,仅需根据需要修改outdim(输出个数)值。替换数据就可直接使用(EXCEL数据) 中文注释清晰,图很丰富 评价指标包括:R2、MAE、MBE等,代码质量极高,方便学习和替换数据
资源推荐
资源详情
资源评论
收起资源包目录
RIME-BPNM.zip (5个子文件)
RIME.m 2KB
initialization.m 558B
getObjValue.m 2KB
main.m 5KB
data.xlsx 433KB
共 5 条
- 1
资源评论
- Y199912012024-04-22支持这个资源,内容详细,主要是能解决当下的问题,感谢大佬分享~
前程算法屋
- 粉丝: 4255
- 资源: 712
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功