clc
clear
close all
AA=xlsread('3.xlsx');
input=ones(48,3);
input(:,1)=AA(:,2);
input(:,2)=AA(:,3);
input(:,3)=AA(:,4);
input1=input';
[in,ps]=mapminmax(input1,0,1);
in1=in';
input=ones(48,2);
output(:,1)=AA(:,5);
output(:,2)=AA(:,6);
T=output(1:36,:)';%;
T_test=output(37:48,:)';
P=in1(1:36,:)';%;
P_test=in1(37:48,:)';
input_train =P;
input_test = P_test;
output_train = T;
output_test = T_test;
%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
%% 获取输入层节点、输出层节点个数
inputnum = 3;
%hiddennum = 8;
outputnum = 2;
% 确定隐含层节点个数
% 采用经验公式hiddennum=sqrt(m+n)+a,m为输入层节点个数,n为输出层节点个数,a一般取为1-10之间的整数
MSE=1e+8; % 初始化最小误差
for hiddennum=3:20;
% 构建网络
net=newff(inputn,outputn,hiddennum);
% 网络参数
net.trainParam.epochs=100000; % 训练次数
net.trainParam.lr=0.0005; % 学习速率
net.trainParam.goal=0.000001; % 训练目标最小误差
% 网络训练
net=train(net,inputn,outputn);
an0=sim(net,inputn); % 仿真结果
mse0=mse(outputn,an0); % 仿真的均方误差
disp(['隐含层节点数为',num2str(hiddennum),'时,训练集的均方误差为:',num2str(mse0)])
% 更新最佳的隐含层节点
if mse0<MSE
MSE=mse0;
hiddennum_best=hiddennum;
end
end
disp(['最佳的隐含层节点数为:',num2str(hiddennum_best),',相应的均方误差为:',num2str(MSE)])
%% 构建最佳隐含层节点的BP神经网络
disp(' ')
disp('标准的BP神经网络:')
net0=newff(inputn,outputn,hiddennum_best,{'logsig','purelin'},'trainlm');% 建立模型
% 网络参数配置
net0.trainParam.epochs=1000; % 训练次数,这里设置为1000次
net0.trainParam.lr=0.01; % 学习速率,这里设置为0.01
net0.trainParam.goal=0.00005; % 训练目标最小误差,这里设置为0.0001
net0.trainParam.show=25; % 显示频率,这里设置为每训练25次显示一次
net0.trainParam.mc=0.01; % 动量因子
net0.trainParam.min_grad=1e-3; % 最小性能梯度
net0.trainParam.max_fail=8; % 最高失败次数
% 开始训练
net0=train(net0,inputn,outputn);
% 预测
an0=sim(net0,inputn_test); % 用训练好的模型进行仿真
% 预测结果反归一化与误差计算
test_simu0=mapminmax('reverse',an0,outputps); % 把仿真得到的数据还原为原始的数量级
% 误差指标
disp('输出序列1误差:')
[mae0,mse0,rmse0,mape0,error0,errorPercent0]=compute_error(output_test(1,:),test_simu0(1,:));
disp('输出序列2误差:')
[mae1,mse1,rmse1,mape1,error1,errorPercent1]=compute_error(output_test(2,:),test_simu0(2,:));
%% 鲸鱼优化算法寻最优权值阈值
disp(' ')
disp('CIWOA优化BP神经网络:')
net=newff(inputn,outputn,hiddennum_best,{'logsig','tansig'},'trainlm');% 建立模型
% 网络参数配置
net.trainParam.epochs=1000; % 训练次数,这里设置为1000次
net.trainParam.lr=0.01; % 学习速率,这里设置为0.01
net.trainParam.goal=0.00005; % 训练目标最小误差,这里设置为0.0001
net.trainParam.show=25; % 显示频率,这里设置为每训练25次显示一次
net.trainParam.mc=0.01; % 动量因子
net.trainParam.min_grad=1e-3; % 最小性能梯度
net.trainParam.max_fail=6; % 最高失败次数
%% 初始化WOA参数
popsize=30; % 初始种群规模
maxgen=50; % 最大进化代数
dim=inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum; % 自变量个数
lb=repmat(-3,1,dim); % 自变量下限
ub=repmat(3,1,dim); % 自变量上限
% 初始化位置向量和领导者得分
% Leader_pos1=zeros(1,dim);
leader_pos1=rand(1,dim);
rho=1; % LSY:Cubic map混沌映射,用于初始化WOA(鲸鱼算法)的初始种群方式,使其不再随机!
leader_pos=rho.*(1-leader_pos1.^2);
Leader_score=10^20;
%% 初始化种群
for i=1:dim
ub_i=ub(i);
lb_i=lb(i);
Positions(:,i)=rand(popsize,1).*(ub_i-lb_i)+lb_i;
end
curve=zeros(maxgen,1);% 初始化收敛曲线
%% 循环开始
h0=waitbar(0,'CIWOA optimization...');
for t=1:maxgen
for i=1:size(Positions,1)% 对每个个体一个一个检查是否越界
% 对每个个体一个一个检查是否越界
% 返回超出搜索空间边界的搜索代理
Flag4ub=Positions(i,:)>ub;
Flag4lb=Positions(i,:)<lb;
Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;% 超过最大值的设置成最大值,超过最小值的设置成最小值
% 目标函数值的计算
fit(i)=fitnessci(Positions(i,:),inputnum,hiddennum_best,outputnum,net,inputn,outputn,output_train,inputn_test,outputps,output_test);
% 更新领导者位置
if fit(i)<Leader_score
Leader_score=fit(i);
Leader_pos=Positions(i,:);
end
end
a=2-t*((2)/maxgen);
a2=-1+t*((-1)/maxgen);
% 参数更新
for i=1:size(Positions,1)
r1=rand();r2=rand();
A=2*a*r1-a;
C=2*r2;
b=1;
l=(a2-1)*rand+1;
p = rand();
mm=1;
wmax=1;
wmin=0;
w=wmin+(wmax-wmin)*mm*exp(-t/maxgen);%LSY:自适应权重
for j=1:size(Positions,2)% 对每一个个体地多维度进行循环运算
% 收缩包围机制
if p<0.5
if abs(A)>=1
rand_leader_index = floor(popsize*rand()+1);%floor将 X 的每个元素四舍五入到小于或等于该元素的最接近整数
X_rand = Positions(rand_leader_index, :);
D_X_rand=abs(C*X_rand(j)-Positions(i,j));
Positions(i,j)=w*X_rand(j)-A*D_X_rand;
%Positions(i,j)=X_rand(j)-A*D_X_rand;
elseif abs(A)<1
D_Leader=abs(C*Leader_pos(j)-Positions(i,j));
Positions(i,j)=w*Leader_pos(j)-A*D_Leader;
end
% 螺旋更新位置
elseif p>=0.5
distance2Leader=abs(Leader_pos(j)-Positions(i,j));
Positions(i,j)=distance2Leader*exp(b.*l).*cos(l.*2*pi)+Leader_pos(j);
end
end
end
curve(t)=Leader_score;
waitbar(t/maxgen,h0)
end
close(h0)
setdemorandstream(pi);
%% 绘制进化曲线
figure
plot(curve,'r-','linewidth',2)
xlabel('进化代数')
ylabel('均方误差')
legend('最佳适应度')
title('WOA的进化曲线')
w1=Leader_pos(1:inputnum*hiddennum_best); % 输入层到中间层的权值
B1=Leader_pos(inputnum*hiddennum_best+1:inputnum*hiddennum_best+hiddennum_best); % 中间各层神经元阈值
w2=Leader_pos(inputnum*hiddennum_best+hiddennum_best+1:inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum); %中间层到输出层的权值
B2=Leader_pos(inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+1:inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum); %输出层各神经元阈值
%矩阵重构
net.iw{1,1}=reshape(w1,hiddennum_best,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum_best);
net.b{1}=reshape(B1,hiddennum_best,1);
net.b{2}=reshape(B2,outputnum,1);
net=newff(inputn,outputn,hiddennum_best,{'logsig','tansig'},'trainlm');% 建立模型
%% 优化后的神经网络训练
net=train(net,inputn,outputn); % 开始训练,其中inputn,outputn分别为输入输出样本
%% 优化后的神经网络测试
an1=sim(net,inputn_test);
test_simu1=mapminmax('reverse',an1,outputps); % 把仿真得到的数据还原为原始的数量级
load maynet.mat
% 误差指标
disp('输出序列1误差:')
[mae1,mse1,rmse1,mape1,error1,errorPercent1]=compute_error(output_test(1,:),test_simu1(1,:));
disp('输出序列2误差:')
[mae2,mse2,rmse2,mape2,error2,errorPercent2]=compute_error(output_test(2,:),test_simu1(2,:));
%% 作图
figure
plot(output_test(1,:),'b-*','linewidth',1)
hold on
plot(test_simu0(1,:),'r-v','linewidth',1,'markerfacecolor','r')
hold on
plot(test_simu1(1,:),'m-o','linewidth',1,'markerfacecolor','m')
legend('真实值','BP预测值','CIWOA-BP预测值')
% legend('真实值','CIWOA-BP预测值')
xlabel('测试样本编号')
ylabel('指标值')
title('WOA优化前后的BP神经网络预测值和真实值对比图')
没有合适的资源?快使用搜索试试~ 我知道了~
鲸鱼优化算法优化多输入多输出BP神经网络回归分析,多输入多输出BP神经网络
共5个文件
m:3个
mat:1个
xlsx:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 56 浏览量
2024-05-16
22:43:11
上传
评论
收藏 21KB RAR 举报
温馨提示
基于MATLAB编程,鲸鱼优化算法优化多输入多输出BP神经网络回归分析,多输入多输出BP神经网络,代码完整,包含数据,有注释,方便扩展应用,可以改为鲸鱼算法优化双隐含层BP神经网络,或者多隐含层BP神经网络 1,如有疑问,不会运行,可以私信, 2,需要创新,或者修改可以扫描二维码联系博主, 3,本科及本科以上可以下载应用或者扩展, 4,内容不完全匹配要求或需求,可以联系博主扩展。
资源推荐
资源详情
资源评论
收起资源包目录
鲸鱼bp.rar (5个子文件)
CIWOA_BP.m 9KB
3.xlsx 12KB
compute_error.m 1KB
fitnessci.m 1KB
maynet.mat 6KB
共 5 条
- 1
资源评论
神经网络机器学习智能算法画图绘图
- 粉丝: 2509
- 资源: 618
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功