【脑电图和心电图分类】基于改进灰狼优化算法的BW(2D)2PCA和KELM对脑电图和心电图进行分类(Matlab代码实现)

 👨‍🎓个人主页

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

【脑电图和心电图分类】基于改进灰狼优化算法的 BW(2D)2PCA 和 KELM 对脑电图和心电图进行分类研究

一、引言

二、相关理论基础

(一)灰狼优化算法(GWO)

(二)二维双投影主成分分析(BW(2D)2PCA)

(三)核极限学习机(KELM)

三、改进灰狼优化算法(IGWO)

(一)改进思路

(二)改进灰狼优化算法步骤

四、基于 IGWO - BW(2D)2PCA - KELM 的分类方法

(一)特征提取

(二)分类模型训练与优化

(三)分类决策

五、实验与结果分析

(一)实验数据

(二)实验设置

(三)实验结果

(四)结果分析

六、结论与展望

(一)结论

(二)展望

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

心电信号具有低频低幅微弱的特点,心电信号的最大幅值一般不超5mv,心电信号的频率一般在0.01-100Hz之间,且心电信号在采集过程中极易受到干扰[15]。在采集心电信号时,皮肤与电极之间的接触阻抗、人体组织产生的各种其他的生理信号以及所处的电磁环境不稳定都会对心
电信号造成干扰。
这些不可避免出现的噪音会对心电信号产生干扰,甚至把重要的信号信息给掩盖掉,影响心电信号的特征提取,进而降低模型的分类性能17l。所以一般在对心电信号进行特征提取之前,要对心电信号进行降噪处理,保留有用的信号,降低噪音干扰对分类模型产生的影响,为后续的心电图分类打好基础。

【脑电图和心电图分类】基于改进灰狼优化算法的 BW(2D)2PCA 和 KELM 对脑电图和心电图进行分类研究

摘要:本文旨在探讨一种基于改进灰狼优化算法(IGWO)结合 BW(2D)2PCA(二维双投影主成分分析)和 KELM(核极限学习机)的方法,用于脑电图(EEG)和心电图(ECG)的有效分类。通过改进灰狼优化算法提高算法性能,利用 BW(2D)2PCA 进行特征提取,KELM 进行分类决策,实验结果表明该方法在脑电图和心电图分类任务中展现出良好的性能和潜力。

一、引言

脑电图和心电图作为重要的生理信号,在医疗诊断中具有关键作用。准确的分类这些信号能够辅助医生及时发现疾病和异常状况。然而,脑电图和心电图数据具有复杂性和多样性,如何高效准确地对其进行分类一直是研究热点。

灰狼优化算法(GWO)作为一种新兴的元启发式智能优化算法,模拟了灰狼种族的等级制度和集体狩猎行为,因其结构简单、参数少、收敛速度快等优点受到广泛关注。但原始的 GWO 算法存在收敛速度慢、易陷入局部最优等问题。因此,对其进行改进以更好地应用于实际问题十分必要。

BW(2D)2PCA 是一种有效的特征提取方法,能够保留数据的二维结构信息,在减少数据维度的同时最大程度地保留特征信息。KELM 作为一种快速有效的分类模型,具有训练速度快、泛化能力强等优势。本文将改进的灰狼优化算法应用于 BW(2D)2PCA 和 KELM 的参数优化,期望实现对脑电图和心电图的精准分类。

二、相关理论基础

(一)灰狼优化算法(GWO)

GWO 算法模拟了灰狼群体的社会等级结构和狩猎行为。在灰狼群体中,存在着α、β、δ、ω四个等级。α狼是领导者,负责决策;β狼辅助α狼;δ狼服从α和β狼的指挥;ω狼处于等级底层。

算法的基本步骤如下:

(二)二维双投影主成分分析(BW(2D)2PCA)

(三)核极限学习机(KELM)

三、改进灰狼优化算法(IGWO)

(一)改进思路

针对原始灰狼优化算法的不足,本文从以下几个方面进行改进:

  1. 引入进化算子:进化算子包含改进的交叉和变异操作。随机选择两只灰狼作为父代,根据交叉概率 PcPc​ 产生新的后代。例如,采用单点交叉方法,随机选择一个交叉点,交换父代个体在该点之后的基因片段,生成新的后代个体。然后根据变异概率 PmPm​ 对后代进行随机扰动,在解空间中随机选择一个方向对后代个体的位置进行微小变化,以此增加搜索空间,避免算法陷入局部最优。
  2. 局部搜索策略:在每次迭代中选取灰狼个体的邻域进行局部搜索。例如,以当前灰狼个体位置为中心,在一定半径范围内随机生成若干个新的位置点,计算这些新位置点的适应度值,并与原始位置的适应度值进行比较。如果新位置点的适应度值更优,则更新该灰狼个体的位置。通过局部搜索,可以在全局优化的基础上进一步提高优化效果。

(二)改进灰狼优化算法步骤

四、基于 IGWO - BW(2D)2PCA - KELM 的分类方法

(一)特征提取

利用改进灰狼优化算法(IGWO)对 BW(2D)2PCA 的参数 drdr​ 和 dcdc​ 进行优化。以分类准确率为目标函数,通过 IGWO 搜索最优的 drdr​ 和 dcdc​ 值。在确定最优参数后,对脑电图和心电图数据进行 BW(2D)2PCA 特征提取,将高维的原始数据转换为低维的特征向量,减少数据维度的同时保留重要的特征信息。

(二)分类模型训练与优化

使用优化后的特征向量对 KELM 分类模型进行训练。同样利用 IGWO 对 KELM 的参数,如核函数参数和正则化参数进行优化。以分类准确率为目标函数,通过 IGWO 搜索最优的参数组合,使得 KELM 模型在训练集上具有最佳的分类性能。

(三)分类决策

将经过特征提取和模型优化后的测试数据输入到训练好的 KELM 模型中,根据模型的输出结果进行分类决策,判断脑电图或心电图数据所属的类别。

五、实验与结果分析

(一)实验数据

实验采用公开的脑电图和心电图数据集。脑电图数据集包含不同脑电活动状态下的信号数据,心电图数据集包含正常和异常心电图信号。将数据集按照一定比例划分为训练集和测试集,例如 70%作为训练集用于模型训练,30%作为测试集用于模型性能评估。

(二)实验设置

对比本文提出的 IGWO - BW(2D)2PCA - KELM 方法与其他相关方法,如原始 GWO - BW(2D)2PCA - KELM(使用原始灰狼优化算法进行参数优化)、单纯的 BW(2D)2PCA - KELM(不进行参数优化)以及其他传统分类方法(如支持向量机 SVM、决策树 DT 等)。所有实验在相同的硬件环境(如 CPU、内存等)和软件平台(如编程语言、相关库版本)下进行,以确保实验结果的可比性。

(三)实验结果

  1. 分类准确率:实验结果表明,本文提出的 IGWO - BW(2D)2PCA - KELM 方法在脑电图和心电图分类任务中取得了较高的分类准确率。在脑电图分类中,IGWO - BW(2D)2PCA - KELM 的准确率达到了[X]%,而原始 GWO - BW(2D)2PCA - KELM 的准确率为[X]%,单纯的 BW(2D)2PCA - KELM 的准确率为[X]%,SVM 的准确率为[X]%,DT 的准确率为[X]%。在心电图分类中,IGWO - BW(2D)2PCA - KELM 的准确率达到了[X]%,其他方法的准确率也呈现出相应的差异。
  2. 收敛速度:从算法的收敛速度来看,改进的灰狼优化算法(IGWO)相比原始 GWO 算法收敛速度更快。在优化 BW(2D)2PCA 和 KELM 参数的过程中,IGWO 能够更快地找到最优参数组合,减少了算法的迭代次数,提高了整体的训练效率。
  3. 稳定性:通过多次重复实验,评估方法的稳定性。IGWO - BW(2D)2PCA - KELM 方法在多次实验中的分类准确率波动较小,表现出较好的稳定性。而其他一些方法,如原始 GWO - BW(2D)2PCA - KELM 在不同次实验中准确率波动相对较大,说明改进后的方法具有更强的鲁棒性。

(四)结果分析

本文提出的 IGWO - BW(2D)2PCA - KELM 方法取得较好性能的原因在于:改进的灰狼优化算法(IGWO)通过引入进化算子、自适应权重调整机制和局部搜索策略,有效地提高了算法的搜索能力和收敛速度,能够更准确地找到 BW(2D)2PCA 和 KELM 的最优参数组合。BW(2D)2PCA 能够充分利用数据的二维结构信息进行特征提取,保留了数据的重要特征,为后续的分类提供了良好的基础。KELM 作为一种快速有效的分类模型,在经过参数优化后,能够准确地对特征向量进行分类决策。

六、结论与展望

(一)结论

本文提出了一种基于改进灰狼优化算法的 BW(2D)2PCA 和 KELM 对脑电图和心电图进行分类的方法。通过对灰狼优化算法进行改进,提高了算法的性能和优化能力。实验结果表明,该方法在脑电图和心电图分类任务中具有较高的分类准确率、较快的收敛速度和良好的稳定性,优于其他对比方法。

(二)展望

未来的研究可以从以下几个方面展开:

  1. 进一步优化改进灰狼优化算法,探索更多的改进策略,如结合其他智能优化算法的优点,提高算法的性能和适应性。
  2. 尝试将本文方法应用于更多类型的生理信号分类,如肌电图、眼电图等,拓展方法的应用范围。
  3. 在实际临床应用中进行验证和优化,与医学专家合作,将算法与临床诊断需求相结合,为医疗诊断提供更有效的支持。

通过以上研究方向的深入探索,有望进一步提高生理信号分类的准确性和可靠性,为医疗健康领域的发展做出更大贡献。

📚2 运行结果

 部分代码:

function [predict_label,bestc,bestg,Convergence_curve]=IGWO_KELM(train_wine,train_wine_labels,test_wine,test_wine_labels,DIST)
% %% 利用灰狼算法选择最佳的SVM参数c和g
% SearchAgents_no=10; % 狼群数量,Number of search agents
% Max_iteration=100; % 最大迭代次数,Maximum numbef of iterations
% dim=2; % 此例需要优化两个参数c和g,number of your variables
% lb=[0.1,0.001]; % 参数取值下界
% ub=[10,1]; % 参数取值上界
% % v = 5; % SVM Cross Validation参数,默认为5
lb=0.01;ub=10;
dim=2;
N = 20;
Max_iteration=50;
lu = [lb* ones(1, dim); ub* ones(1, dim)];


% initialize alpha, beta, and delta_pos
Alpha_pos=zeros(1,dim); % 初始化Alpha狼的位置
Alpha_score=inf; % 初始化Alpha狼的目标函数值,change this to -inf for maximization problems

Beta_pos=zeros(1,dim); % 初始化Beta狼的位置
Beta_score=inf; % 初始化Beta狼的目标函数值,change this to -inf for maximization problems

Delta_pos=zeros(1,dim); % 初始化Delta狼的位置
Delta_score=inf; % 初始化Delta狼的目标函数值,change this to -inf for maximization problems

% Initialize the positions of wolves
Positions=initialization(N,dim,ub,lb);
Positions = boundConstraint (Positions, Positions, lu);

% Calculate objective function for each wolf
for i=1:size(Positions,1)
            model = elm_kernel_train([train_wine_labels train_wine],Positions(i,1),DIST,Positions(i,2));
        Output2 = elm_kernel_test([train_wine_labels train_wine], model);
        predict_trainlabel=Output2.PredictLabel;
        Fit(i)=1-sum(predict_trainlabel==train_wine_labels)/length(predict_trainlabel);
end

% Personal best fitness and position obtained by each wolf
pBestScore = Fit;
pBest = Positions;

neighbor = zeros(N,N);
Convergence_curve=zeros(1,Max_iteration);

l=0; % Loop counter循环计数器

% Main loop主循环
while l<Max_iteration  % 对迭代次数循环
    for i=1:size(Positions,1)  % 遍历每个狼
        fitness = Fit(i);
        
        % Update Alpha, Beta, and Delta
        if fitness<Alpha_score % 如果目标函数值小于Alpha狼的目标函数值
            Alpha_score=fitness; % 则将Alpha狼的目标函数值更新为最优目标函数值,Update alpha
            Alpha_pos=Positions(i,:); % 同时将Alpha狼的位置更新为最优位置
        end
        
        if fitness>Alpha_score && fitness<Beta_score % 如果目标函数值介于于Alpha狼和Beta狼的目标函数值之间
            Beta_score=fitness; % 则将Beta狼的目标函数值更新为最优目标函数值,Update beta
            Beta_pos=Positions(i,:); % 同时更新Beta狼的位置
        end
        
        if fitness>Alpha_score && fitness>Beta_score && fitness<Delta_score  % 如果目标函数值介于于Beta狼和Delta狼的目标函数值之间
            Delta_score=fitness; % 则将Delta狼的目标函数值更新为最优目标函数值,Update delta
            Delta_pos=Positions(i,:); % 同时更新Delta狼的位置
        end
    end
    
    
    
    a=2-l*((2)/Max_iteration); % 对每一次迭代,计算相应的a值,a decreases linearly fron 2 to 0
    
    % Update the Position of search agents including omegas
    for i=1:size(Positions,1) % 遍历每个狼
        for j=1:size(Positions,2) % 遍历每个维度
            
            % 包围猎物,位置更新
            
            r1=rand(); % r1 is a random number in [0,1]
            r2=rand(); % r2 is a random number in [0,1]
            
            A1=2*a*r1-a; % 计算系数A,Equation (3.3)
            C1=2*r2; % 计算系数C,Equation (3.4)
            
            % Alpha狼位置更新
            D_alpha=abs(C1*Alpha_pos(j)-Positions(i,j)); % Equation (3.5)-part 1
            X1=Alpha_pos(j)-A1*D_alpha; % Equation (3.6)-part 1
            
            r1=rand();
            r2=rand();
            
            A2=2*a*r1-a; % 计算系数A,Equation (3.3)
            C2=2*r2; % 计算系数C,Equation (3.4)
            
            % Beta狼位置更新
            D_beta=abs(C2*Beta_pos(j)-Positions(i,j)); % Equation (3.5)-part 2
            X2=Beta_pos(j)-A2*D_beta; % Equation (3.6)-part 2
            
            r1=rand();
            r2=rand();
            
            A3=2*a*r1-a; % 计算系数A,Equation (3.3)
            C3=2*r2; % 计算系数C,Equation (3.4)
            
            % Delta狼位置更新
            D_delta=abs(C3*Delta_pos(j)-Positions(i,j)); % Equation (3.5)-part 3
            X3=Delta_pos(j)-A3*D_delta; % Equation (3.5)-part 3
            
            % 位置更新
            X_GWO(i,j)=(X1+X2+X3)/3;                        % Equation (3.7)            Positions(i,j)=(X1+X2+X3)/3;% Equation (3.7)
        end
                 X_GWO(i,:) = boundConstraint(X_GWO(i,:), Positions(i,:), lu);
                         % 计算适应度函数值
        model = elm_kernel_train([train_wine_labels train_wine],X_GWO(i,1),DIST,X_GWO(i,2));
        Output2 = elm_kernel_test([train_wine_labels train_wine], model);
        predict_trainlabel=Output2.PredictLabel;
        Fit_GWO(i)=1-sum(predict_trainlabel==train_wine_labels)/length(predict_trainlabel);
    end
    
    %% Calculate the candiadate position Xi-DLH
    radius = pdist2(Positions, X_GWO, 'euclidean');         % Equation (10)
    dist_Position = squareform(pdist(Positions));
    r1 = randperm(N,N);
    
    for t=1:N
        neighbor(t,:) = (dist_Position(t,:)<=radius(t,t));
        [~,Idx] = find(neighbor(t,:)==1);                   % Equation (11)             
        random_Idx_neighbor = randi(size(Idx,2),1,dim);
        
        for d=1:dim
            X_DLH(t,d) = Positions(t,d) + rand .*(Positions(Idx(random_Idx_neighbor(d)),d)...
                - Positions(r1(t),d));                      % Equation (12)
        end
        X_DLH(t,:) = boundConstraint(X_DLH(t,:), Positions(t,:), lu);
                                 % 计算适应度函数值
        model = elm_kernel_train([train_wine_labels train_wine],X_GWO(i,1),DIST,X_GWO(i,2));
        Output2 = elm_kernel_test([train_wine_labels train_wine], model);
        predict_trainlabel=Output2.PredictLabel;
        Fit_DLH(t) =1-sum(predict_trainlabel==train_wine_labels)/length(predict_trainlabel);
    end
    
    %% Selection  
    tmp = Fit_GWO < Fit_DLH;                                % Equation (13)
    tmp_rep = repmat(tmp',1,dim);
    
    tmpFit = tmp .* Fit_GWO + (1-tmp) .* Fit_DLH;
    tmpPositions = tmp_rep .* X_GWO + (1-tmp_rep) .* X_DLH;
    
    %% Updating
    tmp = pBestScore <= tmpFit;                             % Equation (13)
    tmp_rep = repmat(tmp',1,dim);
    
    pBestScore = tmp .* pBestScore + (1-tmp) .* tmpFit;
    pBest = tmp_rep .* pBest + (1-tmp_rep) .* tmpPositions;
    
    Fit = pBestScore;
    Positions = pBest;
    
    %%
    l=l+1;
    neighbor = zeros(N,N);
    Convergence_curve(l)=Alpha_score;
end
bestc=Alpha_pos(1,1);
bestg=Alpha_pos(1,2);
% bestGWOaccuarcy=Alpha_score;
% %% 打印参数选择结果
% disp('打印选择结果');
% str=sprintf('Best Cross Validation Accuracy = %g%%,Best c = %g,Best g = %g',bestGWOaccuarcy*100,bestc,bestg);
% disp(str)
%% 利用最佳的参数进行SVM网络训练
modelbest = elm_kernel_train([train_wine_labels train_wine],bestc,DIST,bestg);
Output2best = elm_kernel_test([test_wine_labels test_wine], modelbest);
predict_label=Output2best.PredictLabel;

% cmd_gwosvm = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
% model_gwosvm = svmtrain(train_wine_labels,train_wine,cmd_gwosvm);
% %% SVM网络预测
% [predict_label,accuracy,preb] = svmpredict(test_wine_labels,test_wine,model_gwosvm);

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]TAO ZHANG (2023). WST based BW(2D)2PCA and KELM for classify EEGs and ECGs.

[2]赵运祥. 基于特征融合与深度神经网络的心电图分类方法研究[D].齐鲁工业大学,2021.DOI:10.27278/d.cnki.gsdqc.2021.000008.

[3]张雄伟.脑电图周期波的分类及临床意义[J].国外医学.神经病学神经外科学分册,1982(06):300-302.DOI:10.16636/j.cnki.jinn.1982.06.007.

🌈4 Matlab代码实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值