分类预测|基于HHO-CNN-BiLSTM-Attention的数据分类预测Matlab程序 多特征输入多类别输出
文章目录
前言:HHO-CNN-BiLSTM-Attention流程
HHO-CNN-BiLSTM-Attention是一个结合了多种神经网络结构和注意力机制的模型,下面简述其流程和各部分的作用:
-
数据预处理:
- 首先,对输入数据进行预处理,包括标准化、归一化等操作,确保数据处于适合网络处理的状态。
-
卷积神经网络(CNN):
- CNN用于提取输入数据中的空间特征,比如图像数据中的边缘、纹理等特征。通常,CNN的前几层会捕捉低级别的特征,而后续层则捕捉更高级别的抽象特征。
-
双向长短期记忆网络(BiLSTM):
- BiLSTM用于处理数据中的时间序列特征或文本序列特征。它能够捕捉序列数据中的长期依赖关系,并且由于是双向的,可以同时考虑过去和未来的信息。
-
注意力机制(Attention):
- 注意力机制用于增强模型对输入的关注能力,使得模型能够在处理长序列或大数据集时更加精确和高效。在这个结构中,注意力机制可以帮助模型集中注意力在最相关的部分,提高模型的准确性和效率。
-
HHO优化算法应用:
- HHO优化算法被应用于整个模型的训练过程中,用于优化模型中的参数或超参数。HHO算法通过模拟哈里斯鹰的捕食行为来更新模型中的权重和偏差,以最小化损失函数或其他评价指标。
-
训练和优化:
- 模型在训练过程中通过反向传播算法更新参数,同时HHO算法可以用来优化学习率、层次结构等超参数,以提高模型的收敛速度和效果。
-
模型输出:
- 经过训练和优化后,模型可以用来进行预测、分类或其他任务,输出结果可以是预测标签、概率分布等。
总结来说,HHO-CNN-BiLSTM-Attention模型结合了多种神经网络结构和优化方法,利用CNN提取空间特征、BiLSTM处理序列特征,并通过注意力机制增强模型性能,最终通过HHO算法优化整体模型,使其在给定任务中达到更好的性能和效果。
一、哈里斯鹰优化HHO
哈里斯鹰优化算法(Harris’ Hawks Optimization,简称HHO)是一种基于自然界中哈里斯鹰捕食行为启发的优化算法,由Xin-She Yang于2019年提出。以下是关于HHO的详细介绍:
-
发表时间和期刊:
HHO算法最早由Xin-She Yang在2019年发表在期刊《Advances in Engineering Software》上。这篇文章的标题是《Harris hawks optimization: Algorithm and applications》。 -
基本原理:
HHO算法基于哈里斯鹰在捕食过程中的行为策略,通过模拟这些策略来进行优化问题的求解。其基本原理可以概括如下:-
探索与开发:算法中的个体被分为两种角色,即探索者和开发者。探索者类似于哈里斯鹰群体中的一部分成员,负责在解空间中探索潜在解。开发者则代表那些已经找到较好解的个体,它们会被用来引导其他个体朝着更优解的方向移动。
-
哈里斯鹰的行为策略:HHO算法中模仿了哈里斯鹰的三种主要捕食行为:
- 突袭(Surrounding Effect):较强的个体(代表优秀的解)会引导其他个体向其周围聚集,增加全局最优解的可能性。
- 展翅(Flocking Effect):群体中个体相互之间的交流和合作,使得整体搜索更加高效。
- 寻找(Explore and Exploit):算法在探索和利用潜在解之间保持平衡,以避免早熟收敛或过度探索。
-
优化过程:HHO通过迭代更新个体的位置(解)来优化问题,具体的步骤包括位置更新、评估适应度和选择个体的角色(探索者或开发者)等。
-
HHO算法在模拟捕食行为方面与其他启发式优化算法有所不同,其灵感来源于自然界中的鸟类行为,通过这些策略提高了全局优化问题的解决效率和准确性。
二、数据展示
结果展示
三、核心代码
读取数据
%% 导入数据
res = xlsread('数据集.xlsx');
rng(42,'twister'); %随机种子
%% 数据分析
num_size = 0.7; % 训练集占数据集比例
outdim = 1; % 最后一列为输出
num_class = length(unique(res(:,end))); % 计算类别数
num_samples = size(res, 1); % 样本个数
res = res(randperm(num_samples), :); % 打乱数据集(不希望打乱时,注释该行)
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim; % 输入特征维度
%% 划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);
%% 数据归一化
[P_train, ps_input] = mapminmax(P_train, 0, 1);
P_test = mapminmax('apply', P_test, ps_input);
t_train = categorical(T_train)';
t_test = categorical(T_test )';
%% 数据平铺
P_train = double(reshape(P_train, f_, 1, 1, M));
P_test = double(reshape(P_test , f_, 1, 1, N));
CNN-BiLSTM核心代码
%% 建立模型
lgraph = layerGraph(); % 建立空白网络结构
tempLayers = [
sequenceInputLayer([f_, 1, 1], "Name", "sequence") % 建立输入层,输入数据结构为[num_dim, 1, 1]
sequenceFoldingLayer("Name", "seqfold")]; % 建立序列折叠层
lgraph = addLayers(lgraph, tempLayers); % 将上述网络结构加入空白结构中
tempLayers = [
convolution2dLayer([3, 1], 16, "Name", "conv_1", "Padding", "same") % 建立卷积层,卷积核大小[3, 1],16个特征图
reluLayer("Name", "relu_1") % Relu 激活层
convolution2dLayer([3, 1], 32, "Name", "conv_2", "Padding", "same") % 建立卷积层,卷积核大小[3, 1],16个特征图
reluLayer("Name", "relu_2") ];
tempLayers = [
sequenceUnfoldingLayer("Name", "sequnfold") % 建立序列反折叠层
flattenLayer("Name", "flatten") % 网络铺平层
bilstmLayer(best_hd, "Name", "bilstm", "OutputMode","last") % BiLSTM层
selfAttentionLayer(1,32,"Name","selfattention") % 注意力层
fullyConnectedLayer(num_class, "Name", "fc") % 全连接层
softmaxLayer( "Name", "softmax") % 损失函数层
classificationLayer( "Name", "classificationLayer")]; % 分类层
HHO核心代码
%%
% 机器不会学习
% 面包多主页:https://mbd.pub/o/curry/work
%%
function [Rabbit_Energy,Rabbit_Location,CNVG]=HHO(N,T,lb,ub,dim,fobj)
tic
% initialize the location and Energy of the rabbit
Rabbit_Location=zeros(1,dim);
Rabbit_Energy=inf;
%Initialize the locations of Harris' hawks
X=initialization(N,dim,ub,lb);
CNVG=zeros(1,T);
t=0; % Loop counter
while t<T
for i=1:size(X,1)
% Check boundries
FU=X(i,:)>ub;FL=X(i,:)<lb;X(i,:)=(X(i,:).*(~(FU+FL)))+ub.*FU+lb.*FL;
% fitness of locations
fitness=fobj(X(i,:));
% Update the location of Rabbit
if fitness<Rabbit_Energy
Rabbit_Energy=fitness;
Rabbit_Location=X(i,:);
end
end
E1=2*(1-(t/T)); % factor to show the decreaing energy of rabbit
% Update the location of Harris' hawks
for i=1:size(X,1)
E0=2*rand()-1; %-1<E0<1
Escaping_Energy=E1*(E0); % escaping energy of rabbit
if abs(Escaping_Energy)>=1
%% Exploration:
% Harris' hawks perch randomly based on 2 strategy:
q=rand();
rand_Hawk_index = floor(N*rand()+1);
X_rand = X(rand_Hawk_index, :);
if q<0.5
% perch based on other family members
X(i,:)=X_rand-rand()*abs(X_rand-2*rand()*X(i,:));
elseif q>=0.5
% perch on a random tall tree (random site inside group's home range)
X(i,:)=(Rabbit_Location(1,:)-mean(X))-rand()*((ub-lb)*rand+lb);
end
elseif abs(Escaping_Energy)<1
%% Exploitation:
% Attacking the rabbit using 4 strategies regarding the behavior of the rabbit
%% phase 1: surprise pounce (seven kills)
% surprise pounce (seven kills): multiple, short rapid dives by different hawks
r=rand(); % probablity of each event
if r>=0.5 && abs(Escaping_Energy)<0.5 % Hard besiege
X(i,:)=(Rabbit_Location)-Escaping_Energy*abs(Rabbit_Location-X(i,:));
end
if r>=0.5 && abs(Escaping_Energy)>=0.5 % Soft besiege
Jump_strength=2*(1-rand()); % random jump strength of the rabbit
X(i,:)=(Rabbit_Location-X(i,:))-Escaping_Energy*abs(Jump_strength*Rabbit_Location-X(i,:));
end
%% phase 2: performing team rapid dives (leapfrog movements)
if r<0.5 && abs(Escaping_Energy)>=0.5 % Soft besiege % rabbit try to escape by many zigzag deceptive motions
Jump_strength=2*(1-rand());
X1=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-X(i,:));
FU=X1>ub;FL=X1<lb;X1=(X1.*(~(FU+FL)))+ub.*FU+lb.*FL;
% X1=abs(X1);
if fobj(X1)<fobj(X(i,:)) % improved move?
X(i,:)=X1;
else % hawks perform levy-based short rapid dives around the rabbit
X2=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-X(i,:))+rand(1,dim).*Levy(dim);
FU=X2>ub;FL=X2<lb;X2=(X2.*(~(FU+FL)))+ub.*FU+lb.*FL;
% X2=abs(X2);
if (fobj(X2)<fobj(X(i,:))) % improved move?
X(i,:)=X2;
end
end
end
if r<0.5 && abs(Escaping_Energy)<0.5 % Hard besiege % rabbit try to escape by many zigzag deceptive motions
% hawks try to decrease their average location with the rabbit
Jump_strength=2*(1-rand());
X1=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-mean(X));
FU=X1>ub;FL=X1<lb;X1=(X1.*(~(FU+FL)))+ub.*FU+lb.*FL;
% X1=abs(X1);
if fobj(X1)<fobj(X(i,:)) % improved move?
X(i,:)=X1;
else % Perform levy-based short rapid dives around the rabbit
X2=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-mean(X))+rand(1,dim).*Levy(dim);
FU=X2>ub;FL=X2<lb;X2=(X2.*(~(FU+FL)))+ub.*FU+lb.*FL;
% X2=abs(X2);
if (fobj(X2)<fobj(X(i,:))) % improved move?
X(i,:)=X2;
end
end
end
%%
end
end
t=t+1;
CNVG(t)=Rabbit_Energy;
disp(['第',num2str(t),'次迭代'])
display(['At iteration ', num2str(t), ' the best fitness is ', num2str(Rabbit_Energy)]);
end
toc
end
% ___________________________________
function o=Levy(d)
beta=1.5;
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
u=randn(1,d)*sigma;v=randn(1,d);step=u./abs(v).^(1/beta);
o=step;
end
总结
本文介绍了一种基于HHO-CNN-BiLSTM-Attention的数据分类预测Matlab程序。该程序能够实现多特征输入、多类别输出的数据分类预测,并且在实验中呈现出良好的表现。通过将HHO算法、CNN卷积神经网络、BiLSTM双向长短期记忆网络和Attention机制相结合,能够有效提取数据中的特征信息,并从中挖掘出有用的信息以进行分类预测。在实验中,该程序实现了对不同种类数据的分类预测,并且在预测准确度方面取得了优秀的成绩。因此,该程序具有很大的应用价值,可以在各行各业中应用于数据分类预测领域。
标签:Attention,num,Name,BiLSTM,分类,train,CNN,HHO From: https://blog.csdn.net/2401_86241083/article/details/140335618