66种智能优化算法和改进优化算法优化BP神经网络【开源代码!】【文末福利IT学习资料】

前言

 熟话说得好,创新点不够,智能优化算法来凑,不要觉得羞耻,因为不仅我们这么干,很多外国人也这么干!因为创新点实在太难想了,和优化算法结合下是最简单的创新点了!

之前给大家分享了66个智能优化算法,更新了最近几年发表在一区期刊的智能优化算法以及改进的优化算法。虽然有这么多个优化算法,但很多小伙伴表示还是不会用,没有目标函数。

BP神经网络以及智能优化算法对其初始参数的优化一直是一个热点的话题,每年的毕设都有N多小伙伴需要这个,而这种复杂的有很多局部最优点的优化问题就是智能优化算法的一个很好的应用,那这期内容我们就分享66个智能优化算法优化BP神经网络的代码实现,但学会这期分享,本质上可以实现任意智能优化算法优化BP神经网络

文末福利:拉到,有必须拿下的福利哦

数据集

用经典鲍鱼数据集为例,最后Rings是需要预测的即鲍鱼的年龄,用性别(1:雄性,M;0:中性l ; -1:雌性,F)和一些体征如长度、高度、重量等进行预测。因变量是鲍鱼的年龄,有多个自变量,是一个典型多元回归问题。

鲍鱼数据形式如下:

图片

 

图片

目标函数

图片

   对于一个固定结构的神经网络,即神经网络层数、神经元个数以及激活函数都一样的情况下,可以通过优化网络结构的初始参数来优化整个网络的参数和结构。

图片

  把优化的参数拉平成一条进行优化,优化参数的维度和网络结构有关,我们的优化目标就是优化出一个初始网络结构超参数,能让网络正向传播得到的预测值和真实值最接近。因此我们通用的目标函数可以设置如下:

function fitness_value =objfun(input_pop)global input_num hidden_num output_num input_data output_data    w1=input_pop(1:input_num*hidden_num);   %输入和隐藏层之间的权重参数    B1=input_pop(input_num*hidden_num+1:input_num*hidden_num+hidden_num); %隐藏层神经元的偏置    w2=input_pop(input_num*hidden_num+hidden_num+1:input_num*hidden_num+...        hidden_num+hidden_num*output_num);  %隐藏层和输出层之间的偏置    B2=input_pop(input_num*hidden_num+hidden_num+hidden_num*output_num+1:input_num*hidden_num+...        hidden_num+hidden_num*output_num+output_num); %输出层神经元的偏置    %网络权值赋值    W1=reshape(w1,hidden_num,input_num);    W2=reshape(w2,output_num,hidden_num);    B1=reshape(B1,hidden_num,1);    B2=reshape(B2,output_num,1);    [~,n]=size(input_data);    A1=logsig(W1*input_data+repmat(B1,1,n));   %需与main函数中激活函数相同    A2=purelin(W2*A1+repmat(B2,1,n));      %需与main函数中激活函数相同      error=sumsqr(output_data-A2);    fitness_value=error; %误差即为适应度end

图片

数据集划分与超参数设置

clc;clear; close all;load('abalone_data.mat')%鲍鱼数据global input_num hidden_num output_num input_data output_data train_num test_num  x_train_mu y_train_mu x_train_sigma  y_train_sigma%% 导入数据%设置训练数据和测试数据[m,n]=size(data);train_num=round(0.8*m); %自变量 test_num=m-train_num;x_train_data=data(1:train_num,1:n-1);y_train_data=data(1:train_num,n);%测试数据x_test_data=data(train_num+1:end,1:n-1);y_test_data=data(train_num+1:end,n);
%% 标准化[x_train_regular,x_train_mu,x_train_sigma] = zscore(x_train_data);[y_train_regular,y_train_mu,y_train_sigma]= zscore(y_train_data);x_train_regular=x_train_regular';y_train_regular=y_train_regular';input_data=x_train_regular;output_data=y_train_regular;input_num=size(x_train_regular,1); %输入特征个数hidden_num=6;   %隐藏层神经元个数output_num=size(y_train_regular,1); %输出特征个数
num_all=input_num*hidden_num+hidden_num+hidden_num*output_num+output_num;%网络总参数,只含一层隐藏层;%%%自变量的个数即为网络连接权重以及偏置popmax=1.5;   %自变量即网络权重和偏置的上限popmin=-1.5;  %自变量即网络权重和偏置的下限SearchAgents_no=50; % Number of search agents  搜索麻雀数量Max_iteration=300; % Maximum numbef of iterations 最大迭代次数% Load details of the selected benchmark function

图片

超参数的优化和最终结果的获取

以下展示了,使用智能优化算法优化超参数前后的使用方法,在初始超参数优化完毕后,直接把结果带入到神经网络中,再进行反向传播的训练,

%%fobj=@objfun;Time_compare=[];      %算法的运行时间比较Fival_compare=[];       %算法的最终目标比较Fival_compare1=[];     %优化过后的初始参数经过反向传播的优化Fival_compare2=[];curve_compare=[];     %算法的过程函数比较name_all=[];     %算法的名称记录dim=num_all;lb=popmin;ub=popmax;pop_num=SearchAgents_no;Max_iter=Max_iteration;%% 不进行优化,随机赋值iter=1;bestX=lb+(ub-lb).*rand(1,num_all);ER_=Fun1(bestX,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);ER_1=Fun2(bestX,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);Fival_compare1=[Fival_compare1,ER_]; Fival_compare2=[Fival_compare2,ER_1]; name_all{1,iter}='NO-opti';iter=iter+1;%% 麻雀搜索算法t1=clock;[fMin_SSA,bestX_SSA,SSA_curve]=SSA(pop_num,Max_iter,lb,ub,dim,fobj);    %麻雀搜索算法
ER_SSA=Fun1(bestX_SSA,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);ER_SSA1=Fun2(bestX_SSA,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);t2=clock;time_SSA=(t2(end)+t2(end-1)*60+t2(end-2)*3600-t1(end)-t1(end-1)*60-t1(end-2)*3600);Fival_compare=[Fival_compare,fMin_SSA];   Fival_compare1=[Fival_compare1,ER_SSA]; Fival_compare2=[Fival_compare2,ER_SSA1]; Time_compare=[Time_compare,time_SSA(end)];curve_compare=[curve_compare;SSA_curve];name_all{1,iter}='SSA';iter=iter+1;

第一个神经网络计算函数是MATLAB自带的BP工具箱

function [EcRMSE]=Fun1(bestX,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data)global input_num output_num x_train_mu y_train_mu x_train_sigma  y_train_sigmabestchrom=bestX;net=newff(x_train_regular,y_train_regular,hidden_num,{'logsig','purelin'},'trainlm');w1=bestchrom(1:input_num*hidden_num);   %输入和隐藏层之间的权重参数B1=bestchrom(input_num*hidden_num+1:input_num*hidden_num+hidden_num); %隐藏层神经元的偏置w2=bestchrom(input_num*hidden_num+hidden_num+1:input_num*hidden_num+...    hidden_num+hidden_num*output_num);  %隐藏层和输出层之间的偏置B2=bestchrom(input_num*hidden_num+hidden_num+hidden_num*output_num+1:input_num*hidden_num+...    hidden_num+hidden_num*output_num+output_num); %输出层神经元的偏置%网络权值赋值net.iw{1,1}=reshape(w1,hidden_num,input_num);net.lw{2,1}=reshape(w2,output_num,hidden_num);net.b{1}=reshape(B1,hidden_num,1);net.b{2}=reshape(B2,output_num,1);net.trainParam.epochs=200;          %最大迭代次数net.trainParam.lr=0.1;                        %学习率net.trainParam.goal=0.00001;[net,~]=train(net,x_train_regular,y_train_regular);%将输入数据归一化test_num=size(x_test_data,1);x_test_regular = (x_test_data-repmat(x_train_mu,test_num,1))./repmat(x_train_sigma,test_num,1);%放入到网络输出数据y_test_regular=sim(net,x_test_regular');%将得到的数据反归一化得到预测数据 test_out_std=y_test_regular;%反归一化SSA_BP_predict=test_out_std*y_train_sigma+y_train_mu;errors_nn=sum(abs(SSA_BP_predict'-y_test_data)./(y_test_data))/length(y_test_data);EcRMSE=sqrt(sum((errors_nn).^2)/length(errors_nn));% disp(EcRMSE)end

第二个神经网络计算函数是小编自己写的BP函数​​​​​​​

function [EcRMSE]=Fun2(bestX,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data)global input_num output_num  x_train_mu y_train_mu x_train_sigma  y_train_sigma
train_num=length(y_train_regular); %自变量 test_num=length(y_test_data);bestchrom=bestX;% net=newff(x_train_regular,y_train_regular,hidden_num,{'tansig','purelin'},'trainlm');w1=bestchrom(1:input_num*hidden_num);   %输入和隐藏层之间的权重参数B1=bestchrom(input_num*hidden_num+1:input_num*hidden_num+hidden_num); %隐藏层神经元的偏置w2=bestchrom(input_num*hidden_num+hidden_num+1:input_num*hidden_num+...    hidden_num+hidden_num*output_num);  %隐藏层和输出层之间的偏置B2=bestchrom(input_num*hidden_num+hidden_num+hidden_num*output_num+1:input_num*hidden_num+...    hidden_num+hidden_num*output_num+output_num); %输出层神经元的偏置%网络权值赋值x_train_std=x_train_regular;y_train_std=y_train_regular;%vij = reshape(w1,hidden_num,input_num) ;%输入和隐藏层的权重theta_u = reshape(B1,hidden_num,1);%输入与隐藏层之间的阈值Wj =  reshape(w2,output_num,hidden_num);%%输出和隐藏层的权重theta_y =reshape(B2,output_num,1);%输出与隐藏层之间的阈值%learn_rate = 0.0001;%学习率Epochs_max = 10000;%最大迭代次数error_rate = 0.1;%目标误差Obj_save = zeros(1,Epochs_max);%损失函数% 训练网络epoch_num=0;while epoch_num <Epochs_max    epoch_num=epoch_num+1;      y_pre_std_u=vij * x_train_std + repmat(theta_u, 1, train_num);    y_pre_std_u1 = logsig(y_pre_std_u);      y_pre_std_y = Wj * y_pre_std_u1 + repmat(theta_y, 1, train_num);      y_pre_std_y1=y_pre_std_y;    obj =  y_pre_std_y1-y_train_std ;        Ems = sumsqr(obj);    Obj_save(epoch_num) = Ems;     if Ems < error_rate        break;    end     %梯度下降    %输出采用rule函数,隐藏层采用sigomd激活函数    c_wj= 2*(y_pre_std_y1-y_train_std)* y_pre_std_u1';        c_theta_y=2*(y_pre_std_y1-y_train_std)*ones(train_num, 1);        c_vij=Wj'* 2*(y_pre_std_y1-y_train_std).*(y_pre_std_u1).*(1-y_pre_std_u1)* x_train_std';        c_theta_u=Wj'* 2*(y_pre_std_y1-y_train_std).*(y_pre_std_u1).*(1-y_pre_std_u1)* ones(train_num, 1);        Wj=Wj-learn_rate*c_wj;        theta_y=theta_y-learn_rate*c_theta_y;        vij=vij- learn_rate*c_vij;         theta_u=theta_u-learn_rate*c_theta_u;end % x_test_regular = (x_test_data-repmat(x_train_mu,test_num,1))./repmat(x_train_sigma,test_num,1);% x_test_regular = mapminmax('apply',x_test_data,x_train_maxmin);%放入到网络输出数据x_test_std=x_test_regular';test_put = logsig(vij * x_test_std + repmat(theta_u, 1, test_num));test_out_std =  Wj * test_put + repmat(theta_y, 1, test_num);%反归一化SSA_BP_predict=test_out_std*y_train_sigma+y_train_mu;errors_nn=sum(abs(SSA_BP_predict'-y_test_data)./(y_test_data))/length(y_test_data);EcRMSE=sqrt(sum((errors_nn).^2)/length(errors_nn));disp(EcRMSE)end

得到不同优化函数优化BP神经网络的适应度曲线如下

   将初始参数带入到BP网络模型中,反向传播训练可以得到BP工具箱优化的结果以及自己写的网络结果,两者效果相差不太大
 

以下是两种实现方式的对比

图片

运行多次记录结果    

    不可否认的是,因为智能优化算法的存在,每次优化是有一定的随机性的,因此我们可以多次运行取均值和方差去衡量总体的结果​​​​​​​

clc;clear; close all;load('data_test1.mat')global input_num hidden_num output_num input_data output_data train_num test_num  x_train_mu y_train_mu x_train_sigma  y_train_sigma%%  循环5次记录结果  训练集和测试集随机%% 导入数据  %设置训练数据和测试数据
NUM=5;    %随机测试数for  NN=1:NUM[m,n]=size(data);train_num=round(0.8*m); %自变量 randlabel=randperm(m);   %随机标签test_num=m-train_num;x_train_data=data(randlabel(1:train_num),1:n-1);y_train_data=data(randlabel(1:train_num),n);%测试数据x_test_data=data(randlabel(train_num+1:end),1:n-1);y_test_data=data(randlabel(train_num+1:end),n);% x_train_data=x_train_data';% y_train_data=y_train_data';% x_test_data=x_test_data';%% 标准化[x_train_regular,x_train_mu,x_train_sigma] = zscore(x_train_data);[y_train_regular,y_train_mu,y_train_sigma]= zscore(y_train_data);x_train_regular=x_train_regular';y_train_regular=y_train_regular';input_data=x_train_regular;output_data=y_train_regular;input_num=size(x_train_regular,1); %输入特征个数hidden_num=6;   %隐藏层神经元个数output_num=size(y_train_regular,1); %输出特征个数num_all=input_num*hidden_num+hidden_num+hidden_num*output_num+output_num;%网络总参数,只含一层隐藏层;%自变量的个数即为网络连接权重以及偏置popmax=1.5;   %自变量即网络权重和偏置的上限popmin=-1.5;  %自变量即网络权重和偏置的下限SearchAgents_no=50; % Number of search agents  搜索麻雀数量Max_iteration=300; % Maximum numbef of iterations 最大迭代次数% Load details of the selected benchmark function%%fobj=@objfun;Time_compare=[];      %算法的运行时间比较Fival_compare=[];       %算法的最终目标比较Fival_compare1=[];     %优化过后的初始参数经过反向传播的优化Fival_compare2=[];curve_compare=[];     %算法的过程函数比较name_all=[];     %算法的名称记录dim=num_all;lb=popmax*ones(1,dim);ub=popmin*ones(1,dim);pop_num=SearchAgents_no;Max_iter=Max_iteration;%% 不进行优化,随机赋值iter=1;bestX=lb+(ub-lb).*rand(1,num_all);ER_=Fun1(bestX,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);ER_1=Fun2(bestX,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);Fival_compare1=[Fival_compare1,ER_]; Fival_compare2=[Fival_compare2,ER_1]; name_all{1,iter}='ON-opti';iter=iter+1;%%% [ER_1,WW]=Fun2(bestX,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);% % [fMin_SSA,bestX_SSA,SSA_curve]=SSA2(pop_num,pop_or,Max_iter,lb,ub,dim,fobj); % % ER2=fun3(bestX_SSA,x_test_data,x_train_mu,x_train_sigma,y_train_mu,y_train_sigma,y_test_data);% pop_num11=500;% [fMin_SSA,bestX_SSA1,SSA_curve]=SSA2(pop_num11,WW,Max_iter,lb,ub,dim,fobj); % ER_2=fun3(bestX_SSA1,x_test_data,x_train_mu,x_train_sigma,y_train_mu,y_train_sigma,y_test_data);% Fival_compare1=[Fival_compare1,ER_2]; % Fival_compare2=[Fival_compare2,ER_2]; % name_all{1,iter}='BP-SSA';% iter=iter+1;%% 改进麻雀搜索算法t1=clock;[fMin_SSA,bestX_SSA,SSA_curve]=G_SSA(pop_num,Max_iter,lb,ub,dim,fobj);    %麻雀搜索算法ER_SSA=Fun1(bestX_SSA,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);ER_SSA1=Fun2(bestX_SSA,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);t2=clock;time_SSA=(t2(end)+t2(end-1)*60+t2(end-2)*3600-t1(end)-t1(end-1)*60-t1(end-2)*3600);ER_SSA2=fun3(bestX_SSA,x_test_data,x_train_mu,x_train_sigma,y_train_mu,y_train_sigma,y_test_data); %不进行BP反向Fival_compare=[Fival_compare,ER_SSA2];   Fival_compare1=[Fival_compare1,ER_SSA]; Fival_compare2=[Fival_compare2,ER_SSA1]; Time_compare=[Time_compare,time_SSA(end)];curve_compare=[curve_compare;SSA_curve];name_all{1,iter}='G-SSA';iter=iter+1;%%%改进鲸鱼优化算法t1=clock;[fMin_EWOA,bestX_EWOA,EWOA_curve]=BKA(pop_num,Max_iter,lb,ub,dim,fobj); ER_EWOA=Fun1(bestX_EWOA,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);ER_EWOA1=Fun2(bestX_EWOA,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);t2=clock;time_EWOA=(t2(end)+t2(end-1)*60+t2(end-2)*3600-t1(end)-t1(end-1)*60-t1(end-2)*3600);ER_EWOA2=fun3(bestX_EWOA,x_test_data,x_train_mu,x_train_sigma,y_train_mu,y_train_sigma,y_test_data); %不进行BP反向Fival_compare=[Fival_compare,ER_EWOA2];Fival_compare1=[Fival_compare1,ER_EWOA]; Fival_compare2=[Fival_compare2,ER_EWOA1]; Time_compare=[Time_compare,time_EWOA(end)];curve_compare=[curve_compare;EWOA_curve];name_all{1,iter}='BKA';iter=iter+1;%%%正弦余弦优化算法 Sine Cosine Algorithmt1=clock;[fMin_SCA,bestX_SCA,SCA_curve]=SCA(pop_num,Max_iter,lb,ub,dim,fobj); ER_SCA=Fun1(bestX_SCA,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);ER_SCA1=Fun2(bestX_SCA,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);t2=clock;time_SCA=(t2(end)+t2(end-1)*60+t2(end-2)*3600-t1(end)-t1(end-1)*60-t1(end-2)*3600);ER_SCA2=fun3(bestX_EWOA,x_test_data,x_train_mu,x_train_sigma,y_train_mu,y_train_sigma,y_test_data); %不进行BP反向Fival_compare=[Fival_compare,ER_SCA2];Fival_compare1=[Fival_compare1,ER_SCA]; Fival_compare2=[Fival_compare2,ER_SCA1]; Time_compare=[Time_compare,time_SCA(end)];curve_compare=[curve_compare;SCA_curve];name_all{1,iter}='SCA';iter=iter+1;%% %POA  %IGOA%IGWOt1=clock;[fMin_SCA,bestX_SCA,SCA_curve]=G_DBO(pop_num,Max_iter,lb,ub,dim,fobj); ER_SCA=Fun1(bestX_SCA,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);ER_SCA1=Fun2(bestX_SCA,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data);t2=clock;ER_SCA2=fun3(bestX_EWOA,x_test_data,x_train_mu,x_train_sigma,y_train_mu,y_train_sigma,y_test_data); %不进行BP反向time_SCA=(t2(end)+t2(end-1)*60+t2(end-2)*3600-t1(end)-t1(end-1)*60-t1(end-2)*3600);Fival_compare=[Fival_compare,ER_SCA2];Fival_compare1=[Fival_compare1,ER_SCA]; Fival_compare2=[Fival_compare2,ER_SCA1]; Time_compare=[Time_compare,time_SCA(end)];curve_compare=[curve_compare;SCA_curve];name_all{1,iter}='G-DBO';iter=iter+1;FFival_compare1(NN,:)=Fival_compare1;FFival_compare2(NN,:)=Fival_compare2;end%%load('color_list.mat')figure(3)color=color_list(randperm(length(color_list)),:);width=0.7; %柱状图宽度for  i=1:length(Fival_compare1)    set(bar(i,Fival_compare1(i),width),'FaceColor',color(i,:),'EdgeColor',[0,0,0],'LineWidth',2)   hold on       %在柱状图 x,y 基础上 绘制误差 ,low为下误差,high为上误差,LineStyle 误差图样式,'Color' 误差图颜色     % 'LineWidth', 线宽,'CapSize',误差标注大小%    errorbar(i, y(i), low(i), high(i), 'LineStyle', 'none', 'Color', color(i+3,:), 'LineWidth', 1.5,'CapSize',18);endylabel('obj-value')ylim([min(Fival_compare1)-0.01,max(Fival_compare1)+0.01]);ax=gca;ax.XTick = 1:1:length(Fival_compare1);set(gca,'XTickLabel',name_all,"LineWidth",2);set(gca,"FontSize",12,"LineWidth",2)title('优化工具箱')%%load('color_list.mat')figure(4)color=color_list(randperm(length(color_list)),:);width=0.7; %柱状图宽度for  i=1:length(Fival_compare2)    set(bar(i,Fival_compare2(i),width),'FaceColor',color(i,:),'EdgeColor',[0,0,0],'LineWidth',2)   hold on       %在柱状图 x,y 基础上 绘制误差 ,low为下误差,high为上误差,LineStyle 误差图样式,'Color' 误差图颜色     % 'LineWidth', 线宽,'CapSize',误差标注大小%    errorbar(i, y(i), low(i), high(i), 'LineStyle', 'none', 'Color', color(i+3,:), 'LineWidth', 1.5,'CapSize',18);endylabel('obj-value')ylim([min(Fival_compare2)-0.01,max(Fival_compare2)+0.01]);ax=gca;ax.XTick = 1:1:length(Fival_compare2);set(gca,'XTickLabel',name_all,"LineWidth",2);set(gca,"FontSize",12,"LineWidth",2)title('自写网络')%%figure(5)bar([Fival_compare1;Fival_compare2]')ylabel('obj-value')ylim([min(Fival_compare2)-0.01,max(Fival_compare2)+0.01]);ax=gca;ax.XTick = 1:1:length(Fival_compare2);set(gca,'XTickLabel',name_all,"LineWidth",2);set(gca,"FontSize",12,"LineWidth",2)legend('工具箱','自写网络')%%figure(7)color=[0.741176470588235,0.729411764705882,0.725490196078431;0.525490196078431,...    0.623529411764706,0.752941176470588;0.631372549019608,0.803921568627451,...    0.835294117647059;0.588235294117647,0.576470588235294,0.576470588235294;...    0.0745098039215686,0.407843137254902,0.607843137254902;0.454901960784314,...    0.737254901960784,0.776470588235294;0.0156862745098039,0.0196078431372549,0.0156862745098039];% 颜色1mean_compare1=mean(FFival_compare1);std1_compare1=std(FFival_compare1);mean_compare2=mean(FFival_compare2);std1_compare2=std(FFival_compare2);b=bar([mean_compare1;mean_compare2]');data=[mean_compare1;mean_compare2]';hold onerro_data=[std1_compare1;std1_compare1]';ax = gca;for i = 1 : 2    x_data(:, i) = b(i).XEndPoints'; end
for i=1:2errorbar(x_data(:,i),data(:,i),erro_data(:,i),'LineStyle', 'none','Color',color(i+3,:) ,'LineWidth', 2,'CapSize',18)end
for i =1:2b(i).FaceColor = color(i,:);b(i).EdgeColor= color(i+3,:);b(i).LineWidth=1.5;endylabel('obj-value')maxl=max([mean_compare1,mean_compare2]);minl=min([mean_compare1,mean_compare2]);ylim([minl-0.01,maxl+0.01]);ax=gca;ax.XTick = 1:1:length(Fival_compare2);set(gca,'XTickLabel',name_all,"LineWidth",2);set(gca,"FontSize",12,"LineWidth",2)legend('工具箱','自写网络')box off% net=newff(x_train_regular,y_train_regular,hidden_num,{'logsig','purelin'},'trainlm','deviderand');%%% function fitness_value =objfun(input_pop,input_num,hidden_num,output_num,input_data,output_data)function fitness_value =objfun(input_pop)global input_num hidden_num output_num input_data output_data    w1=input_pop(1:input_num*hidden_num);   %输入和隐藏层之间的权重参数    B1=input_pop(input_num*hidden_num+1:input_num*hidden_num+hidden_num); %隐藏层神经元的偏置    w2=input_pop(input_num*hidden_num+hidden_num+1:input_num*hidden_num+...        hidden_num+hidden_num*output_num);  %隐藏层和输出层之间的偏置    B2=input_pop(input_num*hidden_num+hidden_num+hidden_num*output_num+1:input_num*hidden_num+...        hidden_num+hidden_num*output_num+output_num); %输出层神经元的偏置    %网络权值赋值    W1=reshape(w1,hidden_num,input_num);    W2=reshape(w2,output_num,hidden_num);    B1=reshape(B1,hidden_num,1);    B2=reshape(B2,output_num,1);    [~,n]=size(input_data);    A1=logsig(W1*input_data+repmat(B1,1,n));   %需与main函数中激活函数相同    A2=purelin(W2*A1+repmat(B2,1,n));      %需与main函数中激活函数相同      error=sumsqr(output_data-A2);    fitness_value=error; %误差即为适应度end%%function EcRMSE =fun3(input_pop,x_test_data,x_train_mu,x_train_sigma,y_train_mu,y_train_sigma,y_test_data)global input_num hidden_num output_num        w1=input_pop(1:input_num*hidden_num);   %输入和隐藏层之间的权重参数    B1=input_pop(input_num*hidden_num+1:input_num*hidden_num+hidden_num); %隐藏层神经元的偏置    w2=input_pop(input_num*hidden_num+hidden_num+1:input_num*hidden_num+...        hidden_num+hidden_num*output_num);  %隐藏层和输出层之间的偏置    B2=input_pop(input_num*hidden_num+hidden_num+hidden_num*output_num+1:input_num*hidden_num+...        hidden_num+hidden_num*output_num+output_num); %输出层神经元的偏置    %网络权值赋值%     W1=reshape(w1,hidden_num,input_num);%     W2=reshape(w2,output_num,hidden_num);%     B1=reshape(B1,hidden_num,1);%     B2=reshape(B2,output_num,1);    vij = reshape(w1,hidden_num,input_num) ;%输入和隐藏层的权重theta_u = reshape(B1,hidden_num,1);%输入与隐藏层之间的阈值Wj =  reshape(w2,output_num,hidden_num);%%输出和隐藏层的权重theta_y =reshape(B2,output_num,1);%输出与隐藏层之间的阈值%     [~,n]=size(input_data);%     A1=logsig(W1*input_data+repmat(B1,1,n));   %需与main函数中激活函数相同%     A2=purelin(W2*A1+repmat(B2,1,n));      %需与main函数中激活函数相同  %     error=sumsqr(output_data-A2);%     fitness_value=error; %误差即为适应度test_num=size(x_test_data,1);     x_test_regular = (x_test_data-repmat(x_train_mu,test_num,1))./repmat(x_train_sigma,test_num,1);% x_test_regular = mapminmax('apply',x_test_data,x_train_maxmin);%放入到网络输出数据x_test_std=x_test_regular';test_put = logsig(vij * x_test_std + repmat(theta_u, 1, test_num));test_out_std =  Wj * test_put + repmat(theta_y, 1, test_num);%反归一化SSA_BP_predict=test_out_std*y_train_sigma+y_train_mu;errors_nn=sum(abs(SSA_BP_predict'-y_test_data)./(y_test_data))/length(y_test_data);EcRMSE=sqrt(sum((errors_nn).^2)/length(errors_nn));% disp(EcRMSE)end%%function [EcRMSE,net1]=Fun1(bestX,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data)global input_num output_num x_train_mu y_train_mu x_train_sigma  y_train_sigmabestchrom=bestX;net=newff(x_train_regular,y_train_regular,hidden_num,{'logsig','purelin'},'trainlm');w1=bestchrom(1:input_num*hidden_num);   %输入和隐藏层之间的权重参数B1=bestchrom(input_num*hidden_num+1:input_num*hidden_num+hidden_num); %隐藏层神经元的偏置w2=bestchrom(input_num*hidden_num+hidden_num+1:input_num*hidden_num+...    hidden_num+hidden_num*output_num);  %隐藏层和输出层之间的偏置B2=bestchrom(input_num*hidden_num+hidden_num+hidden_num*output_num+1:input_num*hidden_num+...    hidden_num+hidden_num*output_num+output_num); %输出层神经元的偏置%网络权值赋值net.iw{1,1}=reshape(w1,hidden_num,input_num);net.lw{2,1}=reshape(w2,output_num,hidden_num);net.b{1}=reshape(B1,hidden_num,1);net.b{2}=reshape(B2,output_num,1);net.trainParam.epochs=200;          %最大迭代次数net.trainParam.lr=0.1;                        %学习率net.trainParam.goal=0.00001;[net,~]=train(net,x_train_regular,y_train_regular);%将输入数据归一化test_num=size(x_test_data,1);x_test_regular = (x_test_data-repmat(x_train_mu,test_num,1))./repmat(x_train_sigma,test_num,1);%放入到网络输出数据y_test_regular=sim(net,x_test_regular');net1=net;%将得到的数据反归一化得到预测数据 test_out_std=y_test_regular;%反归一化SSA_BP_predict=test_out_std*y_train_sigma+y_train_mu;errors_nn=sum(abs(SSA_BP_predict'-y_test_data)./(y_test_data))/length(y_test_data);EcRMSE=sqrt(sum((errors_nn).^2)/length(errors_nn));disp(EcRMSE)end%%function [EcRMSE,WW]=Fun2(bestX,x_train_regular,y_train_regular,hidden_num,x_test_data,y_test_data)global input_num output_num  x_train_mu y_train_mu x_train_sigma  y_train_sigma
train_num=length(y_train_regular); %自变量 test_num=length(y_test_data);bestchrom=bestX;% net=newff(x_train_regular,y_train_regular,hidden_num,{'tansig','purelin'},'trainlm');w1=bestchrom(1:input_num*hidden_num);   %输入和隐藏层之间的权重参数B1=bestchrom(input_num*hidden_num+1:input_num*hidden_num+hidden_num); %隐藏层神经元的偏置w2=bestchrom(input_num*hidden_num+hidden_num+1:input_num*hidden_num+...    hidden_num+hidden_num*output_num);  %隐藏层和输出层之间的偏置B2=bestchrom(input_num*hidden_num+hidden_num+hidden_num*output_num+1:input_num*hidden_num+...    hidden_num+hidden_num*output_num+output_num); %输出层神经元的偏置%网络权值赋值x_train_std=x_train_regular;y_train_std=y_train_regular;%vij = reshape(w1,hidden_num,input_num) ;%输入和隐藏层的权重theta_u = reshape(B1,hidden_num,1);%输入与隐藏层之间的阈值Wj =  reshape(w2,output_num,hidden_num);%%输出和隐藏层的权重theta_y =reshape(B2,output_num,1);%输出与隐藏层之间的阈值%learn_rate = 0.0001;%学习率Epochs_max = 30000;%最大迭代次数error_rate = 0.001;%目标误差Obj_save = zeros(1,Epochs_max);%损失函数% 训练网络epoch_num=0;while epoch_num <Epochs_max    epoch_num=epoch_num+1;      y_pre_std_u=vij * x_train_std + repmat(theta_u, 1, train_num);    y_pre_std_u1 = logsig(y_pre_std_u);      y_pre_std_y = Wj * y_pre_std_u1 + repmat(theta_y, 1, train_num);      y_pre_std_y1=y_pre_std_y;    obj =  y_pre_std_y1-y_train_std ;        Ems = sumsqr(obj);    Obj_save(epoch_num) = Ems;     if Ems < error_rate        break;    end     %梯度下降    %输出采用rule函数,隐藏层采用sigomd激活函数    c_wj= 2*(y_pre_std_y1-y_train_std)* y_pre_std_u1';        c_theta_y=2*(y_pre_std_y1-y_train_std)*ones(train_num, 1);        c_vij=Wj'* 2*(y_pre_std_y1-y_train_std).*(y_pre_std_u1).*(1-y_pre_std_u1)* x_train_std';        c_theta_u=Wj'* 2*(y_pre_std_y1-y_train_std).*(y_pre_std_u1).*(1-y_pre_std_u1)* ones(train_num, 1);        Wj=Wj-learn_rate*c_wj;        theta_y=theta_y-learn_rate*c_theta_y;        vij=vij- learn_rate*c_vij;         theta_u=theta_u-learn_rate*c_theta_u;end WW=[vij(:);theta_u;Wj(:);theta_y];%  W1=[Wj(:),theta_y,vij(:),theta_u]; x_test_regular = (x_test_data-repmat(x_train_mu,test_num,1))./repmat(x_train_sigma,test_num,1);% x_test_regular = mapminmax('apply',x_test_data,x_train_maxmin);%放入到网络输出数据x_test_std=x_test_regular';test_put = logsig(vij * x_test_std + repmat(theta_u, 1, test_num));test_out_std =  Wj * test_put + repmat(theta_y, 1, test_num);%反归一化SSA_BP_predict=test_out_std*y_train_sigma+y_train_mu;errors_nn=sum(abs(SSA_BP_predict'-y_test_data)./(y_test_data))/length(y_test_data);EcRMSE=sqrt(sum((errors_nn).^2)/length(errors_nn));disp(EcRMSE)end

福利:
包含:

Java、云原生、GO语音、嵌入式、Linux、物联网、AI人工智能、python、C/C++/C#、软件测试、网络安全、Web前端、网页、大数据、Android大模型多线程、JVM、Spring、MySQL、Redis、Dubbo、中间件…等最全厂牌最新视频教程+源码+软件包+面试必考题和答案详解。
福利:想要的资料全都有 ,全免费,没有魔法和套路
————————————————————————————

关注公众号:资源充电吧


点击小卡片关注下,回复:学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/44281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark shuffle写操作——SortShuffleWriter

写入的简单流程&#xff1a; 1.生成ExternalSorter对象 2.将消息都是插入ExternalSorter对象中 3.获取到mapOutputWriter&#xff0c;将中间产生的临时文件合并到一个临时文件 4.生成最后的data文件和index文件 可以看到写入的重点类是ExternalSorter对象 ExternalSorter 基…

人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作与代码详解。OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它提供了各种视觉处理函数&am…

Redis为什么变慢了?一文讲透如何排查Redis性能问题

Redis 作为优秀的内存数据库&#xff0c;其拥有非常高的性能&#xff0c;单个实例的 OPS 能够达到 10W 左右。但也正因此如此&#xff0c;当我们在使用 Redis 时&#xff0c;如果发现操作延迟变大的情况&#xff0c;就会与我们的预期不符。 你也许或多或少地&#xff0c;也遇到…

以太网中的各种帧结构

帧结构&#xff08;Ethernet Frame Structure&#xff09;介绍 以太网信号帧结构&#xff08;Ethernet Signal Frame Structure&#xff09;&#xff0c;有被称为以太网帧结构&#xff0c;一般可以分为两类 —— 数据帧和管理帧。 按照 IEEE 802.3&#xff0c;ISO/IEC8803-3 …

短视频矩阵管理系统:如何提升内容质量,帮助企业获客?

在数字化营销蓬勃发展的今天&#xff0c;短视频已成为企业推广的重要阵地。然而&#xff0c;如何高效管理短视频内容&#xff0c;提升内容质量&#xff0c;进而帮助企业精准获客&#xff0c;成为企业亟待解决的问题。短视频矩阵管理系统应运而生&#xff0c;以其强大的功能和灵…

编程范式之并发编程

目录 前言1. 并发编程的定义2. 并发编程的特点2.1 任务交替执行2.2 状态共享与同步2.3 并行执行 3. 并发编程的适用场景3.1 高性能计算3.2 I/O 密集型应用3.3 实时系统 4. 并发编程的优点4.1 提高资源利用率4.2 缩短响应时间4.3 提高系统吞吐量 5. 并发编程的缺点5.1 编程复杂性…

硬盘模式vmd怎么改ahci_电脑vmd改ahci模式详细步骤

最近有很多网友问&#xff0c;我新买的电脑安装原版win10或win11找不到驱动器呀&#xff0c;进入第三方pe又找不到硬盘&#xff0c;找到硬盘安装后又出现安装蓝屏的情况&#xff0c;新机器怎么回事呀&#xff1f;这位网友内心有点崩溃&#xff0c;不知道啥原因。其实这些都是由…

初识c++(类与对象——上)

一、类的定义 1、类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省 略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或 者成员函…

【Node.js安装教程】

Node.js安装教程 第一步&#xff1a;下载 下载链接&#xff1a;https://nodejs.org/zh-cn 第二步&#xff1a;安装 **方法一&#xff1a;**建议安装在默认路径 方法二&#xff1a;如果不是默认安装路径可能会出现一系列问题&#xff1a;这时可以选择卸载重装或者配置环境变量…

kotlin数据类型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 Kotlin基本数值类型 基本数据类型包括 Byte、Short、Int、Long、Float、Double 整数类型 类型位宽最小值最大…

安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片

安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片 复习了下安卓程序的知识&#xff0c;我们会了解到&#xff0c;安卓程序清楚数据的时候有两个选项 一个是清除全部数据一个是清除缓存。 清除全部数据表示清除应用数据缓存。 对于安卓微信8.0之后而言&#xff0…

彻底开源,免费商用,上海AI实验室把大模型门槛打下来

终于&#xff0c;业内迎来了首个全链条大模型开源体系。 大模型领域&#xff0c;有人探索前沿技术&#xff0c;有人在加速落地&#xff0c;也有人正在推动整个社区进步。 就在近日&#xff0c;AI 社区迎来首个统一的全链条贯穿的大模型开源体系。 虽然社区有LLaMA等影响力较大…

从 ArcMap 迁移到 ArcGIS Pro

许多 ArcMap 用户正在因 ArcGIS Pro 所具有的现代 GIS 桌面工作流优势而向其迁移。 ArcGIS Pro 与其余 ArcGIS 平台紧密集成&#xff0c;使您可以更有效地共享和使用内容。 它还将 2D 和 3D 组合到一个应用程序中&#xff0c;使您可以在同一工程中使用多个地图和多个布局。 Arc…

【C++杂货铺】C++11新特性

目录 &#x1f308; 前言&#x1f308; &#x1f4c1; C11介绍 &#x1f4c1; 统一初始化列表 &#x1f4c1; 声明 &#x1f4c2; auto &#x1f4c2; decltype &#x1f4c2; 返回类型后置 &#x1f4c2; 范围for &#x1f4c2; 模板别名 &#x1f4c2; nullptr &#x1…

服务器使用PC作为代理访问外网

1、PC上启动代理&#xff0c;比如nginx 下载nginx&#xff1a;http://nginx.org/en/download.html 修改配置文件&#xff0c;在conf下&#xff1a; http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server…

六、 SpringBoot 配置⽂件 ★ ✔

六、 SpringBoot 配置⽂件 本节⽬标1. 配置⽂件作⽤2. 配置⽂件快速⼊⼿3. 配置⽂件的格式4. properties 配置⽂件说明4.1 properties 基本语法4.2 读取配置⽂件4.3 properties 缺点分析 5. yml 配置⽂件说明5.1 yml 基本语法5.2 yml 使⽤进阶5.2.1 yml 配置不同数据类型及 nul…

好用的源代码加密软件有哪些?5款源代码防泄密软件推荐

源代码作为软件产品的核心组成部分&#xff0c;其安全性直接关系到整个软件系统的安全。源代码的泄露可能导致企业的技术秘密暴露&#xff0c;商业竞争力下降&#xff0c;甚至可能引发经济损失和法律责任问题。因此&#xff0c;对源代码进行加密保护&#xff0c;已经成为企业不…

windows安装启动mysql8.0版本的简单流程

1.下载mysql8.0.25版本 MySQL :: Download MySQL Community Server (Archived Versions) 2.解压到D盘的mysql文件夹,并修改环境变量 配置环境变量: winr键>输入control system>高级系统设置>点击环境变量 双击path后,新建 将bin目录粘贴进去,再点击确定 在cmd命令行…

【JavaScript 报错】未定义的变量或函数:Uncaught ReferenceError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 变量未定义2. 函数未定义3. 块级作用域问题 二、解决方案1. 确保变量已定义2. 确保函数已定义3. 正确使用块级作用域 三、实例讲解四、总结 在JavaScript开发中&#xff0c;Uncaught ReferenceError 是一…

C#使用异步方式调用同步方法的实现方法

使用异步方式调用同步方法&#xff0c;在此我们使用异步编程模型&#xff08;APM&#xff09;实现 1、定义异步委托和测试方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Task…