clear all
clc
%% bas优化elman网络
%% 自变量个数
x_number=49;
%% 因变量个数
y_number=1;
%% 网络节点个数
inputnum=x_number; % 输入层
hiddennum=50; % 隐含层
outputnum=y_number; % 输出层
iterations=2000; % 迭代次数
%% 导入数据
[data_train,~,raw_train]=xlsread('train.xlsx');
[data_predict,~,raw_predict]=xlsread('predict.xlsx');
%% 自变量
x_train=data_train(2:366,5:end);
x_test=data_train(367:397,5:end);
%% 因变量
y_train=data_train(367:731,6);
y_test=data_predict(2:end,6);
%% 自变量归一化
[x,xn]=mapminmax([x_train;x_test]',-1,1);
trainx=x(:,1:size(x_train,1));
testx=x(:,size(x_train,1)+1:end);
%% 因变量归一化
[trainy,yn]=mapminmax(y_train',-1,1);
%% 维度
global dim
dim=inputnum*hiddennum+hiddennum*hiddennum+outputnum*hiddennum+hiddennum*outputnum+outputnum;
%% 构建神经网络
net=newelm(trainx,trainy,hiddennum,{'tansig','purelin'},'traingdm'); %% ELman网络训练
%% 天牛左右须距离
d0=0.5;
%% 系数
c=2;
%% 初始化步进长度
step=2;
%% 最大值
popmax=0.5;
%% 最小值
popmin=-0.5;
%% 步长更改系数
eta=0.995;
%% 自变量个数
nvars=dim;
%% 初始化
x=popmin+(popmax-popmin)*rand(1,nvars);
%% 记录每次迭代的最优个体
xbest=x;
%% 记录最优值
fbest=fun(xbest,inputnum,hiddennum,outputnum,net,trainx,trainy);
fbest_store=fbest; % 记录每次迭代的最优值
% figure(1)
% plot(1,fbest,'k.','linewidth',2)
% hold on
% title(['bas优化最优解:',num2str(fbest)],'fontsize',30)
% pause(0.1)
%% 迭代失败次数
fail=0;
%% 迭代寻优
for i=1:iterations
disp(['第',num2str(i),'/',num2str(iterations),'次bas优化迭代'])
step=eta*step;
d0=step/c;
%% 方向向量
dire=rands(1,nvars);
%% 方向向量归一化
dire=dire/norm(dire);
%% 天牛左须坐标
xL=x-d0*dire/2;
%% 天牛右须坐标
xR=x+d0*dire/2;
%% 求解左须目标函数值
funxL=fun(xL,inputnum,hiddennum,outputnum,net,trainx,trainy);
funxR=fun(xR,inputnum,hiddennum,outputnum,net,trainx,trainy);
%% 更新质心坐标
if funxL<funxR
x=x+rand*step*((xL-xR)/norm(xL-xR));
else
x=x-rand*step*((xL-xR)/norm(xL-xR));
end
for j=1:nvars
if x(j)>popmax
x(j)=popmin+(popmax-popmin)*rand;
elseif x(j)<popmin
x(j)=popmin+(popmax-popmin)*rand;
end
end
%% 计算新目标函数值
f=fun(x,inputnum,hiddennum,outputnum,net,trainx,trainy);
%% 更新最优值与个体
if f<fbest
xbest=x;
fbest=f;
else
fail=fail+1;
end
if fail==200
x=xbest;
step=popmax*rand;
fail=0;
end
%% 记录每次迭代的最优值
fbest_store=[fbest_store,fbest];
% plot(i+1,fbest,'k.','linewidth',2)
% hold on
% title(['bas优化最优解:',num2str(fbest)],'fontsize',30)
% pause(0.1)
end %% 结束bas迭代
%%
%% 把最优初始阀值权值赋予网络预测
% %用bas优化的神经网络权值进行预测
x=xbest;
%% 提取个体
iw1=x(1:inputnum*hiddennum);
lw1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum*hiddennum);
lw2=x(inputnum*hiddennum+hiddennum*hiddennum+1:inputnum*hiddennum+hiddennum*hiddennum+outputnum*hiddennum);
b1=x(end-outputnum-hiddennum+1:end-outputnum);
b2=x(end-outputnum+1:end);
%% 网络权值赋值
net.iw{1,1}=reshape(iw1,hiddennum,inputnum);
net.lw{1,1}=reshape(lw1,hiddennum,hiddennum);
net.lw{2,1}=reshape(lw2,outputnum,hiddennum);
net.b{1}=b1';
net.b{2}=b2';
% 用训练的神经网络对测试组数据进行训练
nh=sim(net,testx);
% 网络输出反归一化
BPnh=mapminmax('reverse',nh,yn);
%% 预测值
predict=BPnh';
%% 真实值
real=y_test;
%% 误差
err=(predict-real)./real;
figure(1)
plot(fbest_store)
%% 绘图
figure(2)
subplot(121)
plot(predict,'k-*')
hold on
plot(real,'b--o')
legend('预测值','真实值')
title(['BAS优化ELman神经网络预测误差:',num2str(var(err))])
subplot(122)
plot(err,'o-')
title('BAS优化ELman神经网络预测误差')
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
CSDN海神之光上传的全部代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开除main.m的其他m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 智能优化算法优化递归神经网络ELMAN预测系列程序定制或科研合作方向: 4.4.1 遗传算法GA/蚁群算法ACO优化ELMAN 4.4.2 粒子群算法PSO/蛙跳算法SFLA优化ELMAN 4.4.3 灰狼算法GWO/狼群算法WPA优化ELMAN 4.4.4 鲸鱼算法WOA/麻雀算法SSA优化ELMAN 4.4.5 萤火虫算法FA/差分算法DE优化ELMAN
资源推荐
资源详情
资源评论
收起资源包目录
【ELMAN回归预测】基于matlab天牛须算法优化ELMAN回归预测【含Matlab源码 1375期】.zip (7个子文件)
【ELMAN回归预测】基于matlab天牛须算法优化ELMAN回归预测【含Matlab源码 1375期】
.DS_Store 6KB
运行结果1.jpg 18KB
predict.xlsx 17KB
运行结果2.jpg 43KB
bas_elman.m 4KB
train.xlsx 212KB
fun.m 1KB
共 7 条
- 1
资源评论
海神之光
- 粉丝: 3w+
- 资源: 2093
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功