分类预测|基于HHO-CNN-BiLSTM-Attention的数据分类预测Matlab程序 多特征输入多类别输出

分类预测|基于HHO-CNN-BiLSTM-Attention的数据分类预测Matlab程序 多特征输入多类别输出


前言:HHO-CNN-BiLSTM-Attention流程

HHO-CNN-BiLSTM-Attention是一个结合了多种神经网络结构和注意力机制的模型,下面简述其流程和各部分的作用:

  1. 数据预处理

    • 首先,对输入数据进行预处理,包括标准化、归一化等操作,确保数据处于适合网络处理的状态。
  2. 卷积神经网络(CNN)

    • CNN用于提取输入数据中的空间特征,比如图像数据中的边缘、纹理等特征。通常,CNN的前几层会捕捉低级别的特征,而后续层则捕捉更高级别的抽象特征。
  3. 双向长短期记忆网络(BiLSTM)

    • BiLSTM用于处理数据中的时间序列特征或文本序列特征。它能够捕捉序列数据中的长期依赖关系,并且由于是双向的,可以同时考虑过去和未来的信息。
  4. 注意力机制(Attention)

    • 注意力机制用于增强模型对输入的关注能力,使得模型能够在处理长序列或大数据集时更加精确和高效。在这个结构中,注意力机制可以帮助模型集中注意力在最相关的部分,提高模型的准确性和效率。
  5. HHO优化算法应用

    • HHO优化算法被应用于整个模型的训练过程中,用于优化模型中的参数或超参数。HHO算法通过模拟哈里斯鹰的捕食行为来更新模型中的权重和偏差,以最小化损失函数或其他评价指标。
  6. 训练和优化

    • 模型在训练过程中通过反向传播算法更新参数,同时HHO算法可以用来优化学习率、层次结构等超参数,以提高模型的收敛速度和效果。
  7. 模型输出

    • 经过训练和优化后,模型可以用来进行预测、分类或其他任务,输出结果可以是预测标签、概率分布等。

总结来说,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算法基于哈里斯鹰在捕食过程中的行为策略,通过模拟这些策略来进行优化问题的求解。其基本原理可以概括如下:

    1. 探索与开发:算法中的个体被分为两种角色,即探索者和开发者。探索者类似于哈里斯鹰群体中的一部分成员,负责在解空间中探索潜在解。开发者则代表那些已经找到较好解的个体,它们会被用来引导其他个体朝着更优解的方向移动。

    2. 哈里斯鹰的行为策略:HHO算法中模仿了哈里斯鹰的三种主要捕食行为:

      • 突袭(Surrounding Effect):较强的个体(代表优秀的解)会引导其他个体向其周围聚集,增加全局最优解的可能性。
      • 展翅(Flocking Effect):群体中个体相互之间的交流和合作,使得整体搜索更加高效。
      • 寻找(Explore and Exploit):算法在探索和利用潜在解之间保持平衡,以避免早熟收敛或过度探索。
    3. 优化过程: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机制相结合,能够有效提取数据中的特征信息,并从中挖掘出有用的信息以进行分类预测。在实验中,该程序实现了对不同种类数据的分类预测,并且在预测准确度方面取得了优秀的成绩。因此,该程序具有很大的应用价值,可以在各行各业中应用于数据分类预测领域。

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值